有关 Android 生命周期的 ViewModel 和 LiveData,为什么谷歌设计只支持 Activity 和 Fragment - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
KratosOmega
V2EX    程序员

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

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

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

    我个人比较喜欢用 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 很有价值
    300
        8
    300  
       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
    rb6221
        10
    rb6221  
       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     Solana     953 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 19:32 PVG 03:32 LAX 12:32 JFK 15:32
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86