StatefulBuilder 与 StatefulWidget

Ale*_*x.F 7 flutter

StatefulBuilder和 和有StatefulWidget什么区别?什么时候应该使用一个而不是另一个?
乍一看,它们似乎很相似。
StatefulBuilder被定义为:

一个具有状态并调用闭包以获取其子部件的柏拉图式部件

虽然StatefulBuilder定义:

具有可变状态的小部件

Ale*_*x.F 7

在方法中创建小部件树时,通常使用Builder内联build。当您需要访问context小部件子树中的a 时,这通常很有用。例如:
另请参阅此SO 问题

 @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"))));
       }));
 }
Run Code Online (Sandbox Code Playgroud)

当您需要访问该子树的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);
                });
          }
        }));
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 不推荐以这种方式使用 StatefulBuilder。考虑改用 InheritedWidgets 或 ValueNotifier。 (3认同)