Руководство по использованию Fish Redux Global Store-AppRoute

Flutter Redux

Прежде чем научиться использовать AppRoute, сначала разберитесь в этих вопросах, чтобы определить, нужно ли вам это.

  1. Почему Redux.js и Vuex являются глобальным магазином?

    Интерфейсные одностраничные приложения становятся все более и более сложными. Изменение модели повлечет за собой изменение другой модели, что также может привести к изменению представления. Три принципа Redux позволяют прогнозировать изменения состояния. Первый из них — единый источник данных, в котором воплощена идея централизации. Приложение поддерживает дерево состояний, а изменения данных приводят к обновлению представления. Единое дерево состояний более удобно для управления данными. Поскольку жизненный цикл соответствует приложению, данные между компонентами также удобнее передавать и совместно использовать (например, информацию для входа).

  2. Почему Fish Redux не такой?

    Fish Redux поддерживает Stroe на уровне страницы только в начале, что является объективным требованием бизнеса. В качестве нового стека технологий Flutter используется в приложении Xianyu с сотнями миллионов пользователей. Он требует контроля рисков и изоляции. Он может только сначала переписать некоторые страницы, итеративно проверять и улучшать, а затем постепенно заменять его.

  3. Нужно ли использовать AppRoute?

    Если ваши требования такие же, как у Сяньюй, вы выбрали трудный путь, требующий долгой борьбы между концентрацией и разделением. Рекомендуется использовать HybridRoute, чтобы сэкономить время и облегчить последующее преобразование. В противном случае используйте AppRoute, чтобы в полной мере насладиться преимуществами Flutter и Redux.

дизайн-мышление

Автор добавил уровень маршрута, основная функция которого заключается в создании страницы, соответствующей различным сценариям, и реализации трех конкретных маршрутов XXXRoute.

/// Route 抽象类,只提供返回一个page的能力
abstract class AbstractRoutes {
  Widget buildPage(String path, dynamic arguments);
}

/// AppRoutes实现多page公用一个store,适合全新App使用
class AppRoutes<T> implements AbstractRoutes {
  final Map<String, Dependent<T>> pages;
  final PageStore<T> _store;
    ...
}

/// 一个page,一个store,适合部分页面改写flutter的App使用,如现在的闲鱼 
class PageRoutes implements AbstractRoutes {
  final Map<String, Page<Object, dynamic>> pages;
    ...
}

/// 混合Routes,可以同时使用AppRoutes和PageRoutes,适合都要的App,如未来一段时间的闲鱼
class HybridRoutes implements AbstractRoutes {
  final List<AbstractRoutes> routes;
    ...
}    

Как использовать

  1. Определить AppRoute

    /// app_route.dart
    /// 因为是全局的,这里用单例,也比较方便调用
    class AppRoute {
      static AbstractRoutes _global;
      static AbstractRoutes get global {
        if (_global == null) {
          _global = AppRoutes(preloadedState: AppState.initialState(), pages: {
            // 这里有两种写法,效果是一样的,带操作符的写法比较生动,也简短些。
            // RoutePath.todoList: TodoListPage().asDependent(TodoListConn()),
            RoutePath.todoList: TodoListConn() + TodoListPage(),
            RoutePath.todoDetail: TodoDetailConn() + TodoDetailPage(),
          });
        }
        return _global;
      }
    }
    
    /// 减少魔法字段,这些常量放在constant里也可以,放在这里只是方便。
    class RoutePath {
      static const String todoList = 'todo_list';
      static const String todoDetail = 'todo_detail';
    }
    
  2. Определите AppState, который будет использоваться в качестве корневого узла дерева состояний.

    /// screens/todo_list/state.dart
    class AppState implements Cloneable<AppState> {
      TodoListState todoListState;
      TodoDetailState todoDetailState;
    
      AppState(this.todoListState, this.todoDetailState);
    
      @override
      AppState clone() {
        return AppState(todoListState, todoDetailState);
      }
    
      AppState.initialState()
          : todoListState = initState(null),
            todoDetailState = TodoDetailState();
    }
    
  3. Определите соединение, чтобы описать отношения преобразования между подсостоянием и родительским состоянием.

    /// screens/todo_list/state.dart
    /// get定义从大state取小state,set定义小state怎么改变大state
    class TodoListConn extends ConnOp<AppState, TodoListState> {
      @override
      TodoListState get(AppState state) => state.todoListState;
      
      @override
      void set(AppState state, TodoListState subState) =>
          state.todoListState = subState;
    }
    
  4. Заменить способ создания исходной страницы

    /// main.dart
    home: AppRoute.global.buildPage(RoutePath.todoList, null),
    
  5. Дополнительная обработка (Страница со скачком данных)

    /// screens/todo_detail/reducer.dart
    /// 页面跳转可能会有数据传递,比如list到detail页面,需要传递id,
    /// 这是很常见的,那数据什么时候传递?自然是page生成的时候,可以看到[AbstractRoutes]
    /// 的buildPage接受一个arguments参数,dynamic你可以传任意结构数据,推荐传Map,原生json样式
    /// 如果arguments不为null,Route会帮我们发一个route的Action,
    /// 所以我们需要在对应的Reducer里处理一下
    Reducer<TodoDetailState> buildReducer() {
      return asReducer<TodoDetailState>(<Object, Reducer<TodoDetailState>>{
        RouteAction.route: _route,
          ...
      });
    }
    
    /// 接到route Action,更新下state的id
    TodoDetailState _route(TodoDetailState state, Action action) {
      final TodoDetailState newState = state.clone();
      newState.id = action.payload['id'];
      return newState;
    }
    

