【发布时间】:2019-12-05 22:35:14
【问题描述】:
我有一个ListView,它代表一个对话列表(收件箱)。当用户点击列表项(对话)时,我们以对话 id 作为参数推送到命名路由。
在新窗口中,我们使用 FutureBuilder 根据传递的参数(对话 id)获取对话消息(http 请求)。
一切都很好,除了当用户单击后退按钮时再次调用 build 方法并在窗口开始关闭时发出新的 http 请求。
我知道不建议在构建方法中创建 Future,但在这种情况下,获取传递的参数的最佳方法是什么。
未来一定是更早获得的,例如在 State.initState、State.didUpdateConfig 或 State.didChangeDependencies 期间。在构造 FutureBuilder 时,不能在 State.build 或 StatelessWidget.build 方法调用期间创建它。如果 Future 与 FutureBuilder 是同时创建的,那么每次 FutureBuilder 的 parent 重建时,异步任务都会重新启动。
这是我的简化代码:
class Messages extends StatefulWidget {
@override
_MessagesState createState() => _MessagesState();
}
class _MessagesState extends State<Messages> {
@override
Widget build(BuildContext context) {
final String conversationID = ModalRoute.of(context).settings.arguments;
print("Conv: $conversationID");
final messages = Api.getMessages(conversationID);
return Scaffold(
appBar: AppBar(
title: Text("Messages"),
),
body: FutureBuilder<dynamic>(
future: messages,
builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.none:
case ConnectionState.active:
case ConnectionState.waiting:
return Center(child: CircularProgressIndicator());
case ConnectionState.done:
if (snapshot.hasError)
return Text('Error: ${snapshot.error}');
}
return Center(child: Text("messages"));
}));
}
}
这里build方法被调用了2次:一次是打开窗口,一次是关闭,发出2个http请求。
如果我将消息移到构建方法之外,我将无法访问从 Navigator 传递的 conversationID 参数。
【问题讨论】:
标签: flutter