首页 > 解决方案 > 在 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);

我的意思是在构建方法中创建这个控制器是正确的,如果我这样做它可以工作,但我认为这可能不是做这件事的最佳方式,也因为我知道控制器也应该被处理...... .

我真的需要一些帮助来澄清这一点。谢谢

标签: flutter

解决方案


您认为在构建方法中这样做并不理想是正确的。您对 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 类并在那里执行通常会使有状态小部件混乱的所有事情。


推荐阅读