首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安装ChangeNotifier的等价物?

安装ChangeNotifier的等价物?
EN

Stack Overflow用户
提问于 2019-10-26 18:54:12
回答 2查看 1.4K关注 0票数 6

我正在从有状态小部件中提取一些逻辑,并使用ChangeNotifier:class Model extends ChangeNotifier {...}提供程序

在我的有状态小部件中,我有:

代码语言:javascript
复制
  if (mounted) {
setState(() {});
}

如何检查模型中是否安装了Widget?

例如,我如何调用:

代码语言:javascript
复制
 if (mounted) {
notifyListeners();
}
EN

回答 2

Stack Overflow用户

发布于 2019-10-26 23:01:11

一种简单的方法是将有状态小部件的“State”作为参数传递给“Model”。

如下所示:

代码语言:javascript
复制
class Model extends ChangeNotifier {

  Model(this.yourState);

  YourState yourState;

  bool get _isMounted => yourState.mounted;
}

class YourState extends State<YourStatefulWidget> {
  Model model;

  @override
  void initState() {
    super.initState();
    model = Model(this);
  }

  @override
  Widget build(BuildContext context) {
    // your code..
  }
}

我认为你不需要检查State是否挂载。您只需检查Model是否已被释放。您可以在ChangeNotifier中重写dispose()方法

代码语言:javascript
复制
class Model extends ChangeNotifier {
  bool _isDisposed = false;

  void run() async {
    await Future.delayed(Duration(seconds: 10));
    if (!_isDisposed) {
      notifyListeners();
    }  
  }

  @override
  void dispose() {
    super.dispose();
    _isDisposed = true;
  }
}

State被释放时,不要忘记释放Model

代码语言:javascript
复制
class YourState extends State {
  Model model;

  @override
  void initState() {
    super.initState();
    model = Model();
  }

  @override
  void dispose() {
    model?.dispose();
    super.dispose();
  }
  /// Your build code...

}

或者您可以在Provider包中使用ChangeNotifierProvider,它将帮助您自动处理Model

代码语言:javascript
复制
class YourState extends State {
  Model model;

  @override
  void initState() {
    super.initState();
    model = Model();
  }

  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<Model>(
      builder: (build) => model,
      child: Container(
        child: Consumer<Model>(
          builder: (context, model, widget) => Text("$model"),
        ),
      ),
    );
  }

}
票数 7
EN

Stack Overflow用户

发布于 2020-10-21 20:18:56

只要您用提供者模型状态包装您的小部件,并且众所周知,一旦您的小部件被释放,包装它的提供者模型就已经在默认情况下被释放了

因此,您所要做的就是定义一个变量isDisposed并修改notifyListeners,如下所示

代码语言:javascript
复制
MyState with ChangeNotifier{

// to indicate whether the state provider is disposed or not
 bool _isDisposed = false;


   // use the notifyListeners as below
   customNotifyListeners(){
    if(!_isDisposed){
       notifyListeners()
    }
   }




 @override
  void dispose() {
    super.dispose();
    _isDisposed = true;
  }

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

https://stackoverflow.com/questions/58570120

复制
相关文章

相似问题

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