flutter - 在 buildMethod 中分配 TextEditingController 的值
问题描述
我对创建 TexEditingController 的正确方法有一些疑问;
假设我想创建一个带有固定文本的控制器,所以我可以这样做:
TextEditingController bioEditorController = new TextEditingController(text:"dummy");
现在我的问题是:
如果我使用有状态的小部件,我可以通过执行以下操作创建此控制器广告分配初始文本:
TextEditingController bioEditorController;
@override
void initState() {
bioEditorController = new TextEditingController(text: "dummy");
super.initState();
}
但是如果我没有使用有状态的小部件,那么做这样的事情是否正确:
@override
Widget build(BuildContext context) {
TextEditingController bioEditorController =
new TextEditingController(text: controller.profile.value.bio);
我的意思是在构建方法中创建这个控制器是正确的,如果我这样做它可以工作,但我认为这可能不是做这件事的最佳方式,也因为我知道控制器也应该被处理...... .
我真的需要一些帮助来澄清这一点。谢谢
解决方案
您认为在构建方法中这样做并不理想是正确的。您对 build 方法运行次数的控制比initState
.
虽然在处理 TextEditingControllers (或hooks)时通常需要一个有状态的小部件,但如果你使用GetX状态管理它绝对没问题,并且宁愿不要仅仅因为你需要一个有状态的小部件而烦恼TextEditingController
.
TextEditingController
这种方式的另一个好处是可以很容易地从应用程序的其他任何地方访问价值。
这是一个简单的例子。这是一个你可以保留所有TextEditingControllers
.
class TextController extends GetxController {
RxString textfieldString = ''.obs; // observable String
TextEditingController textController;
// this onInit replaces initState of a stateful widget
@override
onInit() {
super.onInit();
textController = TextEditingController(text: 'dummy');
// adding a listener that automatically updates the textfieldString with the textfield value
textController.addListener(() {
textfieldString.value = textController.text;
debugPrint(textfieldString.value);
});
}
}
在您实际使用控制器之前或任何时候初始化控制器。这是onInit
从该类调用的时间。
Get.put(TextController()).textController;
这是Page1
一个已经初始化的无状态小部件TextEditingController
class Page1 extends StatelessWidget {
@override
Widget build(BuildContext context) {
final controller = Get.find<TextController>(); // finding same initialized controller
return Scaffold(
body: Center(
child: TextFormField(
controller: controller.textController, // using TextEditingConroller from GetX class
),
),
);
}
}
这是一个不同页面上的文本小部件的快速示例,该小部件会在用户输入时自动更新TextFormField
class Page2 extends StatelessWidget {
@override
Widget build(BuildContext context) {
final controller =
Get.find<TextController>(); // finding same instance of controller
return Scaffold(
body: Center(
// this Obx widget rebuilds based on any updates
child: Obx(
() => Text(controller.textfieldString.value),
),
),
);
}
}
因此,无论您在应用程序中的哪个位置,都可以访问它的值,TextFormField
而不必使用有状态的小部件。不使用GetxController
时将从内存中删除。
在这一点上,我唯一需要使用有状态小部件的时候是我需要AutomaticKeepAliveClientMixin
.
甚至动画也可以通过 GetX 中的无状态小部件完成,方法是添加SingleGetTickerProviderMixin
到 Getx 类并在那里执行通常会使有状态小部件混乱的所有事情。
推荐阅读
- sql - 如何回填 Sybase 中的缺失值(外部应用和派生表在 MSSQL 中有效,但在 Sybase 中无效)
- linux - VNC中的鼠标光标跳跃
- switch-statement - 匹配/大小写不条件
- html - CSS 网格未按预期在 Edge/Chrome 中呈现视频
- flutter - 为什么当我在 Flutter for Web 中更新实时数据库中的某个字段时我的数据被删除
- java - java.lang.IndexOutOfBoundsException :尝试从 RecyclerView 中删除 URL 损坏的项目
- javascript - 无法加载 GLTF 对象
- php - 如何合并具有相同键的关联数组
- android - 如何将填充从一个文本基线应用到另一个?
- vue.js - 将自定义数据属性添加到 Vuetify v-select 选项