Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 无状态小部件是否自行处理?_Dart_Flutter_Statelesswidget - Fatal编程技术网

Dart 无状态小部件是否自行处理?

Dart 无状态小部件是否自行处理?,dart,flutter,statelesswidget,Dart,Flutter,Statelesswidget,我创建了一个postPDaterWidget扩展StatelessWidget,它利用TextEditingControllers来测试Bloc模式的实现 final _usernameController = TextEditingController(); final _contentController = TextEditingController(); @override Widget build(BuildContext context) { return Co

我创建了一个
postPDaterWidget
扩展
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);
  }
final\u usernameController=TextEditingController();
final _contentController=TextEditingController();
@凌驾
小部件构建(构建上下文){
返回列(
crossAxisAlignment:crossAxisAlignment.center,
儿童:[
文本字段(
控制器:\ u usernameController,
装饰:输入装饰(hintText:“Post用户名”),
),
文本字段(
控制器:\u contentController,
装饰:输入装饰(hintText:“帖子内容”),
),
容器(
身高:16,
),
升起的按钮(
子项:文本(“更新帖子”),
onPressed:()=>\u updatePost(上下文),
)
],
);
}
_updatePost(构建上下文){
打印(“处理后更新”);
字符串用户名=_usernameController.text.trim();
字符串内容=_contentController.text.trim();
Post Post=新Post();
post.id=id;
post.username=用户名;
post.content=内容;
id+=1;
打印(“派送站更新”);
BlocProvider.of(context.updatePost);
}
我在很多例子中都看到了应该配置控制器。但是,在
无状态小部件
中,没有方法覆盖
一个
dispose
函数

我已经考虑过创建自己的dispose函数来处理所使用的控制器,并为那些将使用这个小部件的人创建这个小部件的一个变量,以便我可以调用dispose函数

但我首先想知道我是否真的需要这样做,或者这个无状态小部件实际上是自己处理的

我应该继续我的想法吗?或者干脆别管它,因为它可能会自己处理这些控制器,这样我就不必担心内存泄漏。

似乎表明当
无状态小部件
被销毁时,对象不会被处理,至少不会立即处理。在任何情况下,当您使用
textededitingcontroller
(或维护任何可变状态)时,都应该使用
StatefulWidget
,并将状态保持在
state
类中。
State
类有一个可以使用的
dispose()
方法(正如您在问题中提到的)


否则,如果使用
无状态小部件
,则每次重建UI时都会丢失状态
StatefulWidgets
在重建过程中保持其状态,因为状态在
state
类中,而不是在widget中。另请参见。

因为无状态小部件不包含状态,所以没有类似的方法。我认为最好将有状态小部件与这样的控制器一起使用。您应该阅读以下内容:@Blasanka我认为它也更安全,但它是否真的必须进行适当的处理,还是垃圾收集时,
无状态小部件会自己进行处理?@NicolasDion Bouchard-我认为这里存在循环引用的危险。当您设置文本编辑控制器时。它将引用其他数据对象。垃圾收集不会在这些对象上发生,因为它们仍然持有对其他对象的引用。这可能会导致内存泄漏。我只是转换成一个有状态的小部件,并显式地处理所有内容。AAMOF,我只是在我自己的项目中这样做的。假设你在一个无状态小部件中订阅了一个侦听器,那么每次重建UI时都会订阅一个新的侦听器吗?@BrandonPillay,我不太确定。听起来是个有趣的问题。如果你用一个代码示例作为一个新的SO问题问这个问题,你能在这里放一个链接吗?