Мне интересно узнать, как лучше использовать редуктор AppState, если AppState содержит списки или другие сложные объекты.
Итак, пример:
Настройка: допустим, я пишу приложение для отслеживания веса, и для каждой записи веса добавляются дата и комментарий. Я хочу отобразить различные вещи, касающиеся ввода веса пользователя, поэтому я решил поднять их в appstate. Я решил отделить их от пользовательских данных и держать их в отдельном списке, чтобы сделать приложение максимально плоским и разделить различные аспекты (пользовательские данные, настройки, значения веса).
Код:
AppState:
class AppState{
//username, birthdate, etc.
List<Entry> entries;
}
запись:
class Entry{
String userId;
double weight;
DateTime date;
String comment;
}
2 Действия для изменения / добавления записи:
class UpdateCommentOnEntry{
int index;
String comment;
}
class AddEntry{
Entry entry;
}
Задача. Как лучше всего обрабатывать этот список в AppState Reducer? 2 действия?
проблемы:
Управление производительностью и памятью на мобильном устройстве. В основном я хочу скопировать как можно меньше.
Возможные решения:
-1) Как я понимаю, это решение неверно / нарушает стандарт Redux, поскольку оно изменяет текущее состояние:
AppState reducer(AppState state, dynamic action) {
if(action is UpdateCommentOnEntry){
state.entries[action.index].comment=action.comment;
} else if(action is AddEntry){
state.entries.add(action.entry);
}
return state;
}
1) Это решение копирует весь список
AppState reducer(AppState state, dynamic action) {
if(action is UpdateCommentOnEntry){
List<Entry> newList;
for(int i = 0; i<state.entries.length; i++){
if(i!=action.index){
newList.add(state.entries[i]);
} else{
newList.add(state.entries[i].copyWith(comment: action.comment));
}
}
return state.copyWith(entries = newList);
} else if(action is AddEntry){
List<Entry> newList = List<Entry>.from(state.entries);
newList.entries.add(action.entry);
return state.copyWith(entries: newList);
} else {
return state;
}
}
2) Это решение не копирует список, но копирует AppState, но оно все еще ссылается на тот же список. И этот список видоизменяется, так что это также против стандарта Redux?
AppState reducer(AppState state, dynamic action) {
if(action is UpdateCommentOnEntry){
state.entries[i] = state.entries[i].copyWith(comment: action.comment);
return state.copyWith(entries: state.entries);
} else if(action is AddEntry){
List<Entry> newList = List<Entry>.from(state.entries);
newList.entries.add(action.entry);
return state.copyWith(entries: newList);
} else {
return state;
}
}
Я просто не решаюсь копировать весь список каждый раз, когда хочу изменить одну запись. Каково ваше решение, каковы лучшие практики здесь? Я благодарен за любой совет.