是否可以根据 Mobx 中的 DateTime.now 计算出 属性?
Is it possible to have a computed property based on DateTime.now in Mobx?
我目前正在 Dart/Flutter 中尝试这个,但我认为这个概念在其他语言中是相同的。
考虑到 'expires' 收到一个表示从现在起 2 天后的日期,因此 'expired' 为 true,并且在 2 天过去后应更改为 false。
@observable
DateTime expires;
@computed
bool get expired =>
expires == null ||
expires.difference(DateTime.now()).inSeconds <= 0;
当 运行 应用程序时,此 属性 不会从 true 变为 false,但在我的单元测试中,它会,这就是为什么我不知道这是否可能或没有。
单元测试参考:
test('when expires pass its due date, it should trigger expired',
() async {
state.changeExpires(
DateTime.now().add(const Duration(seconds: 3)),
);
expect(
state.hasTokenExpired,
isFalse,
reason:
'because expires ${state.expires.toIso8601String()} should be in the interval expected to not be expired',
);
await Future.delayed(const Duration(seconds: 3));
expect(
state.hasTokenExpired,
isTrue,
reason:
'because expired ${state.expires.toIso8601String()} has not expired',
);
});
对于 JS,有一个很好的实用程序库 mobx-utils
具有类似的功能 now()
,它将更新所有观察者、反应等
https://github.com/mobxjs/mobx-utils/blob/master/src/now.ts
也许您可以尝试为 Dart 实现它。
解决方案可以通过流来实现。这是一个例子 direct reference from mobx's flutter repository.
class TimeStore = _TimeStoreBase with _$TimeStore;
abstract class _TimeStoreBase with Store {
@observable
DateTime expired = DateTime.now();
@observable
ObservableStream<DateTime> _time = Stream.periodic(Duration(seconds: 1))
.map((_) => DateTime.now())
.asObservable();
@computed
DateTime get now => _time.value ?? DateTime.now();
@computed
bool get expired => expires != null && expires.difference(now).inSeconds <= 0;
}
我目前正在 Dart/Flutter 中尝试这个,但我认为这个概念在其他语言中是相同的。
考虑到 'expires' 收到一个表示从现在起 2 天后的日期,因此 'expired' 为 true,并且在 2 天过去后应更改为 false。
@observable
DateTime expires;
@computed
bool get expired =>
expires == null ||
expires.difference(DateTime.now()).inSeconds <= 0;
当 运行 应用程序时,此 属性 不会从 true 变为 false,但在我的单元测试中,它会,这就是为什么我不知道这是否可能或没有。
单元测试参考:
test('when expires pass its due date, it should trigger expired',
() async {
state.changeExpires(
DateTime.now().add(const Duration(seconds: 3)),
);
expect(
state.hasTokenExpired,
isFalse,
reason:
'because expires ${state.expires.toIso8601String()} should be in the interval expected to not be expired',
);
await Future.delayed(const Duration(seconds: 3));
expect(
state.hasTokenExpired,
isTrue,
reason:
'because expired ${state.expires.toIso8601String()} has not expired',
);
});
对于 JS,有一个很好的实用程序库 mobx-utils
具有类似的功能 now()
,它将更新所有观察者、反应等
https://github.com/mobxjs/mobx-utils/blob/master/src/now.ts
也许您可以尝试为 Dart 实现它。
解决方案可以通过流来实现。这是一个例子 direct reference from mobx's flutter repository.
class TimeStore = _TimeStoreBase with _$TimeStore;
abstract class _TimeStoreBase with Store {
@observable
DateTime expired = DateTime.now();
@observable
ObservableStream<DateTime> _time = Stream.periodic(Duration(seconds: 1))
.map((_) => DateTime.now())
.asObservable();
@computed
DateTime get now => _time.value ?? DateTime.now();
@computed
bool get expired => expires != null && expires.difference(now).inSeconds <= 0;
}