升级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
相关产品推荐
相关产品推荐

