【问题标题】:Is it okay to use TextEditingController in StatelessWidget in Flutter?Flutter 中 StatelessWidget 中使用 TextEditingController 可以吗?
【发布时间】:2020-08-09 01:34:10
【问题描述】:

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

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

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

【问题讨论】:

  • 使用无状态小部件可能会导致内存泄漏问题。 documentation 也告诉您处置控制器。无论如何,this one
  • 如果你从构造函数传递它,然后从父级处理它,你可以处理它,但我很困惑为什么不直接使用StatefulWidget
  • @E.Benedos 如果 Dart 被垃圾回收,会发生什么内存泄漏? dispose() 方法中除了一些断言之外真的什么都没有,所以你们都在说什么?
  • @doc 对托管语言(如 DART、C#、ecc..)的 GC 通常在不再使用资源时有效。因此,如果一个资源没有被释放,它就不能被 GC 清理,从而导致内存泄漏。不管怎样,你读过 Flutter 关于 TextEditingController 的文档吗?

标签: flutter flutter-layout


【解决方案1】:

如果你想使用TextEditingController,除了使用StatefulWidget 来避免内存泄漏之外别无他法。

但是,如果您在这种方法中看到很多样板,您可以使用HookWidget (flutter_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 方法除了很少的断言之外真的什么都不做......
  • @doc 来自api.flutter.dev/flutter/widgets/… 的官方文档:“请记住在不再需要 TextEditingController 时将其丢弃。这将确保我们丢弃对象使用的任何资源。”。如果您发现“内存泄漏”不是描述“对象使用的资源”的正确术语,请告诉我,以便我使用正确的术语编辑答案
  • 但是什么资源呢? TextEditingController 正在使用什么资源?你知道它的dispose() 方法是空的吗?
  • @doc 你是对的,它是空的(只包含断言),但无论如何你的问题应该被问到编写文档的颤振团队,因为我只是在我的回答中提到它们。
  • @doc 不是因为TextEditingController可以有监听器吗?据我所知,垃圾收集器不会处理监听器。
猜你喜欢
  • 2021-06-03
  • 2021-02-06
  • 1970-01-01
  • 2021-10-03
  • 2020-10-26
  • 2021-06-24
  • 1970-01-01
  • 1970-01-01
  • 2021-10-26
相关资源
最近更新 更多