简体   繁体   English

StatefulBuilder与StatefulWidget

[英]StatefulBuilder vs StatefulWidget

What is the difference between StatefulBuilder and StatefulWidget ? StatefulBuilderStatefulWidget什么区别? When one should be used instead of the other? 什么时候应该使用另一个代替?
At first glance they seem similar. 乍一看,它们似乎很相似。
StatefulBuilder is defined: StatefulBuilder定义为:

A platonic widget that both has state and calls a closure to obtain its child widget 具有状态并调用闭包以获取其子小部件的柏拉图小部件

While StatefulBuilder is defined: 定义了StatefulBuilder

A widget that has mutable state 具有可变状态的小部件

In general use Builder inline when creating your widget tree in a build method. 通常,在build方法中创建窗口小部件树时,请使用内联Builder This is usually helpful when you need access to a context in your widgets subtree. 当您需要访问小部件子树中的context时,这通常很有用。 for example: 例如:
Also see this 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"))));
       }));
 }

Use StatefulBuilder when you need access to the setState of that subtree. 当需要访问该子树的setState时,请使用StatefulBuilder This will rebuild only the StatefulBuilder with its subtree. 这将仅重建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);
                });
          }
        }));
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM