Flutter pushReplacementNamed().then() 不触发

jay*_*rya 0 dart flutter

我正在关注关于flutter的udemy课程(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);});
Run Code Online (Sandbox Code Playgroud)

调试器永远不会被命中。并且也没有错误。

我尝试使用异步等待,但仍然没有用。

editProduct(editableProductId, _formData);
await Navigator.pushReplacementNamed(context, '/productsPage').catchError((err){print(err);});
debugger();
setSelectedProductId(null);
Run Code Online (Sandbox Code Playgroud)

页面被导航到给定的路线,但后面的行永远不会执行。我什至尝试使用pushNamed而不是pushReplacementNamed.

我知道pushReplacementNamed返回一个未来,所以必须调用 .then(),但似乎没有发生,我错过了什么吗?还有其他我应该了解的因素或情况吗?

Sha*_*rim 5

你这个概念是错误的。假设你有Activity AActivity B。从Activity A您导航AB。现在,仅当then从调用时才调用 from 。如果没有调用,则永远不会调用回调。ANavigator.pop(context)BpopBthen

在您的情况下,您是Navigator.pushReplacementNamed从打电话的A,所以您要做的是替换 AB。因此,即使您从那时弹出B不再Activity A可用,因此then回调也永远不会被调用。

您可以参考flutter Cookbook 中的此部分以获取更多信息。

至于在then回调中执行代码,您应该将其移至dispose的方法Widget,您将看到它被调用,但我看不到这样做的意义,因为 正在Widget被破坏,并且将其实例属性设置为 null 没有意义。