我想请你帮忙解决这个问题。
我下面的示例代码旨在从子窗口小部件更新父窗口小部件的状态,同时也更新子窗口小部件的状态。父窗口小部件的文本值将更新,同时也会更改子窗口小部件按钮的颜色。
import 'package:flutter/material.dart';
void main() => runApp(AppIndex());
class AppIndex extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(home: ParentWidget());
}
}
class ParentWidget extends StatefulWidget {
@override
_ParentWidgetState createState() => _ParentWidgetState();
}
class _ParentWidgetState extends State<ParentWidget> {
String _textValue = 'Old Value';
callback(newValue){
setState(() {
_textValue = newValue;
});
}
@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
Text(_textValue),
ChildWidget(),
],
);
}
}
class ChildWidget extends StatefulWidget {
String textValue;
Function callback;
ChildWidget({this.textValue, this.callback});
@override
_ChildWidgetState …Run Code Online (Sandbox Code Playgroud) 所以我在我的小部件树中设置了这个 ChangeNotifierProvider,因为我看到很多子小部件来聆听它的价值。
我目前正在做的是,每当我要在我的子小部件上重用某些值/函数时,我都会通过构造函数将Provider.of(context)对象从父小部件传递给它的子小部件。例如,每次我为我的孩子小部件创建一个Provider.of(context)对象时,它似乎没有继承我在父 Provider 上的更新值,而是这个具有我的默认值 null/0/'empty'像它这样的只是被创造出来的。这导致我将初始Provider.of(context)对象传递给每个将使用 ChangeNotifier 更新值和函数的子级。
这个设置对我有用,但是,当我的小部件树开始变得复杂时,我不断地通过每个小部件向下传递值,甚至将值传递给一些甚至根本不使用它的人,只是为了让它的孩子听主提供者。
我认为我现在可能正在做的是提供者架构的反模式,我希望你们能以更优化和更有效的方式帮助我做到这一点。
非常感谢!
PS 文档中的一些内容我还没有完全掌握。
编辑以下以包含示例代码和可视化:
provider_type.dart
class ProviderType extends ChangeNotifier{
String valueA = '';
String valueB = '';
}
Run Code Online (Sandbox Code Playgroud)
家.dart
import ..provider_type.dart
...
Widget build(BuildContext context){
return ChangeNotifierProvider<ProviderType>(
create: (context) => ProviderType(),
child: ScreenColumn();
);
}
...
Run Code Online (Sandbox Code Playgroud)
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),
],
);
}
} …Run Code Online (Sandbox Code Playgroud)