从Android中的ViewModel调用onResume()。
#kotlin #android #mobile #tristan

目录

  1. The problem I am solving
  2. Solution
  3. Lifecycle observer
  4. LifecycleOwner
  5. Making it work
  6. Removing the observer

我在Google Playstore上的应用程序

github代码

我试图解决的问题

  • 因此,当我将订阅集成到我的Android应用中时,在谈论Fetching Purchases时,文档的特定行很突出:

To handle these situations, be sure that your app calls BillingClient.queryPurchasesAsync() in your onResume() method to ensure that all purchases are successfully processed as described in processing purchases.

  • 提出了how and where do I call the onResume() method的问题。

解决方案

  • 我发现处理此操作的两种主要方法是:

1)副作用:使用DisposableEffect在您的撰写代码中调用onResume()

2)生命周期观察者:创建一个DefaultLifecycleObserver以在我的ViewModel内部调用onResume()(我选择了此版本)

2)生命周期观察者

  • 现在,当我们说要创建一个Lifecycle observer时,我们说我们正在创建一个类,该类将观察某个组件的Android生命周期(例如片段的活动)。生命周期观察者有两个部分,1) the lifecycle observer2) the lifecycle owner

  • 为了创建生命周期观察者,我们需要让类实现DefaultLifecycleObserver接口,例如:

class BillingViewModel(): ViewModel(),DefaultLifecycleObserver {

 override fun onResume(owner: LifecycleOwner) {
       // do whatever you want
       refreshPurchases()
    }
}

  • 通过实现DefaultLifecycleObserver,我们已经使视图模型访问了LifecycleOwner's方法,例如onResume()和Android库现在将识别BillingViewModel的实例为生命周期观察者。

  • ,但是现在我们需要将生命周期观察者附加到生命周期

Lifecycleowner

  • 如果实现LifecycleOwner接口,则将其视为生命周期。在我的代码中,我使用的是片段,根据文档Fragment实现了生命周期的界面。

  • 所以现在我们有一个生命周期的人(片段)和一个LifeCycleObserver(BillingViewModel)我们需要附加它们。

使它起作用

  • 所以我的片段里看起来像这样:
class SubscriptionFragment : Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {



        val billingViewModel:BillingViewModel by activityViewModels()

        // THIS IS WHERE WE ARE CONNECTING THE TWO
        lifecycle.addObserver(billingViewModel)

   }

  • 将观察者添加到所有者的代码为lifecycle.addObserver(billingViewModel)。现在,这使我们的ViewModel访问了片段的生命周期方法

删除观察者

  • 您可能会注意到我没有删除观察者...好奇吗?我什至读过这样的教程,例如这个HERE,删除了观察者。但是,我发现This文档部分说明:

An observer added with a Lifecycle will be automatically removed if the corresponding Lifecycle moves to DESTROYED state.

  • 所以我决定不手动删除观察者,然后让Android系统处理它。

结论

  • 感谢您抽出宝贵的时间阅读我的博客文章。如果您有任何疑问或疑虑,请在下面发表评论或在Twitter上与我联系。