Я создал страницу 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 (), состояние не могло быть использовано, так как оно сообщило, что оно было удалено.
Извините, если я все усложнил. Мне пришлось удалить много кода.