我有像MainWidget(parent) -> ButtonWidget(child),GameManager和_KeyChangeNotifier这样的类
MainWidget类返回ChangeNotifierProvider
return ChangeNotifierProvider<_KeyChangeNotifier>(
builder: (_) => _KeyChangeNotifier(),
child:ButtonWidget因此,在本例中,我可以在_KeyChangeNotifier类中获得buttonWidget。就像这样。
Provider.of<_KeyChangeNotifier>(context, listen: false).setStatus(0);
然而,现在,我想从_KeyChageNotifier获得GameManager。
MainWidget有GameManager的实例,但是GameManager不是小部件,所以它不在ChangeNofitierProvider下面。
在这种情况下。能从_KeyChangeNotifier那里得到GameManager吗?
基本上我的想法是错的。
所以我在MainWdget中做了这样的函数
setHint(int h){
Provider.of<_KeyChangeNotifier>(context, listen: false).setHint(h);
}然后从GameManager调用这个
在GameManager中
_MainWidgetState parent;
GameManager(p){
parent = p // parent is passed to GameManager in advance by constructor.
}
function test(){
this.parent.setHint(2);
} 发布于 2019-12-02 16:06:38
您的编辑是一个改进,但我不会将_MainWidgetState设置为GameManager。如果您认为GameManager是某种服务,那么它不应该知道任何有关小部件状态的信息。
您可以在ChangeNotifier中实现GameManager,并在MainWidget周围使用ChangeNotifierProvider<GameManager>提供它。
class GameManager with ChangeNotifier {
int _hint;
int _status;
void setHint(int hint) {
_hint = hint;
notifyListeners();
}
int get getHint => _hint;
// same for status or whatever
}ChangeNotifierProvider<GameManager>(
builder (_) => GameManager(),
child: MainWidget(),
//dispose: (_, manager) => manager.dispose(),
)现在,您可以访问MainWidget和ButtonWidget中的ButtonWidget并修改其状态。你可以听听。
有几种方法可以在颤振中处理状态,特别是与父部件的通信。我建议查看Stream和Sink,或者如果您熟悉Rx,可以使用达特氏 Observable和Subject。
https://stackoverflow.com/questions/59139751
复制相似问题