Выбор правильного шаблона дизайна Flutter - PullRequest
0 голосов
/ 23 июня 2019

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

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

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

Я читал о шаблоне блока, и я не уверен, что это то, что мне нужно. Я просто хочу объект стиля синглтона, который основной виджет и его дочерние элементы могут как читать, так и дочерние обновлять, когда есть новый ввод.

Кто-нибудь объяснит, поможет ли мне в этом шаблон блока или есть другой шаблон дизайна, который поможет мне в этом.

** РЕДАКТИРОВАТЬ

Спасибо за отличные ответы, ребята. Моя новая проблема связана с шаблоном / библиотекой провайдера.

Я создал несколько классов состояний следующим образом (я заменил содержимое, чтобы попытаться сделать его простым)

class State1 with ChangeNotifier{

String _s;

  set s(String newS){
    _s = newS;
    notifyListeners();
  }

}

и затем я использую мультипровайдер, чтобы передать его (создать объекты в init)

child: MultiProvider(
        providers: [
          ChangeNotifierProvider(builder: (context) => state1),
        ],
        child: Stack(
        alignment: Alignment.center,
        children: stackChildren,
      ),

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

 state1Var = Provider.of<State1>(context);

И все это прекрасно работает ..

Моя проблема в том, что когда я использую навигационную кнопку, я больше не могу получить доступ к состоянию.

onPressed: (() {
          Navigator.push(
            contextField,
            MaterialPageRoute(builder: (context) => NewPage()),
          );
        }),

Как я получаю эту ошибку

Could not find the correct Provider<State1> above this NewPage Widget...

Мне удалось получить это, используя

  Navigator.push(
            context,
            MaterialPageRoute(builder: (context) => Consumer(builder: (),child: NewPage(),)),
          );

Но когда я вытолкнул виджет с помощью navigator.pop (), состояние не могло быть использовано, так как оно сообщило, что оно было удалено.

Извините, если я все усложнил. Мне пришлось удалить много кода.

Ответы [ 2 ]

0 голосов
/ 25 июня 2019

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

С помощью StatefulWidget сложно передавать данные с одного экрана на другой внутри приложения. StatefulWidget - это более ранний способ показать, как передать состояние в флаттерном приложении.

Для приложений производственного уровня существует шаблон BLOC , который является еще одним способом управления состоянием в приложении флаттера.Есть и другие способы, но команда флаттера настоятельно рекомендует шаблон BLOC .Они считают, что это лучший способ делать вещи.Чтобы быть ясным, никто не имеет опыта, чтобы сказать вам, какой способ сделать это, но опять же, как FYI, команда флаттера публично одобрила паттерн BLOC , и для меня это будет означать хорошую поддержку, если вы получитев беду, потому что это сложно понять.

0 голосов
/ 23 июня 2019

Вам нужно использовать stateManagement.

Существует BLoC, но вы также можете без проблем использовать провайдера, и он решит вашу проблему.

Это то, что написал Диего Веласкес о Widget Communication и может решить ваши проблемы.

Но если вам нужна дополнительная информация, я дам вам кое-что от Картика Поннама о Управлении состоянием с провайдером .

Это поможет вам немного лучше понять, что такое управление состоянием из Flutter Docs

...