You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级Braintree SDK初始化GooglePayClient遇生命周期错误求助

解决Braintree SDK谷歌支付初始化的生命周期错误

问题原因

报错LifecycleOwners must call register before they are STARTED是因为你在Fragment进入STARTED状态之后(onActivityCreated()执行完毕后)才初始化GooglePayClient,而它内部要求LifecycleOwner的注册操作必须在STARTED状态之前完成。

解决方案

1. 提前API调用时机

把获取clientToken的API调用从onActivityCreated()移到onCreate()中,这样在Fragment仍处于CREATED状态时就能拿到token,进而完成客户端初始化,避开STARTED状态的限制。

2. 改用Fragment的View生命周期所有者

用viewLifecycleOwner替代activity!!作为LifecycleOwner,更贴合Fragment自身的生命周期,避免和Activity生命周期不同步的问题。

修改后的代码示例

private lateinit var clientToken: String
private lateinit var braintreeClient: BraintreeClient
private lateinit var googlePayClient: GooglePayClient

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    arguments?.let {
        paymentOptions = it.getSerializable(KEY_PAYMENT_METHODS) as? ArrayList<String>?
    }
    // 提前在这里发起API请求获取clientToken
    presenter.getPaymentOptionsWithClientToken(paymentOptions)
}

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    // 这里不再处理API请求,只做视图相关初始化
}

override fun setupPaymentOptionsWithClientToken(paymentOptionsWithClientToken: Pair<List<String>, String>) {
    val availablePaymentMethods = paymentOptionsWithClientToken.first.toMutableList()
    clientToken = paymentOptionsWithClientToken.second

    initBrainTreeClients()
}

private fun initBrainTreeClients(): Boolean {
    if (clientToken.isNotEmpty()) {
        // 使用viewLifecycleOwner作为上下文,更贴合Fragment生命周期
        braintreeClient = BraintreeClient(requireContext(), clientToken)
        googlePayClient = GooglePayClient(viewLifecycleOwner, braintreeClient)
        googlePayClient.setListener(this)
        return true
    }
    return false
}

备选方案:监听生命周期状态

如果无法提前API调用,可以通过监听Fragment的生命周期,确保在STARTED状态之前完成客户端初始化:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    arguments?.let {
        paymentOptions = it.getSerializable(KEY_PAYMENT_METHODS) as? ArrayList<String>?
    }

    viewLifecycleOwner.lifecycle.addObserver(object : DefaultLifecycleObserver {
        override fun onCreate(owner: LifecycleOwner) {
            super.onCreate(owner)
            presenter.getPaymentOptionsWithClientToken(paymentOptions)
        }

        override fun onStart(owner: LifecycleOwner) {
            super.onStart(owner)
            // 确保在STARTED之前完成初始化,若token已获取则初始化
            if (::clientToken.isInitialized && clientToken.isNotEmpty()) {
                initBrainTreeClients()
                // 初始化完成后移除观察者
                owner.lifecycle.removeObserver(this)
            }
        }
    })
}

内容的提问来源于stack exchange,提问作者Shailesh Saindane

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 07:55:18