【问题标题】:Ternary operator not changing state三元运算符不改变状态
【发布时间】:2021-12-30 13:58:09
【问题描述】:

有一个显示预定时间的文本,基本上,文本的颜色应该根据时间而改变,所以如果预定时间在未来,那么它不应该改变它的颜色,如果它是过去那么它的颜色颜色应变为红色。预定时间是通知应该出现的时间和通知出现的时间应该改变,三元操作正常工作但只有当我点击另一个小部件来改变它的状态时,它不会自行改变状态。我正在使用 getx,所以我也尝试了 Obx,但没有奏效。我该如何解决这个问题?

                 Visibility(
                            visible: todoController.todos[index].date ==
                                        '' &&
                                    todoController.todos[index].time == ''
                                ? false
                                : true,
                            child: Obx(() => Text(
                                (todoController.todos[index].date != now)
                                    ? '${todoController.todos[index].date!}, ${todoController.todos[index].time}'
                                    : 'Today, ${todoController.todos[index].time}',
                                style: GoogleFonts.notoSans(
                                  color: (run(
                                                  todoController
                                                      .todos[index].date,
                                                  todoController
                                                      .todos[index].time)
                                              .compareTo(tz.TZDateTime.now(
                                                  tz.local)) >
                                          0)
                                      ? Theme.of(context).hintColor
                                      : Colors.redAccent,
                                  fontSize: 20.0,
                                  decoration:
                                      (todoController.todos[index].done)
                                          ? TextDecoration.lineThrough
                                          : TextDecoration.none,
                                ))),
                          )

TodoController:

class TodoController extends GetxController {
 var todos = <Todo>[].obs;

 @override
 void onInit() {
  List? storedTodos = GetStorage().read<List>('todos');

if (storedTodos != null) {
  todos = storedTodos.map((e) => Todo.fromJson(e)).toList().obs;
}
ever(todos, (_) {
  GetStorage().write('todos', todos.toList());
});
super.onInit();
}}

【问题讨论】:

  • 请提供控制器代码以便更好地理解
  • 我正在使用 getx
  • 你用Obx包裹你的小部件了吗?
  • 是的,但没用
  • 向我们展示您是如何使用Obx 包装小部件的。

标签: flutter conditional-operator flutter-getx


【解决方案1】:

您需要将Obx 小部件向上移动并用它包裹Visibility 小部件:

Obx(()=> Visibility(....));

更新

这行有问题:

todos = storedTodos.map((e) => Todo.fromJson(e)).toList().obs;

您应该将数据分配给 Rx 变量值,而不是重新分配 Rx 变量本身:

todos.assignAll(storedTodos.map((e) => Todo.fromJson(e)).toList());

【讨论】:

  • 还是不行
  • 验证您的三元是否产生预期结果。
  • 它按预期工作,但唯一的问题是它不会改变状态,只有当我按下另一个小部件改变状态时,它才会改变它的状态
  • 知道了!检查更新的答案。
猜你喜欢
  • 2021-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-05
  • 2019-10-04
  • 2018-11-30
  • 1970-01-01
  • 2020-12-07
相关资源
最近更新 更多