chenenyu / lifecycle

Lifecycle support for Flutter widgets.
https://pub.dev/packages/lifecycle
Apache License 2.0
50 stars 6 forks source link

didPush和didPop不对应 #5

Closed JDongKhan closed 3 years ago

JDongKhan commented 3 years ago
 void didPush(Route<dynamic> route, Route<dynamic>? previousRoute) {
    super.didPush(route, previousRoute);
    log('LifecycleObserver($hashCode)#didPush('
        'route(${route.hashCode}): ${route.settings.name}, '
        'previousRoute(${previousRoute?.hashCode}): ${previousRoute?.settings.name})');

    if (previousRoute != null) {
      if (route is PageRoute) {
        // 上一个 route 触发 invisible
        _sendEventToGivenRoute(previousRoute, LifecycleEvent.invisible);
        if (previousRoute is PopupRoute) {
          // 上个 PageRoute 触发 invisible
          _sendEventToLastPageRoute(LifecycleEvent.invisible);
        }
      } else if (route is PopupRoute) {
        // 上一个 route 触发 inactive
        _sendEventToGivenRoute(previousRoute, LifecycleEvent.inactive);
      }
    }

    _routes.add(route);
  }

  @override
  void didPop(Route<dynamic> route, Route<dynamic>? previousRoute) {
    super.didPop(route, previousRoute);
    log('LifecycleObserver($hashCode)#didPop('
        'route(${route.hashCode}): ${route.settings.name}, '
        'previousRoute(${previousRoute.hashCode}): ${previousRoute?.settings.name})');

    // 当前 route 触发 pop
    _sendEventToGivenRoute(route, LifecycleEvent.pop);
    _routes.remove(route);

    if (previousRoute != null) {
      if (route is PageRoute) {
        // 上一个 Route 触发 active
        _sendEventToGivenRoute(previousRoute, LifecycleEvent.active);
        if (previousRoute is PopupRoute) {
          // 上一个 PageRoute 触发 visible
          _sendEventToLastPageRoute(LifecycleEvent.visible);
        }
      } else if (route is PopupRoute) {
        // 上一个 Route 触发 active
        _sendEventToGivenRoute(previousRoute, LifecycleEvent.active);
      }
    }
  }

_sendEventToGivenRoute 方法LifecycleEvent.active和LifecycleEvent.invisible不对应

chenenyu commented 3 years ago

感谢反馈 invisible是页面不可见,visible是页面可见,active是页面可见并且可交互。你是指哪里不对应

JDongKhan commented 3 years ago

@chenenyu 理论上前面的页面出现了invisible,回来的时候要visible,invisible和visible对应,而不应该是active。

active和inactive对应。这样业务逻辑才能成对处理。

chenenyu commented 3 years ago

是的,这块已经重构修改了,今天晚点时候会推上去。感谢反馈

JDongKhan commented 3 years ago

@chenenyu 好的,多谢。

JDongKhan commented 3 years ago

现在有一个问题,就是遇到tabbarView的时候,我在tabbarview里面有一个视频页面,视频页面跳转到下一个页面会暂停再返回继续播放,这个逻辑正常。 但是tabbarview切到其他非视频页面,然后跳转到下一个页面再返回就会导致已经不可见的视频重新播放了。

目前我拓展了tabbarview切换时的生命周期,切换后对应的页面会收到invisible和visible。 所以目前我希望跳转的时候是active和inactive,这样我可以在回来的时候判断页面是否visible, 如果处于invisible就不播放。 当然如果您这边跳转状态改成invisible和visible,我这边就需要将tabbarview切换改成active和inactive,这样避免场景无法区分。

不知道您在tabbarview这块有什么好的方案?

chenenyu commented 3 years ago

你描述的有点复杂,重构的版本模拟了原生应用的生命周期,到时候你试下看看行不行

JDongKhan commented 3 years ago

好的,多谢

chenenyu commented 3 years ago

Try 0.3.0.