You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter:如何让MaterialApp同时继承两个InheritedWidget?

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 00:27:47