Flutter中StatelessWidget中使用TextEditingController可以吗?

Jae*_*ung 5 flutter flutter-layout

我不需要使用 TextEditingController 做很多事情,但想显示初始文本。我觉得创建 StatefulWidget 太过分了。这就是我想要的代码的样子

// In StatelessWidget
TextField(
    controller: TextEditingController(),
)
Run Code Online (Sandbox Code Playgroud)

但我看到的每一篇教程和博客文章都在 StatefulWidget 中使用 TextEditingController 并在 dispose 方法中处理它们。但如果我像上面那样使用,我就无法处理它们

Hai*_*sen 6

如果你想使用,除了使用 a来避免内存泄漏之外,TextEditingController没有其他办法。StatefulWidget

但是,如果您在这种方法中看到很多样板文件,您可以使用HookWidgetflutter_hooksTextEditingController ),它可以让您以简单的方式访问并为您处理它,这里有一个比较:

使用StatefulWidget

class Test extends StatefulWidget {
  @override
  _TestState createState() => _TestState();
}

class _TestState extends State<Test> {
  TextEditingController controller;
  FocusNode focusNode;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Container(
          width: 200,
          height: 200,
          color: Colors.red,
          child: TextField(
            focusNode: focusNode,
            controller: controller,
          ),
        ),
      ),
    );
  }

  @override
  void initState() {
    controller = TextEditingController();
    focusNode = FocusNode();
    super.initState();
  }

  @override
  void dispose() {
    controller.dispose();
    focusNode.dispose();
    super.dispose();
  }
}
Run Code Online (Sandbox Code Playgroud)

使用HookWidget

class Test extends HookWidget {
  @override
  Widget build(BuildContext context) {
    final focusNode = useFocusNode();
    final controller = useTextEditingController();
      return Scaffold(
      body: Center(
        child: Container(
          width: 200,
          height: 200,
          color: Colors.red,
          child: TextField(
            focusNode: focusNode,
            controller: controller,
          ),
        ),
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

  • @doc不是因为 TextEditingController 可以有监听器吗?据我所知,垃圾收集器不会处理监听器。 (5认同)