gpt4 book ai didi

Flutter 在后退按钮上回调原始小部件

转载 作者:IT王子 更新时间:2023-10-29 07:14:21 26 4
gpt4 key购买 nike

我有一个构建 ListView.builder 的 Future Builder,构建器 ListTiles 由另一个具有 ontap 功能的小部件构建。我已经想出如何通过使用后退按钮在最终小部件上运行某些东西,但无法弄清楚如何在后退按钮上调用原始小部件上的某些东西。例如,我需要在用户单击后退按钮时刷新顶级数据,而不仅仅是已经在工作的辅助小部件中的数据。

我希望这是有道理的,任何帮助都会很棒。

更新 这是代码。我正在简化我所展示的内容,因为举一个简单的例子会失去上下文。在下面您可以看到我有一个 FutureBuilder,它返回一个 ListBuilder,它返回一个新的 ChatWidget。这是顶层,当我点击后退按钮时,这个 Future 需要刷新。然而,捕获回调的 onTap 位于 ChatWidget 中。

new Expanded(
child: new RefreshIndicator(
child: new FutureBuilder<List<Map>>(
future: chatlist,
builder: (BuildContext context, AsyncSnapshot<List<Map>> snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.none: return new Text('Waiting to start');
case ConnectionState.waiting: return new Text('Loading...');
default:
if (snapshot.hasError) {
return new Text('Error: ${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。我希望这更有意义并且更容易理解。

最佳答案

是的,你可以做到。无法确切地看到将它放入您的代码中的确切位置,但我会为您提供处理此问题的方法。导航器调用都是 Futures,这意味着您可以在调用方等待它们。似乎您只是缺少将值传递给 .pop 调用。下面是一个例子。

导航到哪里就可以等待结果

var navigationResult = await Navigator.push(
context,
new MaterialPageRoute(
builder: (context) => Page2()));

然后你可以用一个简单的 if 检查 navigationResult。

if(navigationResult == 'rerun_future') {
uploadFiles(); // Perform your custom functionality here.
}

您将信息传回的方式是,当您执行 pop 调用(返回导航)时,您将在其中传递值“rerun_future”。

Navigator.of(context).pop('rerun_future') 

此外,如果您还想将此功能添加到后退按钮,您应该使用 WillPopScope 包围您的 Scaffold,将 false 返回到 onWillPop 并向执行自定义 pop 调用的 appBar 提供前导项。以下示例来自 this post

@override
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'), //<----- pass value here too
),
),
),
);
}

关于Flutter 在后退按钮上回调原始小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48644903/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com