【问题标题】:Flutter GetX Obx "[Get] the improper use of a GetX has been detected." error on Appbar actionsFlutter GetX Obx “[Get] 已检测到对 GetX 的不当使用。”应用栏操作错误
【发布时间】:2021-12-14 19:04:42
【问题描述】:

我在 2 条路线中使用 Obs/Obx,一条运行良好,一条不行。控制器中有 2 个 obs 变量。

import 'package:get/get.dart';

class CountController extends GetxController {
  final vcount = 0.obs; 
  final ncount = 0.obs; 

  static CountController get to => Get.find<CountController>();

  @override
  void onInit() {
    super.onInit();
  }

  setVcount(int vehnum) {
    vcount(vehnum);
  }

  setNcount(int notenum) {
    ncount(notenum);
  }
}

我在应用程序抽屉 (vcount) 中的 ListTile 上使用的那个按预期工作。另一个是在 appbar 动作上,这是这个 appbar 上的唯一动作。如果 ncount 为 0,我想禁用 TextButton。

   appBar: AppBar(
      actions: <Widget> [
        Obx(() =>
          TextButton(
            child: _appBarChild(),
            onPressed: () => nCountController.ncount.value == 0 ? null : _switchView(),
            // onPressed: () => _switchView(),

          ),
        ),

      ], 
  )

ncount 值是从路由的子节点设置的。

nCountController.setNcount(_queryResult.length);

一切都是一样的,导入controller.dart,“final (nC)countController = CountController.to;”,设置obs vars等,唯一的区别是小部件的类型,但是当我运行它时,我得到了错误:

======== 小部件库捕获的异常=================================== ====================== 构建 Obx 时抛出以下消息(具有 builder,dirty,state:_ObxState#11cd1): [Get] 检测到 GetX 使用不当。 您应该只对将要更新的特定小部件使用 GetX 或 Obx。 如果您看到此错误,您可能没有在 GetX/Obx 中插入任何可观察变量 或将它们插入 GetX 认为适合更新的范围之外 (例如:GetX => HeavyWidget => variableObservable)。 如果您需要更新父窗口小部件和子窗口小部件,请将每个窗口小部件包装在 Obx/GetX 中。

我是否遗漏了什么或 Obx 在应用栏中不起作用?

【问题讨论】:

    标签: flutter observable flutter-getx


    【解决方案1】:

    使用onPressed: () =&gt; nCountController.ncount.value == 0 ? null : _switchView()实际上对视图没有做任何事情

    你应该使用onPressed: nCountController.ncount.value == 0 ? null : ()=&gt; _switchView()

    解释:()=&gt; nullnull 不一样。您必须通过 onPressed: null 才能禁用按钮,而不是 onPressed: ()=&gt; null

    【讨论】:

    • 只见树木不见森林!谢谢,我知道它必须是简单的。这解决了这个问题,但现在有一个“在构建期间调用的 setState() 或 markNeedsBuild()”。错误
    • 你试过Obx(()=&gt;nCountController.ncount.value == 0 ? TextButton(..., onPressed: null): TextButton(..., onPressed: ()=&gt; _switchView())如果仍然报同样的错误,那么可能与_switchView()方法有关。
    • 不能让它喜欢这样,但问题是孙子通过传递一个函数来刷新路由。我尝试将 TextButton 包装在 Visibility 小部件中,因为如果列表中没有任何内容,可以隐藏它,但这是同一个故事。如果我使用 Obx,它会抱怨“构建期间的 setState 或 markNeedsBuild”,但如果我不这样做,它显然不会随着列表的变化而刷新。正确的方法是什么?我尝试在传递的函数旁边传递一个值,但无法正常工作。
    • 在这种情况下,如果要隐藏 TextButton,为什么要使用 Visibility?您可以使用空白容器。
    • 使用可见性有什么问题?
    猜你喜欢
    • 2022-01-02
    • 2021-10-07
    • 1970-01-01
    • 2022-08-04
    • 2021-11-07
    • 2021-05-28
    • 2022-10-17
    • 1970-01-01
    • 2021-11-11
    相关资源
    最近更新 更多