我是新手,尤其是提供者模式。我浏览了有关提供程序模式状态管理的文档,示例和一些教程,我试图在我的一个项目中实现它。我正在开发个人支出经理应用程序。问题在于,所有文档,示例和教程都假定模型提供者在内存中具有所有必需的数据,也就是说,列表中已经存在所有模拟数据。很容易理解数据的添加/删除和更改通知。但是在实际应用中,需要从本地数据库或Internet加载数据。那就是当事情变得混乱和混乱的时候。这是我的模型:
class Expense {
int id;
String name;
DateTime date;
double amount;
PaymentType paymentType; //This is an enum (card, cash etc.)
ExpenseCategory category; //Categories like fuel, groceries etc.
Expense({@required this.name, @required this.date, @required this.amount, @required this.paymentType, @required this.category});
}
class ExpenseCategory {
int id;
String name;
ExpenseCategory({@required this.name});
}
数据操作类:
class ExpenseRepository {
static Future<List<Expense>> getAllExpenses({@required int month}) async {
return await mockService.getAllExpensesData(month: month);
}
static Future<List<Expense>> getRecentExpenses() async {
return await mockService.getRecentExpensesData();
}
static Future<List<CategorywiseAmount>> getCategorywiseExpensesList({@required int month}) async {
return await mockService.getCategorywiseExpensesListData(month: month);
}
}
目前,数据是从模拟服务加载的,该服务将被本地数据库替换。不过,它模拟了异步/等待模式。
在查看上面的代码时,我有以下问题:
我是否必须将“费用”模型转换为提供程序(“费用”和“费用”提供程序),还是必须创建一个单独的类来充当提供程序?在文档和教程中,我已经看到模型已转换为提供程序,但这是正确的做法吗?我可能是错的,但是我认为关注点分离将被违反。据我所读,除了成为模型之外,模型不应做任何其他事情。
费用提供者实际上如何从数据库(或我的模拟数据库)中加载数据?如果我遵循这些教程,则必须拥有这样的提供者:
class ExpensesProvider with ChangeNotifier {
List<Expense> _expensesList;
List<Expense> get recentExpenses {
return _expensesList;
}
}
但是,提供程序将如何将数据从模拟数据库加载到_expensesList属性中,因为模拟方法getRecentExpenses()返回的是Future(而实际方法也将返回)并且不能在getter中使用。还是我也必须从吸气剂本身返回未来?
// Consumer looks for an ancestor Provider widget
// and retrieves its model (Counter, in this case).
// Then it uses that model to build widgets, and will trigger
// rebuilds if the model is updated.
这些评论来自flutter示例应用https://github.com/flutter/samples/blob/master/provider_counter/lib/main.dart