Flutter StatefulBuilder与StatefulWidget

Flutter StatefulBuilder与StatefulWidget,flutter,Flutter,StatefulBuilder和StatefulWidget之间有什么区别?什么时候应该使用一个而不是另一个? 乍一看,它们似乎很相似。 StatefulBuilder定义如下: 一个柏拉图式的小部件,既有状态又调用闭包以获取其子小部件 定义了StatefulBuilder: 具有可变状态的小部件 在build方法中创建小部件树时,通常使用内联。当您需要访问小部件子树中的上下文时,这通常很有用。例如: 你也看到了吗 当需要访问该子树的时使用。这将仅重建StatefulBuilder及其子树 cl

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

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

定义了
StatefulBuilder

具有可变状态的小部件

build
方法中创建小部件树时,通常使用内联。当您需要访问小部件子树中的
上下文时,这通常很有用。例如:
你也看到了吗

当需要访问该子树的时使用。这将仅重建
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);
                });
          }
        }));
  }
}
class\u SomeWidgetState扩展状态{
数据;
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“主页”),
),
正文:StatefulBuilder(生成器:(thisLowerContext,innerSetState){
如果(数据==null){
返回上升按钮(
子项:文本(“加载数据”),
onPressed:()异步{
Scaffold.of(这个较低的上下文)
.showSnackBar(SnackBar(内容:文本(“加载数据…”));
var loadedData=await_loadData();
innerSetState(()=>data=loadedData);
});
}否则{
返回上升按钮(
子项:文本(“重新加载数据”),
onPressed:()异步{
脚手架。的(这个较低的上下文)。显示快捷键(
SnackBar(内容:文本(“重新加载数据…”);
var loadedData=await _reloadData();
innerSetState(()=>data=loadedData);
});
}
}));
}
}

不推荐使用
StatefulBuilder
这种方式。请考虑使用继承小部件或ValueNoToFor。@ R E MrimouSelt感谢您的意见。我发帖的目的是客观地概述两者之间的差异,而不是对此发表看法。
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);
                });
          }
        }));
  }
}