我有一个AppBar按钮,我想读取一个childData列表,并对它做一些事情。
class _ParentState extends State<Parent> {
....
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
actions: <Widget>[
IconButton(icon: Icon(Icons.add),
onPressed: () async {
//Need to access childData data here
print(childData); //currently prints null
},
),
],
),
body: SafeArea(
child: Column(
children: <Widget>[
ChildWidget(),
],
ChildWidget使用了一个StreamBuilder,它循环浏览快照,并在将快照追加到列表之前做一些其他事情。
class ChildWidgetState extends State<ChildWidget> {
....
Widget build(BuildContext context) {
return StreamBuilder<List<DocumentSnapshot>>(
stream: stream,
builder: (context, snapshots) {
if (snapshots.connectionState == ConnectionState.active &&
snapshots.hasData) {
List<DocumentSnapshot> childData = [];
for (var x in snapshots.data) {
//do something else with snapshot data
childData.add(x);
}
我试图使用一个回调函数来通知父部件刷新,但这给出了一个... ... setState() or markNeedsBuild() called during build
错误,因为它在ChildWidget的构建方法中设置了States。我的streambuilder内肯定有数据,因为这在其他地方使用,目前没有问题。
像Provider这样的状态管理包似乎只向子部件提供数据,而不是将它们传回,而且我读到使用全局变量是不受欢迎的。将childData列表添加到像Hive这样的数据库包中,然后在我的ParentWidget中读取,这是否也是一种不好的做法?我不一定要重建父部件--只是在我点击AppBar按钮时读取子部件中的数据。
谢谢,我有一个AppBar按钮,在这个按钮上我可以读取数据。
你可以使用provider来获取父部件中的数据。
Provider(
create: (_) => MyModel(),
child: ParentWidget()
)
在ChildWidget上使用
data=Provider.of<MyModel>(context);
和 MyModel()
可以是数据类,包含你想在父类中获取的数据。appBar
.
现在在steam builder中,你可以使用
data.childData=newData
之后使用
data=Provider.of<MyModel>(context);
在父部件和
data.childData
将有 newdata
你想。