Flutter - Getx 仅在热重载后更新屏幕
Flutter - Getx update screen only after hot reload
有3个按钮,我想在点击的时候改变点击按钮的颜色
我使用 obx 管理 _currentFilter 变量,并在每次单击按钮时使用 changeFilter() 函数更改 _currentFilter 值。
而UI部分使用Obx来检测变化的值并改变颜色。
但是,单击每个按钮会更改 _currentFilter 的值,但不会更新 UI。
只有热重载会改变按钮文本的颜色。
为什么 Obx 没有检测到 UI 中的 _currentFilter 值已更改?
不知道为什么只有在做Hot Reload的时候才会在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;
}
}
如果您将新的 observable 分配给 _currentFilter,GetX 将不会收到通知,因为该视图正在侦听的先前 observable 没有更改。
如果您将其更改为:
_currentFilter.value = filter;
GetX 触发一个名为 refresh() 的方法来刷新视图。
有3个按钮,我想在点击的时候改变点击按钮的颜色
我使用 obx 管理 _currentFilter 变量,并在每次单击按钮时使用 changeFilter() 函数更改 _currentFilter 值。
而UI部分使用Obx来检测变化的值并改变颜色。
但是,单击每个按钮会更改 _currentFilter 的值,但不会更新 UI。
只有热重载会改变按钮文本的颜色。
为什么 Obx 没有检测到 UI 中的 _currentFilter 值已更改?
不知道为什么只有在做Hot Reload的时候才会在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;
}
}
如果您将新的 observable 分配给 _currentFilter,GetX 将不会收到通知,因为该视图正在侦听的先前 observable 没有更改。 如果您将其更改为:
_currentFilter.value = filter;
GetX 触发一个名为 refresh() 的方法来刷新视图。