我实现了一个带有getx状态管理的表单页面,在模拟器上测试时一切正常,但是在实际设备上测试时,我遇到了一个问题,实际上这是一个一页两种类型的作品。
1.对于新用户
1.更新用户
- 对于新用户**,表单文本字段
controller
的初始值为空。在使用unChanged
函数之前,它一直工作正常。顺便说一句,我使用Controller
时不需要onChanged
- 对于新用户**,表单文本字段
- 对于更新用户**,我在构建内部的
Textformfield
controller
上初始化了一个值。这个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",
),
),
],
),
),
),
),
),
);
}
}
3条答案
按热度按时间bqucvtff1#
我也面临着同样的问题。在我的情况下,我想从一个文本字段焦点转移到另一个文本字段。
即使在初始化focusNode为每个字段,我有这个错误:* 排版区域被框架更改。正在重新启动输入法。*
我犯的错误是没有将focusNode粘贴到customTextFormField中,因此textFormField不是由其焦点设置的
如果你还有什么问题,你可以问我更多!
jtjikinw2#
我解决这个错误的方法是:
1.运行
flutter clean
1.运行
flutter pub get
1.卸载应用程序
rt4zxlrg3#
你的问题是:
无需在
onChanged
中设置controller.text