我正在尝试在Flutter中构建Expense跟踪器应用程序,并决定使用范围模型进行状态管理。该应用程序有一个可以拥有多个帐户的用户,每个帐户可以具有许多交易。
我如何对这些模型进行建模以与范围模型一起使用,我一直坚持选择好的架构。
如果我创建一个具有帐户列表的UserModel,其中每个帐户都是一个AccountModel,则从AccountModel内部触发和更新不会触发那些访问UserModel类的帐户。
答案 0 :(得分:2)
class CombinedWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
final username =
ScopedModel.of<UserModel>(context, rebuildOnChange: true).username;
final counter =
ScopedModel.of<CounterModel>(context, rebuildOnChange: true).counter;
return Text('$username tapped the button $counter times');
}
}
您可以在source中看到完整的示例。
答案 1 :(得分:0)
让我们从一个主要问题开始。 范围模型是MVVM吗? 我的回答是,如果必须将实体保存在某处,则必须使用它。
所以,我想在使用两个月后给您很好的答复。 在我看来,有两种可能会更抽象,而无需重新创建模型的结构;一种是我见过的,如果不想在视图之间遇到数据管理问题,则将其排除在外。>
首先是经典:
Widget build(BuildContext context) {
// At the top level of our app, we'll, create a ScopedModel Widget. This
// will provide the CounterModel to all children in the app that request it
// using a ScopedModelDescendant.
return ScopedModel<UserModel>( // <========
model: userModel,
child: ScopedModel<CounterModel>( // <========
model: counterModel,
child: MaterialApp(
title: 'Scoped Model Demo',
home: CounterHome('Scoped Model Demo'),
),
),
);
}
}
我认为第二种最明智的方法是全局加载最重要的模型,而只有某些视图(例如计时器)才需要将这些模型插入到要使用的页面的最高级别。
第二个示例是这样: 在main.dart中
return ScopedModel<UserModel>(
model: UserModel(),
child: MaterialApp(
theme: ThemeData(
primaryColor: PrimaryColor,
),
home: new SplashScreen2(),
),
);
在training.dart中:
return ScopedModel<TimerModel>(
model: TimerModel(),
child: Scaffold(
child:Center(_widget)
),
);
现在,在_widget中,可以使用UserModel和TimerModel的ScopedModelDescendant。
我不建议您使用混合创建主要模型,并扩展所有其他模型。不幸的是,我看了一些视频,却没有说明后果。或者,如果要执行此操作,请确保它们之间没有链接,因为这可能会导致应该真正更新的内容之间产生混淆 我建议您仅在拥有2-3种型号的情况下使用此解决方案。 。
我希望对想知道如何使用它的人有所帮助
答案 2 :(得分:0)
我有一个搜索过滤器用户界面,允许用户应用: 排序 选择的类别 选择的位置(因为该应用是位置感知的分类列表)
这3个过滤器触发对REST API的调用。过滤器菜单在endDrawer(右侧导航抽屉)中管理脚手架的列表视图与将来的构建器加载清单相关联
要引用的更好的示例是GumTree应用(https://play.google.com/store/apps/details?id=com.ebay.gumtree.au&hl=en)
我想坚持使用范围模型。我有2个存储库(类别和位置)与本地存储或API通讯
我相信坚持使用范围模型来管理类别和位置是个好主意。
任何建议...