Flutter:如何让MaterialApp同时继承两个InheritedWidget?
嘿,我完全懂你的困扰!其实要让MaterialApp同时用上LocalizationProvider和AppStateProvider这两个独立的InheritedWidget是完全可行的,问题只是你还没找对正确的嵌套方式而已 😊
问题根源
你之前的两种实现都是单独把一个Provider包裹在MaterialApp外层,所以单独使用时一切正常。但要同时启用两个Provider,只需要把它们互相嵌套,共同作为MaterialApp的父级组件就可以了——因为InheritedWidget的特性是子树中的组件可以通过上下文向上查找最近的对应InheritedWidget实例,只要两个Provider都在MaterialApp的父上下文层级里,MaterialApp内部的所有子组件都能顺利访问到它们。
正确的实现方式
你只需要把两个Provider嵌套起来,顺序可以根据你的依赖需求调整:
方式一:先包LocalizationProvider,再包AppStateProvider
Widget build(BuildContext context) { return LocalizationProvider( state: LocalizationProvider.of(context).state, child: AppStateProvider( state: this, child: FlavorBanner( child: MaterialApp( // 你的MaterialApp配置代码(主题、路由等) ), ), ), ); }
方式二:先包AppStateProvider,再包LocalizationProvider
如果LocalizationProvider不需要依赖AppStateProvider的状态,反过来嵌套也完全没问题:
Widget build(BuildContext context) { return AppStateProvider( state: this, child: LocalizationProvider( state: LocalizationProvider.of(context).state, child: FlavorBanner( child: MaterialApp( // 你的MaterialApp配置代码(主题、路由等) ), ), ), ); }
额外提示
如果其中一个Provider需要依赖另一个的状态(比如LocalizationProvider初始化时需要用到AppStateProvider里的配置),一定要把被依赖的Provider放在外层,这样内层的Provider才能通过上下文正确获取到它的实例。
之后在MaterialApp内部的组件里,你就可以正常使用LocalizationProvider.of(context)和AppStateProvider.of(context)来获取对应的状态啦!
内容的提问来源于stack exchange,提问作者fida1989

