Насколько я понимаю, вы должны быть в состоянии помочь себе, используя каналы платформы .
Основываясь на нашем опыте работы со встроенными представлениями Flutter, мы передаем токены аутентификации. через каналы платформы с помощью MethodChannel
.
Учитывая, что вы используете Add-to-App от Flutter, я предполагаю, что у вас уже есть работающее приложение в нативном коде. В этом случае вы должны иметь возможность аутентифицировать пользователя, используя Firebase Auth для стороны Android и iOS, отдельно .
Например:
Предполагая что вы используете Kotlin, вот как вы передаете токен Dart после аутентификации пользователя с использованием кода Android.
firebase_login.kt
// Method to authenticate your user in Android
fun firebaseLogin() {
...
// Some callbacks from the Android side
this.authenticateUserInFlutter("someTokenFromFirebase")
}
// @param token Can also be in a form of JSON object
func authenticateUserInFlutter(token: String) {
val methodName = "authenticateUser"
channel.invokeMethod(methodName, token, object: MethodChannel.Result {
override fun success(result: Any?) {
Log.i("MSG", "$result")
}
override fun error(code: String?, msg: String?, details: Any?) {
Log.e("MSG", "$methodName failed: $msg")
}
override fun notImplemented() {
Log.e("MSG", "$methodName not implemented")
}
})
}
И если вы используете Swift для iOS части.
FirebaseLogin.swift
func firebaseLogin() {
...
// Some callbacks from the iOS side
self.authenticateUserInFlutter("someTokenFromFirebase")
}
fun authenticateUserInFlutter(token: String) {
let methodName = "authenticateUser"
channel.invokeMethod(methodName, arguments: value) {
(result: Any?) -> Void in
if let error = result as? FlutterError {
os_log("%@ failed: %@", type: .error, methodName, error.message!)
} else if FlutterMethodNotImplemented.isEqual(result) {
os_log("%@ not implemented", type: .error, methodName)
} else {
os_log("%@", type: .info, result as! NSObject)
}
}
}
Наконец, вы сможете захватить существующие токены входа из родная сторона в вашем коде Dart. Вы можете использовать его для аутентификации вашего пользователя, используя firebase_auth для Flutter.
my_platform_channels_handler.dart
channel.setMethodCallHandler((MethodCall call) async {
switch (call.method) {
case 'authenticateUser':
val token = "${call.arguments}"; // You can also receive JSON arguments here
// Start authenticating the user
final AuthCredential credential = GoogleAuthProvider.getCredential(
accessToken: token,
idToken: ...,
);
final FirebaseUser user = (await _auth.signInWithCredential(credential)).user;
// Be able to reply to catch the errors here
return null;
case 'someMethodFromNative':
print("someMethodFromNative method invoked from the native code!")
return null;
default:
throw MissingPluginException();
}
});
ПРИМЕЧАНИЕ. Вы должны иметь возможность Храните токены на обоих концах и управляйте ими должным образом, как в собственном, так и в Dart, так что взаимодействие с пользователем будет беспроблемным, когда пользователь переключается между нативным и встроенным представлениями Flutter. 1041 * Подробнее о: