StatefulBuilder和 和有StatefulWidget什么区别?什么时候应该使用一个而不是另一个?
乍一看,它们似乎很相似。
StatefulBuilder被定义为:
一个具有状态并调用闭包以获取其子部件的柏拉图式部件
虽然StatefulBuilder定义:
具有可变状态的小部件
在方法中创建小部件树时,通常使用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)
| 归档时间: |
|
| 查看次数: |
5784 次 |
| 最近记录: |