我正在遵循有关flutter的本教程(https://www.udemy.com/learn-flutter-dart-to-build-ios-android-apps),并使用scoped_model进行状态管理。 我要从产品列表中编辑产品。为此,我将产品ID设置为标记-作用域模型中的selectedProductId。提交时,我想离开并将该selectedProductId设置为null。
//method to edit product
editProduct(productId, newValues);
Navigator.pushReplacementNamed(context, '/productsPage').then((_){
debugger();
setSelectedProductId(null);
}).catchError((err){print(err);});
调试器永远不会被命中。而且也没有错误。
我尝试使用异步等待,但仍然没有用。
editProduct(editableProductId, _formData);
await Navigator.pushReplacementNamed(context, '/productsPage').catchError((err){print(err);});
debugger();
setSelectedProductId(null);
该页面导航到给定的路线,但之后的行从未执行。我什至尝试使用pushNamed
代替pushReplacementNamed
。
我知道pushReplacementNamed
返回一个未来,因此必须调用.then(),但似乎没有发生,我有什么遗漏吗?还有其他我应该知道的因素或情况吗?
答案 0 :(得分:2)
您对概念有误。假设您有Activity A
和Activity B
。在Activity A
中,您从A
导航到B
。现在,仅当从then
调用A
时才调用Navigator.pop(context)
的{{1}}。如果未从B
中调用pop
,则永远不会调用B
回调。
在您的情况下,您正在从then
呼叫Navigator.pushReplacementNamed
,因此您要做的是使用A
REPLACING (更换) A
。因此,即使您从B
弹出,也无法再使用B
,因此将永远不会调用Activity A
回调。
有关更多信息,请参阅flutter食谱中的this部分。
关于在then
回调中执行代码,您应该将其移至then
的{{1}}方法中,您会看到它被调用,但我看不到这样做的意义这是因为dispose
被销毁了,并且没有必要将其instance属性设置为null。
答案 1 :(得分:0)
创建自定义未来对象可能会解决问题
Navigator.pushReplacementNamed(context, '/product');
Future.delayed(Duration(milliseconds: 700)).then((_)=>resetSelectedProduct(null));
答案 2 :(得分:-1)
只需添加以下代码:
printf