Android Facebook 登录,callbackManager 尚未在 onActivityResult 中初始



我关注了Facebook API上的文档。 关于片段的描述很少。

如何解决此错误...?

我试过碎片, [btnFacebook.setFragment(this(]

在活动中, [ProfileFragment((.onActivityResult(requestCode, resultCode, data(]

class ProfileFragment : BaseFragment() {
private lateinit var profileViewModel: ProfileViewModel
val RC_SIGN_IN = 9001
val TAG = "@@@ ProfileF"
lateinit var callbackManager: CallbackManager
lateinit var firebaseAuth: FirebaseAuth
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
profileViewModel = ViewModelProviders.of(this).get(ProfileViewModel::class.java)
val root = inflater.inflate(R.layout.fragment_profile, container, false)
firebaseAuth = FirebaseAuth.getInstance()
callbackManager = CallbackManager.Factory.create()
var btnFacebook = root.findViewById<com.facebook.login.widget.LoginButton>(R.id.btn_profile_facebook)
btnFacebook.setFragment(this)
initFacebook(btnFacebook)
return root
}
private fun initFacebook(btnFacebook: LoginButton) {
btnFacebook.setPermissions("email", "public_profile")
btnFacebook.registerCallback(callbackManager, object : FacebookCallback<LoginResult> {
override fun onSuccess(result: LoginResult?) {
Log.d(TAG, "facebook:onSuccess: $result")
handleFacebookAccessToken(result!!.accessToken)
}
override fun onCancel() {
Log.d(TAG, "facebook:onCancel...")
}
override fun onError(error: FacebookException?) {
Log.d(TAG, "facebook:onError...${error.toString()}")
}
})
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
callbackManager.onActivityResult(requestCode, resultCode, data)
}
private fun handleFacebookAccessToken(token: AccessToken) {
Log.d(TAG, "handleFacebookAccessToken: $token")
val credential = FacebookAuthProvider.getCredential(token.getToken());
firebaseAuth.signInWithCredential(credential)
.addOnCompleteListener(activity as MainActivity, object : OnCompleteListener<AuthResult> {
override fun onComplete(task: Task<AuthResult>) {
if (task.isSuccessful()) {
// 로그인 성공
Log.d(TAG, "Facebook Login Success!!!")
} else {
// 로그인 실패
Log.d(TAG, "Facebook Login Fail...")
}
}
})
}
}
class MainActivity : BaseActivity() {
val TAG = "@@@ Main"
val mContext = this
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val navView: BottomNavigationView = findViewById(R.id.nav_view)
val navController = findNavController(R.id.nav_host_fragment)
navView.setupWithNavController(navController)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
Log.d(TAG, "onActivityResult!!! ${requestCode} / ${resultCode} ")
ProfileFragment().onActivityResult(requestCode, resultCode, data)
}
}

原因:科特林。UninitializedPropertyAccessException: lateinit 属性 callbackManager 尚未初始化

在主活动的 onActivityResult 方法中,您将结果发送到新创建的ProfileFragment(),而不是已经附加的片段。

因此,在MainActivity的onActivityResult方法中进行以下修改。

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment)
val currFragment = navHostFragment?.childFragmentManager?.fragments?.get(0)
if (currFragment is HomeFragment) {
currFragment.onActivityResult(requestCode, resultCode, data)
}
super.onActivityResult(requestCode, resultCode, data)
}

最新更新