alibaba / fish-redux

An assembled flutter application framework.
https://github.com/alibaba/fish-redux
Apache License 2.0
7.33k stars 843 forks source link

怎么实现 Timer 功能, 时间更新后需要在页面上显示, setState这个用 didUpdateWidget调用的时候怎么调进去 #606

Closed xinpiaoyuanfang closed 4 years ago

xinpiaoyuanfang commented 4 years ago

怎么实现 Timer 功能, 时间更新后需要在页面上显示, setState这个用 didUpdateWidget调用的时候怎么调进去。 原生代码: image

view.dart image

effect.dart image

不知道怎么实现了,reducer里面我试各种赋值,都赋不过来

zjuwjf commented 4 years ago

页面结束对timer取消的逻辑不能在view里处理呢,应该怎么去实现呢

伪代码

方案1: 不额外保持Timer变量

void _onInit(Action action, Context<T> ctx) {
  const timeout = Duration(seconds: 3);
  final timer = Timer(timeout, () {
   /// your run loop
  });

 /// 在组件销毁时,退出
  ctx.registerOnDisposed(() {
    timer.cancel();
  });

}

方案2: 通过LocalProps保持Timer变量, 方便需要的时候获取 注:将Timer保存在State中也是可以的,但是冲状态层来看,不纯粹。

class MyLocalProps extends LocalProps<MyLocalProps> {
  Timer timer;

  MyLocalProps(Context<Object> ctx) : super(ctx);

  factory MyLocalProps.of(ExtraData ctx) {
    return LocalProps.provide((_) => MyLocalProps(_)).of(ctx);
  }

  @override
  void destructor(Context<Object> ctx) {
    timer?.cancel();
  }
}

void _onInit(Action action, Context<T> ctx) {
  const timeout = Duration(seconds: 3);
  ComponentLocalProps.of(ctx).timer = Timer(timeout, () {
   /// your run loop
  });

 /// 在改组件的任意的effect,或者View中,都可以获取到ComponentLocalProps.of(ctx).timer 执行操作
}
zjuwjf commented 4 years ago

282