#flutter-provider
#flutter-provider
Вопрос:
Я новичок в flutter и особенно в шаблоне поставщика. Я просмотрел документацию, примеры и несколько руководств по управлению состоянием шаблона поставщика и пытаюсь реализовать его в одном из своих проектов. Я разрабатываю приложение для управления личными расходами. Проблема в том, что вся документация, примеры и руководства предполагают, что у поставщика модели есть все необходимые данные, доступные в памяти, то есть все фиктивные данные уже есть в списке. Довольно легко понять добавление / удаление данных и уведомление об изменении. Но в реальном приложении данные необходимо загружать либо из локальной базы данных, либо из Интернета. Вот когда все становится запутанным. Вот моя модель:
class Expense {
int id;
Strin& name;
DateTime date;
double amount;
PaymentType paymentType; //This is an enum (card, cash etc.)
ExpenseCate&ory cate&ory; //Cate&ories like fuel, &roceries etc.
Expense({@required this.name, @required this.date, @required this.amount, @required this.paymentType, @required this.cate&ory});
}
class ExpenseCate&ory {
int id;
Strin& name;
ExpenseCate&ory({@required this.name});
}
Класс манипулирования данными:
class ExpenseRepository {
static Future<List<Expense&&t;&&t; &etAllExpenses({@required int month}) async {
return await mockService.&etAllExpensesData(month: month);
}
static Future<List<Expense&&t;&&t; &etRecentExpenses() async {
return await mockService.&etRecentExpensesData();
}
static Future<List<Cate&orywiseAmount&&t;&&t; &etCate&orywiseExpensesList({@required int month}) async {
return await mockService.&etCate&orywiseExpensesListData(month: month);
}
}
На данный момент данные загружены из макетной службы, которая будет заменена локальной базой данных. Тем не менее, он имитирует шаблон async / await.
Учитывая приведенный выше код, у меня возникают следующие вопросы:
-
Должен ли я преобразовать модель «Расходов» в поставщика (поставщик «Расходов» и «Expenses») или мне нужно создать отдельный класс, который будет действовать как поставщик? В документах и руководствах я видел, что модели были преобразованы в поставщиков, но правильно ли это? Возможно, я ошибаюсь, но я думаю, что разделение проблем будет нарушено. Насколько я прочитал, модель не должна делать ничего другого, кроме как быть моделью.
-
Как поставщик расходов фактически загружает данные из базы данных (или из макетной базы данных в моем случае)? Если я буду следовать инструкциям, у меня должен быть такой поставщик:
class ExpensesProvider with Chan&eNotifier {
List<Expense&&t; _expensesList;
List<Expense&&t; &et recentExpenses {
return _expensesList;
}
}
Но как поставщик будет загружать данные из фиктивной базы данных в свойство _expensesList, потому что фиктивный метод &etRecentExpenses() возвращает future (и реальный тоже), и это не может быть использовано в &etter. Или я тоже должен возвращать future из самого &etter?
- Если добавляется новый расход, список недавних расходов должен обновляться автоматически. Давайте предположим, что на данный момент этот поставщик каким-то образом подключен к базе данных. У меня есть следующие сомнения: а) Отслеживает ли поставщик изменения в базе данных или он отслеживает изменения в модели / списке в памяти и автоматически запускает перестроения? б) Или, может быть, он не отслеживает ничего из вышеперечисленного, и нам нужно вручную запустить его с помощью notifyListeners? Путаница возникает из комментариев
// Consumer looks for an ancestor Provider wid&et
// and retrieves its model (Counter, in this case).
// Then it uses that model to build wid&ets, and will tri&&er
// rebuilds if the model is updated.
Эти комментарии взяты из приложения flutter samples https://&ithub.com/flutter/samples/blob/master/provider_counter/lib/main.dart
- Я вообще использую правильные инструменты? Я имею в виду, может быть, есть что-то еще, что можно использовать вместо provider (но с аналогичной или большей функцией) для использования с local / database, чтобы упростить процесс.
Комментарии:
1. У меня точно такие же проблемы прямо сейчас. Я совершенно не понимаю, как использовать Provider с базой данных и асинхронными данными, и никакой учебник или обсуждение не мешает углубиться в это. Пока я пытаюсь создать вторичную «модель поставщика» (которая
value
является моей моделью базы данных), которая включает в себя асинхронныйinit
метод, который загружает данные. Я вызываюinit
вFutureBuilder
, который я помещаю междуChan&eNotifierProvider
иConsumer
. Я не очень доволен таким подходом. Вы нашли что-нибудь по этому поводу с тех пор?2. @Steffen да, я решил использовать тот же подход, что и ваш, и с тех пор использую его. Я не знаю, является ли это оптимальным подходом, но это единственный подход, о котором я знаю до сих пор в шаблоне поставщика! Я думаю, нам придется разобраться с этим самим 😉
3. Итак, я продолжил поиск и переключился на Riverpod и его класс AsyncValue , устранив необходимость в вышеупомянутом
FutureBuilder
сэндвиче. На самом деле это не ответ для пользователей поставщика, но я подумал, что упомянул об этом.