Итак, у меня есть этот ChangeNotifierProvider высоко в моем дереве виджетов, так как я вижу много дочерних виджетов, которые слушают его значение.
В настоящее время я делаю, что я передаю Provider.of ( context) объект из родительского виджета в его потомки через конструкторы всякий раз, когда мне нужно повторно использовать некоторые значения / функции в моих дочерних виджетах. Например, каждый раз, когда я создаю объект Provider.of (context) для своих дочерних виджетов, создается впечатление, что он не переносит обновленные значения, которые есть в Parent Provider, а имеет значение по умолчанию null. / 0 / 'пустые', как будто они только созданы. Это заставило меня передать начальный Provider.of (context) каждому дочернему элементу, который будет использовать обновленные значения и функции ChangeNotifier.
Эта настройка работает для меня, однако Когда мое дерево виджетов стало сложным, я постоянно передаю значения через каждый виджет и некоторым, которые вообще не используют его только для того, чтобы его дети слушали основного поставщика.
Я думаю, что Возможно, я сейчас занимаюсь анти-паттерном архитектуры провайдеров, надеюсь, вы, ребята, сможете помочь мне в более оптимизированном и эффективном способе сделать это.
Большое спасибо!
PS В документации есть некоторые вещи, которые я еще не совсем правильно понял.
Правки Ниже приведены примеры кода и визуализация:
provider_type.dart
class ProviderType extends ChangeNotifier{
String valueA = '';
String valueB = '';
}
home.dart
import ..provider_type.dart
...
Widget build(BuildContext context){
return ChangeNotifierProvider<ProviderType>(
create: (context) => ProviderType(),
child: ScreenColumn();
);
}
...
screen_column.dart
import ..screen_a.dart
import ..screen_b.dart
class ScreenColumn extends StatelessWidget{
Widget build(BuildContext context){
var providerType = Provider.of<ProviderType>(context);
return Column(
children: <Widget>[
ScreenA(providerType: providerType),
ScreenB(providerType: providerType),
],
);
}
}
screen_a.dart
class ScreenA extends StatelessWidget{
final ProviderType providerType;
ScreenA({this.providerType});
Widget build(BuildContext context){
return Text(
'${providerType.valueA}'
);
}
}
scre ru_b.dart
import ..screen_c.dart
class ScreenB extends StatelessWidget{
final ProviderType providerType;
ScreenB({this.providerType});
Widget build(BuildContext context){
return ScreenC(providerType: providerType);
}
}
screen_ c .dart
class ScreenC extends StatelessWidget{
final ProviderType providerType;
ScreenB({this.providerType});
Widget build(BuildContext context){
return Column(
children: <Widget>[
Text(
'${providerType.valueA}'
)
Text(
'${providerType.valueB}'
)
Text(
'${providerType.valueC}'
)
]
);
}
}
Визуализация
![enter image description here](https://i.stack.imgur.com/SLNbn.png)
То, что я сейчас делаю, - это передать объект providerType из ScreenColumn на экраны A, B и C, чтобы каждый из них имеют тот же «Источник ценностей». Потому что, когда я пытаюсь создать разные объекты Provider.of и использовать их, они не используют одни и те же обновленные значения, когда я выполняю некоторые вычисления.
Есть ли что-то, что я могу сделать, чтобы сделать это более эффективным, или есть лучший способ, что мне нужно сделать?