请参阅上面 Günter 提供的链接。如果您有 30 分钟观看 Brian Egan 的 DartConf 18 演示文稿:Keep it Simple, State。另请参阅 Brian 的示例代码 here。他展示了使用带有 Controller 和 Flutter Redux 的 InheritedWidget 编写的同一个应用程序。
这是我的一个简单应用程序中单个 InheritedWidget 的示例...
class StateContainer extends InheritedWidget {
final List<Membership> memberships;
final IntFunction getNextIndex;
final VoidMembershipFunction updateMembership;
final VoidIntFunction deleteMembership;
const StateContainer({
this.memberships,
this.getNextIndex,
this.updateMembership,
this.deleteMembership,
Widget child,
})
: super(child: child);
static StateContainer of(BuildContext context) {
return context.inheritFromWidgetOfExactType(StateContainer);
}
@override
bool updateShouldNotify(StateContainer oldWidget) {
return true;
}
}
我将 MaterialApp 作为孩子传入。然后,树的很大一部分变成无状态的,因为它可以访问 StateContainer 中的数据和方法。您可以将这些视为您的模型和控制器合二为一。树中的构建方法通常以...开头。
@override
Widget build(BuildContext context) {
final StateContainer container = StateContainer.of(context);
访问它们。
你说得对,单个 InheritedWidget 很快就会变得笨拙——这是你可能投资探索 Redux 的地方——请参阅演讲的最后 10 分钟。以我的经验,当最终比较所有成员变量时,最混乱的区域是 updateShouldNotify 方法。 (在这个简单的例子中,只有一个成员变量,并且 setState 只在它发生变化时被调用,所以它总是为真。)