Каковы лучшие практики для редукторов во Flutter с вложенным AppState - PullRequest
1 голос
/ 12 марта 2019

Мне интересно узнать, как лучше использовать редуктор 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;
  }
}

Я просто не решаюсь копировать весь список каждый раз, когда хочу изменить одну запись. Каково ваше решение, каковы лучшие практики здесь? Я благодарен за любой совет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...