在回退按钮上,Flutter回调到原始小部件。
在回退按钮上,Flutter回调到原始小部件。
我有一个Future Builder,它构建了一个ListView.builder,该构建器的ListTiles是由另一个具有ontap功能的小部件构建的。我已经找到了如何在最终小部件上运行某些内容,使用返回按钮,但是还没有找到如何在返回按钮上调用原始小部件上的内容。例如,当用户点击返回按钮时,我需要刷新顶层数据,而不仅仅是已经在辅助小部件中工作的数据。
希望这样能够理解,任何帮助都将是很好的。
更新 这是代码。我正在简化我展示的内容,因为制作一个简单的示例会失去上下文。下面你可以看到我有一个返回ListBuilder的FutureBuilder,该ListBuilder返回一个新的ChatWidget。这是顶层,当我点击返回按钮时,这个Future需要刷新。但是,用于捕获回调的onTap是在ChatWidget中。
new Expanded(
child: new RefreshIndicator(
child: new FutureBuilder>(
future: chatlist,
builder: (BuildContext context, AsyncSnapshot> snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.none: return new Text('等待开始');
case ConnectionState.waiting: return new Text('加载中...');
default:
if (snapshot.hasError) {
return new Text('错误: ${snapshot.error}');
} else {
return new ListView.builder(
itemBuilder: (context, index) {
ChatServerList mychat = new ChatServerList(snapshot.data[index]['msgkey'],snapshot.data[index]['refid'],snapshot.data[index]['referralname'], snapshot.data[index]['oid'],snapshot.data[index]['sendname'],snapshot.data[index]['pid'],snapshot.data[index]['receivename'],snapshot.data[index]['pgrpid'],snapshot.data[index]['prid'],snapshot.data[index]['message'],);
bool isgroup = true;
if (mychat.grpid == 0) {
isgroup = false;
}
return new ChatWidget(mychat: mychat,threaded: threaded, isgroup: isgroup);
},
itemCount: snapshot.data.length,
);
}
}
},
),
onRefresh: _onRefresh
),
)
这是在ChatWidget中构建的,你可以注意到_onTap:
new MyListTile(
leading: new CircleAvatar(
child: _chatAvatar(),
//child: !isgroup ? _indMsg() : _grpMsg(), radius: 18.0,
),
//subtitle: new Text(widget.mychat.oname),
title: new Text(widget.mychat.referralname),
trailing: new Text(widget.mychat.oname, textAlign: TextAlign.right,),
//isThreeLine: true,
//onTap: doTap(threaded),
onTap: _onTap,
onLongPress: _doArchive,
),
new MyListTile(
leading: new Text(' '),
title: new Text(submymessage, textAlign: TextAlign.left,
style: new TextStyle(fontSize: 15.0,
color: Colors.grey, fontStyle: FontStyle.italic),),
trailing: _unreadBabdge(),
onTap: _onTap,
onLongPress: _doArchive,
),
这个_onTap在下面,它有处理返回按钮的代码。
_onTap() async {
ChatDB.instance.updateRead(widget.mychat.msgkey);
if (threaded) {
//TODO
} else {
Route route = new MaterialPageRoute(
settings: new RouteSettings(name: "/ChatServerDivided"),
builder: (BuildContext context) => new ChatServerDivided(mychat: widget.mychat, title: "Chat Messages",),
);
//Navigator.of(context).push(route);
var nav = await Navigator.of(context).push(route);
if(nav==true||nav==null){
unread = ChatDB.instance.getUnread(widget.mychat.msgkey);
}
}
}
所以我想找到的是,这段代码是否可以以某种方式与原始小部件进行通信,以便我可以再次运行原始的Future。希望这样更容易理解。
问题的原因是在Flutter中,当使用Navigator进行页面导航时,可以通过await关键字等待页面返回的结果。然而,在返回结果时,可能会遇到无法将结果传递回到调用页面的问题。
解决方法是在导航到新页面时,使用await关键字等待结果,并在调用页面使用条件语句来检查返回结果。然后,在返回页面时,通过调用pop方法并传递结果值来将结果传递回调用页面。
另外,如果想要在按下返回按钮时也执行相同的功能,可以使用WillPopScope包裹Scaffold,并在onWillPop回调函数中返回false,然后在leading属性中执行自定义的pop操作。
下面是一个示例代码,演示了如何在Flutter中实现此功能:
var navigationResult = await Navigator.push(
context,
new MaterialPageRoute(
builder: (context) => Page2()));
if(navigationResult == 'rerun_future') {
uploadFiles(); // 在这里执行自定义功能
}
...
Widget build(BuildContext context) {
return new WillPopScope(
onWillPop: () async => false,
child: new Scaffold(
appBar: new AppBar(
title: new Text("data"),
leading: new IconButton(
icon: new Icon(Icons.ac_unit),
onPressed: () => Navigator.of(context).pop('rerun_future'),
),
),
// 其他部分的Widget
),
);
}
通过以上方法,可以实现在Flutter中回调到原始页面的功能。