在Flutter中的StatelessWidget中使用TextEditingController是否可行?

13

我不需要使用TextEditingController做很多事情,只是想展示初始文本。而且我觉得创建StatefulWidget太麻烦了。

这是我希望代码看起来的样子。

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

但是我看到的所有教程和博客文章都在StatefulWidget中使用TextEditingController,并且在dispose方法中释放它们。但如果我像上面那样使用,我就无法释放它们。


1
使用无状态小部件可能会导致内存泄漏问题。此外,文档告诉您要处理控制器。无论如何,已经有关于这个问题的开放问题,例如这个 - E.Benedos
这个回答解决了你的问题吗?在Flutter中,在无状态小部件中使用TextFormField非常困难 - J. S.
如果您从构造函数中传递它并从父级处处理它,那么您可以将其处理掉,但我不明白为什么不直接使用StatefulWidget - Tokenyet
@E.Benedos 如果Dart有垃圾回收,那么会有什么内存泄漏问题吗?dispose()方法中实际上除了一些断言之外没有什么内容,所以你们在谈论什么? - mip
@doc 在像DART、C#等托管语言中,垃圾回收通常在资源不再使用时起作用。因此,如果一个资源没有被处理,它就无法被GC清理,从而导致内存泄漏。不过,你是否阅读了Flutter关于TextEditingController的文档? - E.Benedos
1个回答

13
如果你想使用TextEditingController,除非你想避免内存泄漏,否则没有其他方法,必须使用StatefulWidget
但是,如果你认为这种方法存在很多样板代码,可以使用HookWidgetflutter_hooks),它以简单的方式让你访问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,
          ),
        ),
      ),
    );
  }
}

如果Dart进行垃圾回收,会有哪些内存泄漏?而且dispose方法除了一些断言之外真的什么都不做... - mip
@doc 这段内容来自官方文档 https://api.flutter.dev/flutter/widgets/TextEditingController-class.html:"记得在不再需要时处理 TextEditingController。这将确保我们丢弃对象使用的任何资源。" 如果您认为“内存泄漏”不是描述“对象使用的资源”的正确术语,请告诉我,我会编辑答案并更正术语。 - HII
但是什么资源?TextEditingController正在使用哪些资源?您是否知道它的dispose()方法是空的? - mip
1
@doc 您说得对,它是空的(仅包含断言),但无论如何,您的问题都应该问Flutter团队,因为我在我的答案中只是参考了他们的文档。 - HII
4
@doc 难道不是因为 TextEditingController 可以有监听器吗?据我所知,这些监听器不会被垃圾回收器处理。 - goodonion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接