Flutter pushReplacementNamed()。then()不触发

时间:2019-01-06 14:18:50

标签: dart flutter

我正在遵循有关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(),但似乎没有发生,我有什么遗漏吗?还有其他我应该知道的因素或情况吗?

3 个答案:

答案 0 :(得分:2)

您对概念有误。假设您有Activity AActivity 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