2020-05-12 21:27:31
Flutter 跳转到新页面 上一个页面的context 各页面的共同父Widget
发现问题
有2个页面[A]和[B],关系是从[A]跳到[B],需要共享购物车数据。
- 创建了一个
Provider来共享数据,让[A]页面作为它的child。 - [A]中用
Navigator.push跳到[B], 在[B]中用Provider.of(context)获取共享的数据。
问题出现,我并不能得到 Provider 共享的数据。
分析
因为[B]的 parent 中没有 Provider。
要使用 Provider ,[A]和[B]的 parent 中都有那个 Provider 才行。
但是跳转页面这种情况,怎么才能做到呢。
看了官方样例中的代码,是把 Provider 放到 MaterialApp 上层。
但是并没有看出来[B]页面和 MaterialApp 有什么关系呀。
我想到了 Theme.of(context) 的用法。
这个方法在哪里都是直接用,也没见 Theme 是哪里创建的。
在 Theme 的官方文档中有这么一句。
MaterialApp, which includes an AnimatedTheme widget configured via the MaterialApp.theme argument.
结合 InheritedWidget 的知识, Theme 应该是 MaterialApp 的 parent 。
看了源码,好像我猜的没错。
解决
回到跳转页面,谁是共同 parent 的问题。
由于跳转页面都要用到 Navigator ,
那么 Navigator 就有可能是所有页面的 parent 。
然后 Navigator 是 MaterialApp 的 parent 。
所以让 Provider 作为 MaterialApp 的 parent ,
也就成为了所有页面的 parent 。
问题解决。
起初我还想到了把[A]页面的context传到[B]页面。好像也没成功。