ChangeNotifier 安装等效项?

2024-01-28

我使用 ChangeNotifier 从 Stateful Widget 中提取一些逻辑到 Provider:class Model extends ChangeNotifier {...}

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

if (mounted) {
  setState(() {});
}

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

例如我如何调用:

if (mounted) {
  notifyListeners();
}

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

像这样:

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是否已安装。您只需要检查模型是否已被处置。您可以覆盖dispose()中的方法ChangeNotifier:

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;
  }
}

并且不要忘记处置Model当。。。的时候State被处置:

class YourState extends State {
  Model model;

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

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

}

或者你可以使用ChangeNotifierProvider包装内Provider https://pub.dev/packages/provider,它将帮助您处置Model自动地。

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"),
        ),
      ),
    );
  }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ChangeNotifier 安装等效项? 的相关文章

随机推荐

  • 如何调试 GLSL 着色器?

    我需要调试 GLSL 程序 但我不知道如何输出中间结果 是否可以使用 GLSL 进行一些调试跟踪 例如使用 printf 而不使用像 glslDevil 这样的外部软件 您无法轻松地从 GLSL 内部与 CPU 进行通信 使用 glslDe
  • 如何仅显示一次网站预加载器

    我向我的网站添加了预加载器 每次访问该网站时都会播放预加载器动画 我希望它在每次访问域名时只播放一次 任何点击网站上的主页按钮或浏览器中的后退按钮我希望跳过预加载器 我希望它在任何时候在新选项卡或新浏览器窗口中打开时都显示出来 我尝试添加c
  • Python 日志记录:覆盖日志时间

    下列的Python 的文档 http docs python org library logging html logging Formatter formatTime 我正在尝试覆盖logging Formatter converter以
  • 新类型比枚举更快吗?

    根据本文 http www haskell org haskellwiki Performance Data types 就 GHC 而言 枚举不算作单构造函数类型 因此当用作严格构造函数字段或严格函数参数时 它们不会从解包中受益 这是 G
  • 如何处理 SVG 像素捕捉

    我正在尝试使用路径元素渲染两条 svg 线 第一行宽度为 1px 并且很锐利 第二条线宽度为 2px 并且很模糊两者的笔划宽度相同 如何解决这个问题
  • 防止在 Ruby 中将字符串转换为八进制数

    假设我们有以下 ruby 代码 require yaml h key gt step1 gt 0910 1223 puts h to yaml 0910 是一个字符串 但是之后to yaml转换 字符串变成八进制数 key step1 09
  • 哪一个 NoSQL 数据库(如果有)可以为查询结果集提供*更改*流?

    哪个 NoSQL 数据库 如果有的话 可以提供changes到查询结果集 有人能给我举一些例子吗 首先 我相信没有一个 SQL 数据库提供此功能 我是对的吗 我需要能够指定任意 简单的查询 其在 SQL 中的等价形式可以写成 SELECT
  • 控制 zenity 窗口中内容的大小?

    我可以控制 a 的大小zenity http en wikipedia org wiki Zenity窗口与 width和 height论点 zenity info text This is an information box width
  • Angular ui-select:如何仅将选定的值绑定到 ng-model

    scope property new Property scope property propertyType scope propertyTypes value ResidentialPlot name Residential Plot
  • 现有内部主题具有无效分区

    当在只有一个 Kafka 代理的测试设置中启动我们的 Kafka Streams 应用程序时 我们大约在 15 次运行中看到以下错误 org apache kafka streams errors StreamsException Exis
  • 如何将特定标签/版本与作曲家和私有 git 存储库一起使用?

    我在我公司的 Gitlab 上托管了一些包 我想请求这些包的特定版本 但每次尝试时 composer 都会下载 master 分支的最新提交 作曲家 json name MyProject require user project v0 5
  • 从 Powershell 传递实际的返回代码

    我有一个命令行 exe 实用程序 需要内联密码才能调用 显然 这并不理想 因此我创建了一个 PS 包装器来加密密码并存储它 从 PSCredential 对象调用它 所有这些都工作正常 但我需要错误处理 如果我添加exit LASTEXIT
  • 使用反射打印列表

    public class Service String serviceName setter and getter public class Version int VersionID setter and getter public vo
  • 作为模板参数的通用成员函数指针

    考虑这段代码 include
  • .NET CLR 内部调用

    有没有办法托管 NET CLR 运行时并注册 MethodImplOptions InternalCall 函数 这不是关于 P Invoke 的主题 SSCLI代码 具体是clr src vm ecall cpp 提示没有办法注册Inte
  • 何时何地使用 mvvmlight 取消注册 Messenger

    我用 mvvmlight 构建了一个项目 使用 Messenger 在 VM 之间或 VM 与 View 之间发送消息 现在 我想知道何时何地取消注册Messenger 你能帮我吗 Edited 这是我的场景 有一个MainWindow和一
  • 如何在此处使用 filter() 查询集而不使用循环

    我想避免在循环内使用查询集 因为对数据库的影响很大 我必须列出 Degreyid 1 3 2 3 companyid 2 2 2 1 我想结合使用过滤 我想要过滤对象有度数 1 and 公司编号 2和第二次测试应该是度数 3 and 公司编
  • ActionBar 中可绘制的后退箭头的 ID 是多少?

    以下代码使 ActionBar 中出现后退箭头 getSupportActionBar setDisplayShowHomeEnabled true getSupportActionBar setDisplayHomeAsUpEnabled
  • Python - 请求 HTTP 范围不起作用

    根据this https stackoverflow com questions 23602412 only download a part of the document using python requests我可以使用 Range
  • ChangeNotifier 安装等效项?

    我使用 ChangeNotifier 从 Stateful Widget 中提取一些逻辑到 Provider class Model extends ChangeNotifier 在我的状态小部件中 我有 if mounted setSta