Flutter : TextFormField 真机键盘问题

我用 getx 状态管理实现了一个表单页面。当我在模拟器上测试它时,一切都很好。但是当我使用真实设备进行测试时,我遇到了一个问题。实际上,这是两种类型作品的一页。

  1. 对于新用户
    2.更新用户

对于新用户,表单文本字段 controller 初始值为空。在使用 unChanged 函数之前它总是可以正常工作。顺便说一句,我使用 onChanged 时不需要 Controller

对于更新用户,我在构建内部的 Textformfield controller 上初始化了一个值。这个 Textformfield 在模拟器上运行良好。但是我在真实设备上运行它,然后单击 TextFormField,我的光标会自动移动到 first 。当我在输入 value 后没有专注 TextformField 时,我的最后一个值消失了。它向我展示了这种类型的错误:

W/IInputConnectionWrapper(30962): getCursorCapsMode on inactive InputConnection
W/IInputConnectionWrapper(30962): getExtractedText on inactive InputConnection
I/TextInputPlugin(30962): Composing region changed by the framework. Restarting the input method.
W/IInputConnectionWrapper(30962): getTextBeforeCursor on inactive InputConnection
W/IInputConnectionWrapper(30962): getTextAfterCursor on inactive InputConnection
W/IInputConnectionWrapper(30962): getTextBeforeCursor on inactive InputConnection

> 这是我的控制器页面

class UserFormController extends GetxController {
  RxBool isNewUser = false.obs;

  final GlobalKey<FormState> formKey = GlobalKey<FormState>();
  late TextEditingController nameCtrl, jobCtrl;

  @override
  void onInit() {
    nameCtrl = TextEditingController();
    jobCtrl = TextEditingController();
    super.onInit();
  }

  @override
  void onClose() {
    nameCtrl.dispose();
    jobCtrl.dispose();
    super.onClose();
  }
}

> 这是我的查看页面

class UserFormScreen extends GetView<UserFormController> {
  final bool isNewUser;
  final Data? user;
  const UserFormScreen({Key? key, required this.isNewUser, this.user})
      : super(key: key);
  @override
  Widget build(BuildContext context) {
    double _width = MediaQuery.of(context).size.width;
    double _height = MediaQuery.of(context).size.height;
    final UserFormController formCtrl = Get.put(UserFormController());
    if (!isNewUser) {
      formCtrl.nameCtrl.text = "${user!.firstName} ${user!.lastName}";
    }
    return Scaffold(
      appBar: AppBar(
        title: Text(isNewUser ? "Create New User" : "Update User"),
      ),
      body: GestureDetector(
        behavior: HitTestBehavior.opaque,
        onTap: () {
          FocusManager.instance.primaryFocus?.unfocus();
        },
        child: SizedBox(
          height: _height,
          width: _width,
          child: Form(
            key: formCtrl.formKey,
            child: SingleChildScrollView(
              child: Column(
                children: [
                  const SizedBox(
                    height: 40,
                  ),
                  CustomTextField(
                    labelText: "Name",
                    hintText: "ex. Robert",
                    controller: formCtrl.nameCtrl,
                    validator: (value) {
                      return formCtrl.validateName(value!);
                    },
                    onChanged: (val) {
                      formCtrl.nameCtrl.text = val;
                      formCtrl.nameCtrl.selection = TextSelection.fromPosition(
                          TextPosition(offset: formCtrl.nameCtrl.text.length));
                    },
                  ),
                  CustomTextField(
                    labelText: "Job",
                    hintText: "ex. Manager",
                    controller: formCtrl.jobCtrl,
                    validator: (value) {},
                  ),
                  ElevatedButton(
                    onPressed: () {
                      FocusManager.instance.primaryFocus?.unfocus();

                      if (validateAndSave(formCtrl.formKey)) {
                        if (isNewUser) {
                          //create new

                          formCtrl.createNewUser();
                        } else {
                          //update
                          formCtrl.updateUser(user!.id);
                        }
                      }
                    },
                    child: Text(
                      isNewUser ? "Create" : "Update",
                    ),
                  ),
                ],
              ),
            ),
          ),
        ),
      ),
    );
  }
}
stack overflow Flutter : TextFormField real device keyboard problem ( Error: Composing region changed by the framework. Restarting the input method )
原文答案

答案:

作者头像

我以这种方式解决了这个错误:

  1. 运行 flutter clean
  2. 运行 flutter pub get
    3.卸载应用
作者头像

我遇到了同样的问题。在我的情况下,我想从一个文本字段焦点转移到另一个文本字段。

即使在每个字段的初始化 focusNode 中,我也有这个错误: Composing region changed by the framework. Restarting the input method.

我犯的错误是我没有在我的customTextFormField中粘贴focusNode,所以textFormFields不是由他们的焦点设置的

如果还有什么问题可以再问我!