三元运算符不改变状态

Posted

技术标签:

【中文标题】三元运算符不改变状态【英文标题】: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 包装小部件的。 【参考方案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());

【讨论】:

还是不行 验证您的三元是否产生预期结果。 它按预期工作,但唯一的问题是它不会改变状态,只有当我按下另一个小部件改变状态时,它才会改变它的状态 知道了!检查更新的答案。

以上是关于三元运算符不改变状态的主要内容,如果未能解决你的问题,请参考以下文章

Javascript三元运算符语法不理解[重复]

在反应中更新三元运算符内的状态

三元运算符如何比较 JavaScript 中的字符和数字?

Python 使用带有 for 循环的三元运算符

有没有更好(更干净)的方法来使用三元运算符(不重复代码)编写这个 JS 代码?

为啥我的三元运算符会出现这些错误?