假设我需要一个包含所有用户变量和功能的用户服务,以及包含所有项目变量和功能等的另一项服务。我希望所有这些数据和功能在整个项目中可用,将用户数据传递到哪里例如,它是必需的。
我怀疑它与继承的小部件有关,但它是如何工作的?就像,我看到如何在根级别使用一个继承的小部件,但我是否应该在根级别为每个服务构建一堆继承的小部件?或者只是将所有数据放在一个顶级继承的小部件中?似乎可能会变得混乱。我还没有看到这样的例子。
...或者我应该只使用带有静态变量的类并在需要它的地方调用它?
答案 0 :(得分:5)
请参阅Günter上面提供的链接。如果你有三十分钟的时间观看Brian Egan的DartConf 18演讲:Keep it Simple, State。另请参阅Brian的示例代码here。他展示了使用带控制器的InheritedWidget和Flutter Redux编码的相同应用程序。
这是一个来自我的简单应用程序的单个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只在变化时被调用,所以它通常都是真的。)