Флаттер редукс Как выполнить опрос - PullRequest
1 голос
/ 18 марта 2019

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

В моем случае я хотел бы запустить длинный опрос / отслеживание местоположения / файловую систему отслеживания (любое действие, которое наблюдает за некоторым внешним состоянием) после запуска какого-то определенного экрана и прекратить при закрытии экрана.

Допустим, у нас есть функция, которая может со временем генерировать несколько событий.

Stream<Event>monitor();

Я хотел бы слушать эту функцию, только когда какой-то конкретный экран активен.

Каков наилучший способ сделать это?

1 Ответ

2 голосов
/ 19 марта 2019

Предположим, у вас есть 3 страницы: PageHome.dart, Page1.dart, Page2.dart.

  1. Создайте еще один файл дротика 'GlobalVariables.dart', создайте класс gv внутри этого файла, создайте статические избыточные 'хранилища' для трех страниц.

  2. создать статическую переменную strCurPage в gv.

  3. предположим, что на каждой странице есть переменная, которая должна быть изменена внешним событием, также объявите их в gv как static var.

Коды в GlobalVariables.dart:


import 'package:redux/redux.dart';

enum Actions {
  Increment
} 


// The reducer, which takes the previous count and increments it in response to an Increment action.
int reducerRedux(int intSomeInteger, dynamic action) {
  if (action == Actions.Increment) {
    return intSomeInteger + 1;
  }
  return intSomeInteger;
}

class gv {
  static Store<int> storePageHome =
    new Store<int>(reducerRedux, initialState: 0);
  static Store<int> storePage1 =
    new Store<int>(reducerRedux, initialState: 0);
  static Store<int> storePage2 =
    new Store<int>(reducerRedux, initialState: 0);
  static String strCurPage = 'PageHome';
  static String strPageHomeVar = 'PageHomeInitialContent';
  static String strPage1Var = 'Page1InitialContent';
  static String strPage2Var = 'Page2InitialContent';
}

  1. Импорт 'GlobalVariables.dart' во все остальные файлы дротиков.

  2. Перед переходом на новую страницу, например, от PageHome к Page1, установите:

gv.strCurPage = 'Page1';

  1. Внутри функции монитора, если происходит внешнее событие, скажем, измените значения переменных на Page1 и Page2 (но пользователь в настоящее время перемещается на Page1):
void thisFunctionCalledByExternalEvent(strPage1NewContent, strPage2NewContent) {
  gv.strPage1Var = strPage1NewContent;
  gv.strPage2Var = strPage2NewContent;

  if (gv.strCurPage == 'Page1') {
    // Dispatch storePage1 to refresh Page 1
    storePage1.dispatch(Actions.Increment);
  } else if (gv.strCurPage == 'Page2') {
    // Dispatch storePage2 to refresh Page 2
    storePage2.dispatch(Actions.Increment);
  } else {
    // Do not need to refresh page if user currently navigating other pages.
    // so do nothing here
  }
}

Я не знаю, является ли это лучшим способом, но, используя redux и GlobalVariables.dart, я могу:

  1. знать, на какой странице в данный момент находится пользователь.

  2. изменить содержимое страницы, даже если пользователь не находится на этой странице, когда происходит событие. (Но содержимое будет показано, когда пользователь перейдет на эту страницу позже)

  3. заставляет пользователя переходить на определенную страницу независимо от того, на какой странице он находится, когда происходит событие.

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