我開始在一個新的專案上作業,該專案100%使用Jetpack compose撰寫,這意味著我們沒有任何片段,而且我們也在遵循單一活動模式。
現在我必須實作Facebook的登錄,但是我被卡住了,因為他們仍然在使用被廢棄的onActivityResult,而不是新的合同api。
這是我試圖follow的檔案,如果有任何幫助,我們將不勝感激。
謝謝大家,
uj5u.com熱心網友回復:
你必須等待這個問題得到解決。
現在你可以使用callbackManager從你的活動向下傳遞到使用CompositionLocalProvider的Compose樹,像這樣:
val LocalFacebookCallbackManager =
staticCompositionLocalOf<CallbackManager> { error("No CallbackManager provided"/span>) }
class MainActivity : FragmentActivity(){
private var callbackManager = CallbackManager.Factory.create()。
override fun onCreate(sedInstanceState: Bundle? ){
super.onCreate(s savedInstanceState)
setContent {
主題 {
CompositionLocalProvider(
LocalFacebookCallbackManager提供 callbackManager
) {
LoginScreen()
}
}
}
}
override fun onActivityResult( requestCode: Int, resultCode: Int, data: Intent?) {
callbackManager.onActivityResult(requestCode, resultCode, data)
super.onActivityResult(requestCode, resultCode, data)
}
}
@Composable[/span
fun LoginScreen() {
val callbackManager = LocalFacebookCallbackManager.current
DisposableEffect(Unit) {
LoginManager.getInstance().registerCallback(
callbackManager,
object : FacebookCallback< LoginResult> {
override fun onSuccess(loginResult。LoginResult) {
println("onSuccess $loginResult")
}
override fun onCancel() {
println("onCancel")
}
override fun onError(exception: FacebookException) {
println("onError $exception")
}
}
)
onDispose {
LoginManager.getInstance().unregisterCallback(callbackManager)
}
}
val context = LocalContext.current
按鈕(onClick = {
LoginManager.getInstance()
.logInWithReadPermissions(context.findActivity(), Arrays.asList("public_profile") )。
}) {
Text("FB Login")
}
}
fun Context.findActivity()。活動? = when (this) {
is Activity -> this
is ContextWrapper -> baseContext.findActivity()。
else -> null[/span]。
}
更普遍的解決方案是將FACEBOOK邏輯移到視圖模式中,并通過,然后你必須創建自己的回呼管理器,類似這樣:
ActivityResultCallbackManager.kt
val LocalActivityResultCallbackManager =
staticCompositionLocalOf<ActivityResultCallbackManager> { error("No ActivityResultCallbackManager provided") }
interface ActivityResultCallbackI{
fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?)。Boolean。
}
class ActivityResultCallbackManager {
private val listeners = mutableListOf<ActivityResultCallbackI>()
fun addListener(listener : ActivityResultCallbackI) {
listeners.add(listener)
}
fun removeListener(listener : ActivityResultCallbackI) { listeners.add(listener)
listeners.remove(listener)
}
fun onActivityResult(requestCode。Int, resultCode: Int, data: Intent?) : Boolean =
listeners.any { it.onActivityResult(requestCode, resultCode, data) }
}
MainActivity.kt
class MainActivity : AppCompatActivity(){
private var callbackManager = ActivityResultCallbackManager()
override fun onCreate(sedInstanceState: Bundle? ){
super.onCreate(s savedInstanceState)
WindowCompat.setDecorFitsSystemWindows(window, false)
設定內容 {
主題 {
CompositionLocalProvider(
LocalActivityResultCallbackManager提供 callbackManager
) {
LoginScreen()
}
}
}
}
override fun onActivityResult(
requestCode。Int,
resultCode: Int,
data: Intent?
){
if (!callbackManager.onActivityResult(requestCode, resultCode, data)) {
super.onActivityResult(requestCode, resultCode, data)
}
}
}
FacebookLoginViewModel.kt
class FacebookLoginViewModel : ViewModel(), activityResultCallbackI {
sealed class LoginState {
object Initial: LoginState()
object 處理。登錄狀態()
data class Success(val loginResult: LoginResult) 。登錄狀態()
data class Error(val exception: FacebookException): 登錄狀態()
}
private var callbackManager = CallbackManager.Factory.create()
var state by mutableStateOf<LoginState> (LoginState.Initial)
privateset
init {
LoginManager.getInstance().registerCallback(
callbackManager。
object : FacebookCallback< LoginResult> {
override fun onSuccess(loginResult。LoginResult) {
state = LoginState.Success(loginResult)
}
override fun onCancel() {
state = LoginState.Initial
}
override fun onError(exception: FacebookException) {
state = LoginState.Error(exception)
}
}
)
}
override fun onCleared() {
super.onCleared()
LoginManager.getInstance().unregisterCallback(callbackManager)
}
override fun onActivityResult( requestCode: Int, resultCode: Int, data: Intent?)。Boolean =
callbackManager.onActivityResult(requestCode, resultCode, data)
fun login(context: Context){
state = LoginState.Processing
LoginManager.getInstance()
.logInWithReadPermissions(context.findActivity(), Arrays.asList("public_profile") )。
}
LoginScreen.kt
@Composable。
fun LoginScreen() {
val viewModel: FacebookLoginViewModel = viewModel()
val callbackManager = LocalActivityResultCallbackManager.current
DisposableEffect(Unit) {
callbackManager.addListener(viewModel)
onDispose {
callbackManager.removeListener(viewModel)
}
}
val context = LocalContext.current
欄目 {
Text(viewModel.state.toString())
按鈕(onClick = {
viewModel.login(context)
}) {
Text("FB Login")
}
}
}
您還可以嘗試構建這個分叉,它包含來自這個拉動請求的變化。它增加了對合同api的支持,并且尚未被接受。仔細檢查這些變化,它并不是官方的!
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/309893.html
標籤:
下一篇:JSSDK未知主機域
