Итак, у меня этот ChangeNotifierProvider находится высоко в моем дереве виджетов, поскольку я вижу много дочерних виджетов, которые слушают его значение.
В настоящее время я передаю объект Provider.of (context) из родительского виджета в его дочерние элементы через конструкторы всякий раз, когда мне нужно повторно использовать некоторые значения / функции в моих дочерних виджетах. Например, каждый раз, когда я создаю объект Provider.of (context) для своих дочерних виджетов, кажется, что он не переносит обновленные значения, которые у меня есть в родительском поставщике, а скорее у этого есть мое значение по умолчанию. null / 0 / «пустые», как будто они только что были созданы. Это побудило меня передать начальный объект Provider.of (context) каждому дочернему элементу, который будет использовать обновленные значения и функции ChangeNotifier.
Эта настройка работает для меня, однако, когда мое дерево виджетов стало сложным, я постоянно передаю значения через каждый виджет и некоторым из них, которые даже не используют его вообще, только для того, чтобы его дочерние элементы слушали основного поставщика.
Я думаю, что то, что я сейчас делаю, является антипаттерном архитектуры провайдера, я надеюсь, что вы, ребята, поможете мне найти более оптимизированный и эффективный способ сделать это.
Большое спасибо!
P.S. В документации есть некоторые вещи, которые я еще не совсем понял.
Ниже приведены правки, включающие образец кода и визуализацию:
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}'
);
}
}
screen_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}'
)
]
);
}
}
Визуализация
В настоящее время я передаю объект providerType из ScreenColumn на экраны A, B и C, чтобы каждый из них имел один и тот же «Источник значений». Потому что, когда я пытаюсь создать разные объекты Provider.of и использовать их, они не используют одни и те же обновленные значения, когда я выполняю некоторые вычисления.
Могу ли я что-то сделать, чтобы сделать это более эффективным, или есть способ лучше?