Сравнительный опыт Flutter Redux

Лучшие практики Fish Redux и Flutter Redux всегда были разными: одна — управление состоянием на уровне страницы, а другая — управление состоянием на уровне приложения, так что это продукт, конкурирующий с дислокацией. После того, как Fish Redux присоединится к Route, он также считается завершенным, после использования обоих я просто сравню:

  1. Удобство

    Flutter Redux вызывается просто, и сложно глубоко понять смысл API. В Fish Redux много понятий, похоже на сглаживание двумерного массива, множество определений и понятий могут убедить небольшое количество нетерпеливых студентов. Тем не менее, цель фреймворка ясна, а в коде есть следы тщательного проектирования. Это равная доля для меня.

  2. Пример документации

    Flutter Redux побеждает. Документов и примеров гораздо больше, чем недавно открытый Fish Redux. Документов Fish Redux не так много, но есть китайские версии.

  3. ответ на проблему

    Fish Redux побеждает: вопросы на Github могут получать ответы и ответы от авторов или энтузиастов сети в течение 12 часов. Автор Flutter Redux поддерживает множество библиотек и имеет ограниченную энергию, поэтому скорость обработки Issue можно назвать прокрастинацией.

  4. полнота

    Функционально завершенный Flutter Redux должен полагаться на две библиотеки по форме, Fish Redux немного лучше без каких-либо других сторонних зависимостей.

  5. представление

    На самом деле первоначальный замысел государственного управления не заботится о производительности, ведь это всего лишь государственное управление, а управление требует дополнительных затрат. Но fish redux обратил на это внимание и сделал более заметные оптимизации для сценариев с большими списками, а улучшение производительности только что было улучшено.

Итог: Fish Redux — хороший кандидат на управление состоянием во Flutter, и он растет с ощутимой скоростью.

следовать за

После сравнения, я думаю, что Fish Redux хорош, я хочу продать его боссу.

Я: Сообщите боссу, Ali's Fish Redux — это старый NB, он нам нужен для нашего проекта?

Босс: Где NB?

Я: Барбара~

Босс: Какие крупные фабрики его используют?

Я: эээ, похоже на Али

Босс: Каково покрытие юнит-тестами?

Я: почти 50%

Босс: Насколько улучшилась производительность?Есть ли эталон?

Я:. . .

Извините, вышесказанное просто мой мозг, но с профессионализмом моего начальника эти вопросы надо задавать. . .

Исходный адрес этой статьи: https://github.com/hyjfine/flutter_redux_sample/tree/fish-redux-route.

(над)

@зилуюАвторские права на эту статью принадлежат команде Retain R&D, добро пожаловать на перепечатку, пожалуйста, сохраните источник.