V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
KratosOmega
V2EX  ›  程序员

有关 Android 生命周期的 ViewModel 和 LiveData,为什么谷歌设计只支持 Activity 和 Fragment

  •  
  •   KratosOmega · 2022-07-29 19:58:22 +08:00 · 1859 次点击
    这是一个创建于 851 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,谷歌为什么这么设计呢?

    我个人比较喜欢用 view ,特别是 Activity 比较大,业务比较多时,喜欢拆分成各个部分变成自定义 view ,再自定义自己的 ViewModel 。

    可官方的 ViewModel 不源生支持自定义 view ,用 Fragment 的话又太重。

    12 条回复    2022-08-04 10:56:57 +08:00
    kwanzaa
        1
    kwanzaa  
       2022-07-29 20:08:59 +08:00   ❤️ 1
    你想把 VM 写 View 里去?我觉得你该重学 MVVM 了。。。
    KratosOmega
        2
    KratosOmega  
    OP
       2022-07-29 20:48:41 +08:00 via iPhone
    @kwanzaa 我是说为什么 view 不能像 activity 那样使用 viewmodel
    kwanzaa
        3
    kwanzaa  
       2022-07-29 23:43:58 +08:00
    @KratosOmega 因为 View 在生成和绘制只占有生命周期中的一小部分。你想用它 Host 数据的话。。。
    The ViewModel class is designed to store and manage UI-related data in a lifecycle conscious way.
    The ViewModel class allows data to survive configuration changes such as screen rotations.
    fromzero
        4
    fromzero  
       2022-07-30 00:32:51 +08:00
    因为 View 本身就没有完整的生命周期的概念,View 只有 attachWindow dettachWindow 这些,View 完全跟随 Fragment/Activity 的生命周期,View 属于 ui 组件,而不是 ui 容器,容器是用来装控件的,所以有生命周期的概念。而 ViewModel 的生成和销毁是需要伴随宿主的生命周期的。
    fromzero
        5
    fromzero  
       2022-07-30 00:36:05 +08:00
    非要给自定义 View 加上 ViewModel 也不是不行,可以用自定义 View 创建一个自定义的容器,然后给他加上完整的生命周期,实现 ViewModelStoreOwner 接口的方法。
    fromzero
        6
    fromzero  
       2022-07-30 00:39:39 +08:00
    但是最大的问题是,View 本身的生命周期就是依附于 Fragment/Activity 的,所以你不得不手动把生命周期往下传递给你的自定义 View 管理,挺麻烦的。
    KratosOmega
        7
    KratosOmega  
    OP
       2022-07-30 07:56:35 +08:00 via iPhone
    @fromzero 是的,从实现的角度来看是可以实现的,但是为什么官方不去实现
    是鼓励大家用 fragment 吗,但是这玩意又比 view 重很多
    至少我认为在 view 中使用 livedata 很有价值
    winterbells
        8
    winterbells  
       2022-07-30 08:54:45 +08:00 via Android
    jetpack comoose 里可以用 viewmodel ,虽然也是绑到 activity ,但看起来和用起来是绑到了 view
    KratosOmega
        9
    KratosOmega  
    OP
       2022-07-30 10:10:46 +08:00 via iPhone
    @winterbells 为了用 livedata 让整个 app 迁移到 compose 代价太大了,而且目前个人不太喜欢 compose
    janus77
        10
    janus77  
       2022-07-30 14:02:40 +08:00
    view 自己硬要说的话没有生命周期,他的生命周期是随着 Activity/Fragment 变化的
    KratosOmega
        11
    KratosOmega  
    OP
       2022-07-30 18:19:39 +08:00 via iPhone
    @janus77 是啊,要改的话,只能让 view 去感知 activity 的生命周期
    本身就 onAttach onDetach
    GLee9507
        12
    GLee9507  
       2022-08-04 10:56:57 +08:00
    Fragment 就是轻量级的 View 容器,OP 说的重指的是什么重呢?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5373 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 08:17 · PVG 16:17 · LAX 00:17 · JFK 03:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.