Skip to content

[Bug report] #138

@199305a

Description

@199305a
20251023-084337.mov

Version

1.26.2

Platforms

iOS

Device Model

IPhone 15 Plus

flutter info

ok

How 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
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions