我正在尝试查看是否可以添加围绕应用程序传递的常规导航行为,并且我发现InheritedWidget
是避免在小部件树周围传递特定回调的理想选择,但是我越来越多地注意到我只能使用特定类类型的InheritedWidget
才能使InheritedWidget模式起作用,而且我想知道是否有一种方法可以使用InheritedWidget
作为mixin,或者是否有更好的方法替代。
我的应用看起来像这样,它在树上传递了一个回调
我现在有3个导航器,我需要介绍相同的方法,但现在要对其执行操作,我需要创建3个InheritedWidget导航器,但是问题在于,树下的任何窗口小部件都必须这样做>
NavigatorA.of(context).pushWidget()
但是我更喜欢它是否是通用的GenericNavigator.of(context).pushWidget()
,这样我的叶子小部件甚至不需要知道导航器对象的正确值,我很害怕实现这一点。 d需要能够将InheritedWidget用作mixin
这是所需的流程,没有传递回调
这是正确的策略还是有更好的方法? 如何将InheritedWidget用作混合?
答案 0 :(得分:2)
否,您不能将InheritedWidget
用作混合。
但是,您可以创建通用的InheritedWidget
:
class Provider<T> extends InheritedWidget {
Provider({Key key, this.value, Widget child}) : super(key: key, child: child);
final T value;
@override
bool updateShouldNotify(Provider<T> oldWidget) {
return value != oldWidget.value;
}
}
静态of
方法的实现似乎有些棘手。由于没有语法来获取Provider<int>
幸运的是,使用一些解决方法是可行的:
Type _typeOf<T>() => T;
允许按照以下方式实现of
方法:
static T of<T>(BuildContext context) {
final type = _typeOf<Provider<T>>();
Provider<T> provider = context.inheritFromWidgetOfExactType(type);
return provider?.value;
}
答案 1 :(得分:0)
添加到@RémiRousselet的答案
使用Flutter 1.19+(其中已弃用某些inheritedWidget
API)的情况,of
现在应如下所示:
static T of<T>(BuildContext context) {
return context.dependOnInheritedWidgetOfExactType<Provider<T>>().value;
}
由于api基于泛型,因此您不再需要_typeof
技巧。