StatefulBuilder 与 StatefulWidget

Posted

技术标签:

【中文标题】StatefulBuilder 与 StatefulWidget【英文标题】:StatefulBuilder vs StatefulWidget 【发布时间】:2019-10-20 02:29:19 【问题描述】:

StatefulBuilderStatefulWidget 有什么区别?什么时候应该使用一个来代替另一个? 乍一看,它们看起来很相似。StatefulBuilder 已定义:

一个既具有状态又调用闭包来获取其子小部件的柏拉图式小部件

虽然StatefulBuilder 已定义:

具有可变状态的小部件

【问题讨论】:

【参考方案1】:

build 方法中创建小部件树时,通常使用Builder 内联。当您需要访问小部件子树中的 context 时,这通常很有帮助。例如:另见SO question

 @override
 Widget build(BuildContext context) 
   return Scaffold(
       appBar: AppBar(
         title: Text("Home"),
       ),
       body: Builder(builder: (thisLowerContext) 
         return RaisedButton(
             onPressed: () => Scaffold.of(thisLowerContext)
                 .showSnackBar(SnackBar(content: Text("button was clicked"))));
       ));
 

当您需要访问该子树的setState 时,请使用StatefulBuilder。这将仅重建 StatefulBuilder 及其子树。

class _SomeWidgetState extends State<HomeScreen> 
  Data data;

  @override
  Widget build(BuildContext context) 
    return Scaffold(
        appBar: AppBar(
          title: Text("Home"),
        ),
        body: StatefulBuilder(builder: (thisLowerContext, innerSetState) 
          if (data == null) 
            return RaisedButton(
                child: Text("Load data"),
                onPressed: () async 
                  Scaffold.of(thisLowerContext)
                      .showSnackBar(SnackBar(content: Text("Loading data...")));
                  var loadedData = await _loadData();
                  innerSetState(() => data = loadedData);
                );
           else 
            return RaisedButton(
                child: Text("Reload data"),
                onPressed: () async 
                  Scaffold.of(thisLowerContext).showSnackBar(
                      SnackBar(content: Text("Reloading data...")));
                  var loadedData = await _reloadData();
                  innerSetState(() => data = loadedData);
                );
          
        ));
  

【讨论】:

不太推荐使用StatefulBuilder这种方式。考虑改用 InheritedWidgets 或 ValueNotifier。

以上是关于StatefulBuilder 与 StatefulWidget的主要内容,如果未能解决你的问题,请参考以下文章

Flutter StatefulBuilder 用来实现局部数据刷新

Kubernetes学习总结(15)—— Kubernetes 实战之部署 Mysql 集群

Flutter 开发笔记

Flutter 实现局部刷新 StreamBuilder 实例详解

Flutter 实现局部刷新 StreamBuilder 实例详解

LDAP 与 MYSQL .. JA-SIG CAS 与 LDAP 与 CAS 与 MySQL