flutter 抖动:TextFormField真实设备键盘问题(错误:排版区域被框架改变,重新启动输入法)

fsi0uk1n  于 2023-02-05  发布在  Flutter
关注(0)|答案(3)|浏览(232)

我实现了一个带有getx状态管理的表单页面,在模拟器上测试时一切正常,但是在实际设备上测试时,我遇到了一个问题,实际上这是一个一页两种类型的作品。
1.对于新用户
1.更新用户

    • 对于新用户**,表单文本字段controller的初始值为空。在使用unChanged函数之前,它一直工作正常。顺便说一句,我使用Controller时不需要onChanged
    • 对于更新用户**,我在构建内部的Textformfieldcontroller上初始化了一个值。这个Textformfield在模拟器上工作正常。但是我在实际设备上运行它,点击TextFormField,我的光标自动移动到第一个。当我在键入值后没有聚焦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",
                    ),
                  ),
                ],
              ),
            ),
          ),
        ),
      ),
    );
  }
}
bqucvtff

bqucvtff1#

我也面临着同样的问题。在我的情况下,我想从一个文本字段焦点转移到另一个文本字段。
即使在初始化focusNode为每个字段,我有这个错误:* 排版区域被框架更改。正在重新启动输入法。*
我犯的错误是没有将focusNode粘贴到customTextFormField中,因此textFormField不是由其焦点设置的
如果你还有什么问题,你可以问我更多!

jtjikinw

jtjikinw2#

我解决这个错误的方法是:
1.运行flutter clean
1.运行flutter pub get
1.卸载应用程序

rt4zxlrg

rt4zxlrg3#

你的问题是:

formCtrl.nameCtrl.text = val;

无需在onChanged中设置controller.text

相关问题