如何发现 TextField 编辑被取消/键盘折叠/焦点丢失

Posted

技术标签:

【中文标题】如何发现 TextField 编辑被取消/键盘折叠/焦点丢失【英文标题】:How to discover TextField editing being cancelled / keyboard collaped / focus lost 【发布时间】:2022-01-02 04:52:32 【问题描述】:

下面的代码显示了 2 个文本字段。这是一个剥离的例子,只需忽略诸如 TextEditingController 之类的东西没有被处理。

如果用户编辑其中一个文本字段,并在键盘上按“完成”,则会将新值发送到肘位(已保存),一切都很好。

但是,当用户在编辑过程中单击另一个 TextField 或折叠键盘时,他的状态会非常不一致。 TextField - 他正在编辑的那个 - 显示了没有保存的值,而且他没有意识到这一点。

那么我该如何保存该值,或将其恢复为原始值,或者当用户只是没有确认更改并停止编辑时执行任何操作?

我尝试弄乱文本控制器、表单、TextFieldTextFormField - 不走运。我不想要 Save 按钮,而且似乎 onSubmitted 出于某种原因在那里,但我想念 onCancelled 或某事。

更新:我更改了代码以引入两个字段之间的一些交互,这更符合我的真实场景。还添加了我得到的视频。

testpage.dart:

import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

import 'some_cubit.dart';

class TestPage extends StatefulWidget 
  const TestPage(Key? key) : super(key: key);

  @override
  _TestPageState createState() => _TestPageState();


class _TestPageState extends State<TestPage> 
  @override
  Widget build(BuildContext context) 
    return Scaffold(
      appBar: AppBar(title: const Text('Test')),
      body: BlocProvider(
        create: (context) => SomeCubit(),
        child: BlocBuilder<SomeCubit, SomeState>(
          builder: (context, state) 
            return Column(
              children: [
                Flexible(
                  child: TextField(
                    controller:
                        TextEditingController(text: state.min.toString()),
                    keyboardType: TextInputType.number,
                    onSubmitted: (s) 
                      BlocProvider.of<SomeCubit>(context).updateMin(s);
                    ,
                  ),
                ),
                Flexible(
                  child: TextField(
                    controller:
                        TextEditingController(text: state.max.toString()),
                    keyboardType: TextInputType.number,
                    onSubmitted: (s) 
                      BlocProvider.of<SomeCubit>(context).updateMax(s);
                    ,
                  ),
                ),
              ],
            );
          ,
        ),
      ),
    );
  

some_cubit.dart

import 'dart:math';

import 'package:bloc/bloc.dart';

class SomeCubit extends Cubit<SomeState> 
  SomeCubit() : super(SomeState(0, 10));

  void updateMin(String str) 
    final num = int.tryParse(str) ?? 0;
    emit(SomeState(num, max(num, state.max)));
  

  void updateMax(String str) 
    final num = int.tryParse(str) ?? 0;
    emit(SomeState(min(num, state.min), num));
  


class SomeState 
  final int min;
  final int max;

  SomeState(this.min, this.max);

这就是我得到的。一旦我停止点击键盘上的“完成”,而是直接在文本框之间切换,一切都处于不一致的状态。

【问题讨论】:

要知道如何在 TextFormField ***.com/questions/70024603/… 中使用焦点,只需查看答案 【参考方案1】:

textField 具有onChanged 函数,每次用户添加字符时都会触发该函数

【讨论】:

是的,但它有什么帮助呢? 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于如何发现 TextField 编辑被取消/键盘折叠/焦点丢失的主要内容,如果未能解决你的问题,请参考以下文章

当键盘挡住它时如何将textField带入视野?

任务栏总是显示所有图标无法折叠隐藏

Swift:无法让 UITextField 关闭键盘

iOS开发小技巧--TextField的细节处理,键盘中return键的处理

如果解析失败,取消表格单元格编辑的规范方法

受用一生的 PyCharm 技巧大全