【发布时间】:2019-08-28 04:48:09
【问题描述】:
我创建了一个 PostUpdaterWidget 扩展 StatelessWidget,它使用 TextEditingControllers 来测试 Bloc 模式的实现。
final _usernameController = TextEditingController();
final _contentController = TextEditingController();
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
TextField(
controller: _usernameController,
decoration: InputDecoration(hintText: "Post Username"),
),
TextField(
controller: _contentController,
decoration: InputDecoration(hintText: "Post Content"),
),
Container(
height: 16,
),
RaisedButton(
child: Text("Update Post"),
onPressed: () => _updatePost(context),
)
],
);
}
_updatePost(BuildContext context) {
print("Processing Post Update");
String username = _usernameController.text.trim();
String content = _contentController.text.trim();
Post post = new Post();
post.id = id;
post.username = username;
post.content = content;
id += 1;
print("Dispatching Post Update");
BlocProvider.of<PostBloc>(context).updatePost(post);
}
我在很多例子中看到控制器应该被丢弃。但是,在StatelessWidget 中没有override dispose 函数的方法。
我曾想过创建自己的 dispose 函数来处理使用的控制器,并为将使用此小部件的人创建此小部件的变量,以便我可以调用 dispose 函数。
但我想先知道我是否真的需要这样做,或者这个 StatelessWidget 实际上是自己处理的。
我应该继续我的想法吗?或者就这样吧,因为它可能会自行处理这些控制器,所以我不应该担心内存泄漏。
【问题讨论】:
-
由于无状态小部件不包含状态,因此没有这样的方法。我认为最好将有状态的小部件与这样的控制器一起使用。您应该阅读以下内容:docs.flutter.io/flutter/widgets/StatelessWidget-class.html
-
@Blasanka 我认为它也更安全,但它是否真的必须正确处理,或者
StatelessWidget会在垃圾收集时自行处理? -
@NicolasDion-Bouchard - 我认为这里存在循环引用的危险。当您设置 TextEditing 控制器时。它将引用其他数据对象。垃圾收集不会发生在这些对象上,因为它们仍然持有对其他东西的引用。这可能会导致内存泄漏。我只想转换为有状态的小部件并明确处理所有内容。 AAMOF,我只是在自己的项目中这样做了。
标签: dart flutter statelesswidget