在构建 GetX<LogoPickerController>(控制器:'LogoPickerController' 的实例,标签:null,有构建器,脏

Posted

技术标签:

【中文标题】在构建 GetX<LogoPickerController>(控制器:\'LogoPickerController\' 的实例,标签:null,有构建器,脏【英文标题】:The following message was thrown building GetX<LogoPickerController>(controller: Instance of 'LogoPickerController', tag: null, has builder, dirty在构建 GetX<LogoPickerController>(控制器:'LogoPickerController' 的实例,标签:null,有构建器,脏 【发布时间】:2021-12-28 18:49:21 【问题描述】:

我正在使用 Getx。但我正面临这个问题:

══╡ 小部件库发现异常 ╞═════════════════════════════════════════════════ ══════════ 以下消息被抛出建设 GetX(控制器:的实例 'LogoPickerController',标签:null,有生成器,脏,状态: GetXState#ec9a5(控制器:实例 'LogoPickerController')): [Get] 检测到 GetX 使用不当。 您应该只对将要更新的特定小部件使用 GetX 或 Obx。 如果您看到此错误,您可能没有在 GetX/Obx 中插入任何可观察变量 或将它们插入 GetX 认为适合更新的范围之外 (例如:GetX => HeavyWidget => variableObservable)。 如果您需要更新父窗口小部件和子窗口小部件,请将每个窗口小部件包装在 Obx/GetX 中。

代码是:

 Center(
            child: GetX<LogoPickerController>(
                init: LogoPickerController(),
                builder: (controller) 
                  if (controller.image?.value != null) 
                    return CircleAvatar(
                      radius: 30,
                      child: ClipOval(
                          child: Image.file(
                        controller.image?.value ?? File(""),
                        width: 200,
                        height: 200,
                        fit: BoxFit.fill,
                      )),
                    );
                   else 
                    return const EntityLogoPickerWidget();
                  
                ),
          ),

【问题讨论】:

【参考方案1】:

当我们使用反应变量时,首选使用 GetX 和 Obx。

尝试将GetX 替换为GetBuilder。那是

Center(
            child: GetBuilder<LogoPickerController>(
                init: LogoPickerController(),
                initState: (_) ,  //NOT NEEDED
                builder: (controller) 
                  if (controller.image?.value != null) 
                    return CircleAvatar(
                      radius: 30,
                      child: ClipOval(
                          child: Image.file(
                        controller.image?.value ?? File(""),
                        width: 200,
                        height: 200,
                        fit: BoxFit.fill,
                      )),
                    );
                   else 
                    return const EntityLogoPickerWidget();
                  
                ),
          ),

【讨论】:

但当用户选择图像时,此小部件不会重建 UI。如果我选择图像没有任何变化,当我进行热重载时,图像会出现@Krish Bhanushali @winter 你能分享你的控制器吗? 我将控制器的值更改为不可观察,感谢您的回答很有帮助。

以上是关于在构建 GetX<LogoPickerController>(控制器:'LogoPickerController' 的实例,标签:null,有构建器,脏的主要内容,如果未能解决你的问题,请参考以下文章

GetX - 如何用新路线替换旧路线?

如何使用 GetX 使用 Firestore 流填充列表

颤振:如何将蜂巢监视绑定到 getx 中的 RxList 对象

如何在彼此内部使用 2 个 getx 控制器?

Obx 不更新 RangeSlider GetX

Flutter开发 - 使用GetX框架实现类似MVVM架构