flutter- getx更新屏幕仅在热重加载后
有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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
如果您将可观察到的新的可观察到的新的观察者分配给_currentFilter,则getx不会被通知,因为以前可观察到的视图正在聆听没有更改。
如果将其更改为:
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:
GetX fires a method called refresh() that refreshes the view.