[英]StatefulBuilder vs StatefulWidget
What is the difference between StatefulBuilder
and StatefulWidget
? StatefulBuilder
和StatefulWidget
什么区别? 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.