首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从非父-子关系或Widget类获取ChangeNotification

从非父-子关系或Widget类获取ChangeNotification
EN

Stack Overflow用户
提问于 2019-12-02 13:19:13
回答 1查看 123关注 0票数 0

我有像MainWidget(parent) -> ButtonWidget(child)GameManager_KeyChangeNotifier这样的类

MainWidget类返回ChangeNotifierProvider

代码语言:javascript
复制
return ChangeNotifierProvider<_KeyChangeNotifier>(
  builder: (_) => _KeyChangeNotifier(),
  child:ButtonWidget

因此,在本例中,我可以在_KeyChangeNotifier类中获得buttonWidget。就像这样。

Provider.of<_KeyChangeNotifier>(context, listen: false).setStatus(0);

然而,现在,我想从_KeyChageNotifier获得GameManager

MainWidgetGameManager的实例,但是GameManager不是小部件,所以它不在ChangeNofitierProvider下面。

在这种情况下。能从_KeyChangeNotifier那里得到GameManager吗?

基本上我的想法是错的。

所以我在MainWdget中做了这样的函数

代码语言:javascript
复制
setHint(int h){
   Provider.of<_KeyChangeNotifier>(context, listen: false).setHint(h); 
}

然后从GameManager调用这个

在GameManager中

代码语言:javascript
复制
_MainWidgetState parent;
GameManager(p){
   parent = p // parent is passed to GameManager in advance by constructor.
}
function test(){
    this.parent.setHint(2);
} 
EN

回答 1

Stack Overflow用户

发布于 2019-12-02 16:06:38

您的编辑是一个改进,但我不会将_MainWidgetState设置为GameManager。如果您认为GameManager是某种服务,那么它不应该知道任何有关小部件状态的信息。

您可以在ChangeNotifier中实现GameManager,并在MainWidget周围使用ChangeNotifierProvider<GameManager>提供它。

代码语言:javascript
复制
class GameManager with ChangeNotifier {
  int _hint;
  int _status;

  void setHint(int hint) {
    _hint = hint;
    notifyListeners();
  }

  int get getHint => _hint;

// same for status or whatever
}
代码语言:javascript
复制
ChangeNotifierProvider<GameManager>(
  builder (_) => GameManager(),
  child: MainWidget(),
  //dispose: (_, manager) => manager.dispose(),
)

现在,您可以访问MainWidgetButtonWidget中的ButtonWidget并修改其状态。你可以听听。

有几种方法可以在颤振中处理状态,特别是与父部件的通信。我建议查看StreamSink,或者如果您熟悉Rx,可以使用达特氏 ObservableSubject

其他选项是集团剩馀

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59139751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档