【问题标题】:Is it possible to use InheritedWidget as a mixin?是否可以使用 InheritedWidget 作为 mixin?
【发布时间】:2019-01-20 22:34:17
【问题描述】:

我正在尝试查看是否可以添加一些在我的应用程序中传递的通用导航行为,并且我发现 InheritedWidget 是避免在小部件树周围传递特定回调的绝佳候选者,但是我注意到更多还有更多我只能拥有特定类类型的 InheritedWidget 才能使 InheritedWidget 模式起作用,我想知道是否有办法将 InheritedWidget 用作 mixin 或者是否有更好的选择。

我的应用看起来像这样,它向下传递一个回调

我现在有 3 个导航器,我需要提供相同的方法,但现在要自己执行操作,我需要创建 3 个 InheritedWidget 导航器,但问题是树下的任何小部件都必须这样做

NavigatorA.of(context).pushWidget()

但我更喜欢它是一个通用的GenericNavigator.of(context).pushWidget(),这样我的叶子小部件甚至不需要知道导航器对象的正确值,我害怕实现这个我需要能够将 InheritedWidget 用作 mixin

这是所需的流程,未传递任何回调

这是正确的策略还是有更好的方法? 如何将 InheritedWidget 用作 mixin?

【问题讨论】:

    标签: dart flutter


    【解决方案1】:

    不,您不能将 InheritedWidget 设为 mixin。

    但是,您可以创建一个通用的InheritedWidget

    class Provider<T> extends InheritedWidget {
      Provider({Key key, this.value, Widget child}) : super(key: key, child: child);
    
      static T of<T>(BuildContext context) {
        Provider<T> provider = context.dependOnInheritedWidgetOfExactType<T>();
        return provider?.value;
      }
    
      final T value;
    
      @override
      bool updateShouldNotify(Provider<T> oldWidget) {
        return value != oldWidget.value;
      }
    }
    

    【讨论】:

    • 我的情况是我需要NavigatorA,NavigatorBNavigatorC 来拦截调用并在他们自己的本地导航器上显示新的小部件,但是它们是有状态的小部件,因此无法扩展同时使用 StatefulWidget 和 InheritedWidget
    • 使用两个不同的小部件。一个是 statefulWidget,另一个是 InheritedWidget。
    【解决方案2】:

    添加到@RémiRousselet 的答案

    使用 Flutter 1.19+,其中一些 inheritedWidget API 已被弃用,of 现在应该如下所示:

        static T of<T>(BuildContext context) {
          return context.dependOnInheritedWidgetOfExactType<Provider<T>>().value;
        }
    

    由于 api 基于泛型,您不再需要 _typeof 技巧。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-17
      • 2020-09-21
      • 1970-01-01
      • 2013-04-04
      • 2021-08-30
      • 1970-01-01
      相关资源
      最近更新 更多