常见问题:如何在小部件的构建方法中执行导航?
我有一个带有创建表单的屏幕。用户按下按钮时,它将调用REST api。在执行呼叫时,我显示循环进度。进度结束后,我希望屏幕弹出(使用导航)。
要显示作业状态,我在整体中使用Stream,在小部件中使用StreamBuilder。所以我想做这样的事情:
return StreamBuilder<Job<T>>(
stream: jobstream,
builder: (context, snapshot) {
if (snapshot.hasData) {
if (snapshot.data.jobStatus == JobStatus.progress)
// job being executed, display progress
return Center(child: CircularProgressIndicator());
else if (snapshot.data.jobStatus == JobStatus.success)
Navigator.pop(context); // Problem here!
return Center(child: CircularProgressIndicator());
} else {
return DisplayForm();
}
});
我对以下行有疑问:Navigator.pop(context); 因为在构建期间不允许导航。
我该如何导航?
我目前的肮脏解决方案正在使用以下功能,但是很丑陋:
static void deferredPop(BuildContext context) async{
Future.delayed(
Duration(milliseconds: 1),
() => Navigator.pop(context)
);
}
答案 0 :(得分:1)
您可以添加以下回调,以在build方法完成后使用以下代码行执行:
WidgetsBinding.instance.addPostFrameCallback((_) => Navigator.pop(context));
答案 1 :(得分:0)
“因为在构建期间不允许导航。”话虽如此,您应该考虑创建一个单独的函数,该函数将接收输入内容,并考虑是否要弹出该屏幕。