cwkProject / lifecycle

模仿Android lifecycle 的dart版本
4 stars 0 forks source link

关于此库的一些疑问 #1

Closed imyyq-star closed 5 years ago

imyyq-star commented 5 years ago

Hi,我在学习Flutter的时候看到了这个库,觉得非常棒,因为我习惯了Android的Jetpack。但我有以下的疑问,望解答我的疑惑: 1、Flutter有Redux功能,实践后发现比较麻烦,还不如LiveData来的方便快捷,而且LiveData也容易进行视图与逻辑分离,你对于Redux和此库的区别怎么看呢?

2、使用此库的时候,我发现LiveData更新后,只要state还存在,不管生命周期是pause还是resume的,都会响应,而Android的LiveData是真正的生命周期感知,即一旦Activity不可见,更新LiveData不会马上响应,而会等到用户回到该Activity,resume的时候才会响应。此举在我看来非常有意义,因为这样不会浪费性能。你觉得Flutter能不能做到这样呢?或者有必要做到这样吗?

以上!谢谢。

imyyq-star commented 5 years ago

另外,如果LiveData的类型是List之类的,更改value的不会导致listen更新吗?比如clear或者add

39251474 commented 5 years ago

此库不建议继续使用,虽然它已经完成,但是在纯flutter项目中是没有必要的,在flutter的构建机制中并不需要Android的lifecycle特性,因为flutter天生就做的很好,不需要这样的补丁特性。此库的初衷是公司项目使用dart为核心语言,使用flutter ,dart angular 来跨移动端、桌面端、web端,三个环境三个项目,但是共享部分基础功能和业务逻辑,需要UI松耦合的库来支持。所以只用flutter来开发移动客户端不需要此库。

39251474 commented 5 years ago

熟悉flutter后你会发现此库不是必须的,State的生命周期与Activity的生命周期不同,它没有严格意义的pause状态,或者说我们在实现State时无法方便的监听此State是否处于不可见状态,deactivate和didChangeDependencies并不像你想的那样工作,他们不能作为可视状态的生命周期函数,所以此库在State不可见时也会收到通知(为了数据的正确性),万幸的是不可见setState调用会被忽略。

39251474 commented 5 years ago

Redux的理念对于初次使用的人确实比较复杂,如果你以前从事过web开发或者React Native开发可能就比较容易理解,redux专门用于简化响应式UI框架的数据管理和传递。使用redux可以用简单的代码来完成复杂的数据传递和分发场景。但是它本身也比较复杂,如果项目的绝大部分功能的内部没有复杂的数据交互和传递则没有必要使用redux,轻量级的Scope model也能满足绝大部分需求,或者像我一样不借用第三方库,flutter本身的InheritedWidget就能满足我的需求,而且我觉得使用起来也不复杂,redux和scope_model的核心就是基于InheritedWidget实现的,其实就是封装拓展。他们共同的目的是解决widget树中传递数据的问题。

39251474 commented 5 years ago

我的lifecycle库没有用到InheritedWidget是为了跨flutter外的其他框架,但是因此也有了一定的局限性。 lifecycle库的另一个作用就是具有生命周期感知能力,即可以拥有state的初始化和销毁的生命周期,方便写一些与state状态同步的自动管理功能组件。这一点在flutter中也有现成的解决方案,dart的mixin特性就能解决,lifecycle_flutter其实就是使用此特性实现的。

39251474 commented 5 years ago

至于livedata特性其实是使用dart的Stream和mixin特性混合实现的,大多数时候我们自己写个Stream配合StreamBuilder就能很好的完成需求。而且在widget树中可以使用NotificationListener来实现冒泡通知。由于flutter是响应式UI框架,所以往往数据源已经绑定在了UI上,所以我们更多时候的只是需要发送一个刷新的通知让Satate执行setState而已,所以livedata有些画蛇添足。

39251474 commented 5 years ago

最后是viewmodel,这个东西的角色定位和State完全一致,实现机制也一样。State就相当于MVVM模式中的ViewModel。使用flutter要跳出android的标记语言布局思想,在响应式UI框架中UI的布局完全是由数据驱动的,数据和UI是密不可分的,所以没必要费尽心思去拆分UI代码、数据代码和业务代码(根据情况判断是否独立处理逻辑),他就像是Android中的databinding,但是databinding是补丁式机制,而flutter是原生特性,所以没有那些臃肿的模板代码。

imyyq-star commented 5 years ago

好的,感谢你的回复,我明白了。