在Flutter的StatelessWidget中使用TextEditingController可以吗?

问题描述 投票:0回答:1

我不需要用TextEditingController做很多事情,但想显示初始文本。而我觉得创建StatefulWidget是太多了.下面是我想要的代码的样子

// In StatelessWidget
TextField(
    controller: TextEditingController(),
)

但我看到的所有教程和博客文章都在StatefulWidget中使用TextEditingController,并在dispose方法中处理它们。但如果我使用像上面这样的方法,我就不能处理它们了

flutter flutter-layout
1个回答
0
投票

如果你想使用 TextEditingController,没有办法,只能用一个 StatefulWidget 如果你想避免内存泄漏。

然而,如果你在这种方法中看到大量的模板,你可以使用 HookWidget (扇形钩),让您可以访问 TextEditingController 在简单的方式,并为您处理它,这里是一个比较。

使用 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();
  }
}

使用 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,
          ),
        ),
      ),
    );
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.