flutter- getx更新屏幕仅在热重加载后

发布于 2025-02-03 15:06:09 字数 1351 浏览 5 评论 0原文

有3个按钮,当我单击它时,我想更改单击按钮的颜色。

我使用obx管理_currentFilter变量,并每次单击按钮时使用the changefilter()函数更改_currentFilter值。

UI部分使用OBX检测变化的值并更改颜色。

但是,单击每个按钮会更改_currentFilter的值,但不会更新UI。

只有热重新加载才能更改按钮文本的颜色。

为什么OBX不检测到UI中的_currentFilter值已更改?

我不知道为什么仅在进行热加载时才能在UI中反映它。

请帮忙。

UI

class FilterButtons extends GetView<TodoController> {
  const FilterButtons({Key? key}) : super(key: key);

  Widget filterButton(FilterEnum filter) {
    return TextButton(
      onPressed: () => controller.changeFilter(filter),
      child: Obx(() {
        final color = controller.filter == filter ? Colors.blueAccent : Colors.grey;
        return Text(filter.name, style: TextStyle(fontSize: 20, color: color));
      }),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Row(
      mainAxisAlignment: MainAxisAlignment.spaceBetween,
      children: [
        filterButton(FilterEnum.ALL),
        filterButton(FilterEnum.ACTIVE),
        filterButton(FilterEnum.COMPLETED),
      ],
    );
  }
}

控制器

class TodoController extends GetxController {
  var _currentFilter = FilterEnum.ALL.obs;

  get filter => _currentFilter;

  void changeFilter(FilterEnum filter) {
    _currentFilter = filter.obs;
  }
}

There are 3 buttons and I want to change the color of the clicked button when I click it.

I manage the _currentFilter variable using obx and change the _currentFilter value using the changeFilter() function every time I click the button.

And the UI section used Obx to detect the changed value and change the color.

However, clicking each button changes the value of _currentFilter, but does not update the UI.

Only Hot Reload will change the color of the button text.

Why doesn't Obx detect that the _currentFilter value has changed in the UI?

I don't know why it is reflected in the UI only when doing Hot Reload.

Please Help.

UI

class FilterButtons extends GetView<TodoController> {
  const FilterButtons({Key? key}) : super(key: key);

  Widget filterButton(FilterEnum filter) {
    return TextButton(
      onPressed: () => controller.changeFilter(filter),
      child: Obx(() {
        final color = controller.filter == filter ? Colors.blueAccent : Colors.grey;
        return Text(filter.name, style: TextStyle(fontSize: 20, color: color));
      }),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Row(
      mainAxisAlignment: MainAxisAlignment.spaceBetween,
      children: [
        filterButton(FilterEnum.ALL),
        filterButton(FilterEnum.ACTIVE),
        filterButton(FilterEnum.COMPLETED),
      ],
    );
  }
}

Controller

class TodoController extends GetxController {
  var _currentFilter = FilterEnum.ALL.obs;

  get filter => _currentFilter;

  void changeFilter(FilterEnum filter) {
    _currentFilter = filter.obs;
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

爱本泡沫多脆弱 2025-02-10 15:06:09

如果您将可观察到的新的可观察到的新的观察者分配给_currentFilter,则getx不会被通知,因为以前可观察到的视图正在聆听没有更改。
如果将其更改为:

_currentFilter.value = filter;

getX开心一种称为Refresh()的方法,可以刷新视图。

if you assign new observable to _currentFilter, GetX won't get notified because previous observable that view is listening to didn't change.
if you change it to:

_currentFilter.value = filter;

GetX fires a method called refresh() that refreshes the view.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文