-
-
Notifications
You must be signed in to change notification settings - Fork 67
Closed
Description
20251023-084337.mov
Version
1.26.2
Platforms
iOS
Device Model
IPhone 15 Plus
flutter info
okHow to reproduce?
scrollview_observer iOS26里面有Textfield 编辑的时候会光标强制定位到导航栏上面
Logs
Flutter 3.35.6 • channel stable • https://gitee.com/mirrors/Flutter.git
Example code (optional)
Scaffold(
appBar: AppBar(
actions: [
// Padding(
// padding: const EdgeInsets.only(right: 8.0),
// child: IconButton(
// style: IconButton.styleFrom(),
// onPressed: () {
// _transcriptListProvider.loadInitialData();
// },
// icon: const Icon(
// IconFontUtil.revoke,
// size: 19,
// )),
// ),
Padding(
padding: const EdgeInsets.only(right: 20.0),
child: ElevatedButton(
style: ElevatedButton.styleFrom(
minimumSize: Size.zero,
padding:
const EdgeInsets.symmetric(horizontal: 12, vertical: 4),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(20),
),
),
onPressed: _onSave,
child: Text(LocaleKeys.save.tr())),
),
//
],
),
body: Column(
children: [
Expanded(
child: UniversalRefresh<TranscriptItemModel>(
onLoadMore: _transcriptListProvider.onLoadMore,
isLoading: _transcriptListProvider.isLoading,
hasMore: false,
itemBuilder: (context) {
return ListViewObserver(
controller: observerController,
child: ListView.separated(
controller: scrollController,
itemBuilder: (context, index) {
return TranscriptEditItemWidget(
transcriptItemModel:
_transcriptListProvider.dataList[index],
isSelected: widget.index == index);
},
separatorBuilder: (context, index) =>
const SizedBox(
height: 8,
),
itemCount:
_transcriptListProvider.dataList.length)
);
}),
),
// Visibility(
// visible: widget.audioUrl?.isNotEmpty == true,
// child: PlayerEasyWidget(controller: _playerController))
],
),
),
class TranscriptEditItemWidget extends StatelessWidget {
const TranscriptEditItemWidget(
{super.key, required this.transcriptItemModel, required this.isSelected});
final TranscriptItemModel transcriptItemModel;
final bool isSelected;
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () {
KeyboardUtil.unfocus();
},
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Text(
transcriptItemModel.speaker ?? '',
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
color: transcriptItemModel.color,
fontWeight: FontWeight.w500),
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 8),
child: Text(
transcriptItemModel.startSecString,
style: Theme.of(context)
.textTheme
.labelMedium
?.copyWith(color: ColorConfig.textDisable),
),
),
],
),
Padding(
padding: const EdgeInsets.only(top: 4.0),
child: _TextFieldWidget(
content: transcriptItemModel.content,
isSelected: isSelected,
onChanged: (value) {
transcriptItemModel.isEdited = true;
transcriptItemModel.content = value;
},
))
],
),
),
);
}
}
class _TextFieldWidget extends StatefulWidget {
const _TextFieldWidget(
{this.content, this.onChanged, required this.isSelected});
final String? content;
final void Function(String)? onChanged;
final bool isSelected;
@override
State<_TextFieldWidget> createState() => _TextFieldWidgetState();
}
class _TextFieldWidgetState extends State<_TextFieldWidget> {
late final TextEditingController _controller =
TextEditingController(text: widget.content);
@override
void didUpdateWidget(covariant _TextFieldWidget oldWidget) {
if (widget.content != oldWidget.content) {
_controller.text = widget.content ?? '';
LogUtil.d('didUpdateWidget ---- ${widget.content}');
}
super.didUpdateWidget(oldWidget);
}
@override
Widget build(BuildContext context) {
return Theme(
data: Theme.of(context).copyWith(
brightness: Brightness.dark,
),
child: TextField(
controller: _controller,
minLines: 1,
maxLines: null,
style: Theme.of(context).textTheme.bodyLarge?.copyWith(
color:
widget.isSelected ? ColorConfig.primary : ColorConfig.title),
contextMenuBuilder:
(BuildContext context, EditableTextState editableTextState) {
return CupertinoTheme(
data: CupertinoTheme.of(context).copyWith(
brightness: Brightness.dark,
),
child: AdaptiveTextSelectionToolbar.editableText(
editableTextState: editableTextState),
);
},
// 设置为 null 以便根据内容自动增长
decoration: const InputDecoration(
focusColor: ColorConfig.primary,
border: InputBorder.none,
enabledBorder: InputBorder.none,
errorBorder: InputBorder.none,
focusedBorder: InputBorder.none,
focusedErrorBorder: InputBorder.none,
),
onChanged: widget.onChanged,
));
}
}
Contact
No response
Metadata
Metadata
Assignees
Labels
No labels