Использование платформо-зависимых пакетов во Flutter
Я не уверен, является ли это подходящим сайтом обмена стека, но я думаю, что он подходит здесь больше, чем другие, которые я могу придумать. В любом случае, я работаю в команде разработчиков мобильных приложений, и мы планируем использовать Flutter для разработки наших будущих мобильных приложений, поскольку это сокращает объем работы, необходимой при разработке для iOS и Android (мы всего лишь небольшая команда).
Я прочитал немного о Flutter и проверил доступные пакеты и Dart/Flutter Pub, и есть некоторые пакеты, которые еще не доступны для Flutter, которые мы используем для Android и iOS. Возьмите MSAL (Microsoft Authentication Library), например. Прочитав документацию, я прочитал о каналах платформы и о том, как вы можете запустить некоторый специальный код KT/Swift и т. Д. И вернуть его через что-то вроде MethodChannel
в Kotlin, но пример из документов Flutter показывает пример только возвращения определенных типов данных или простых значений. Что если я хочу аутентифицировать пользователя с помощью MSAL? это потребовало бы некоторой работы с пользовательским интерфейсом, которая не происходит во Flutter, в частности, потому что она зависит от браузера или веб-просмотра (в зависимости от конфигурации MSAL)
Мой вопрос здесь, вероятно, будет в 2 основных вещах:
- Если у вас есть пакет, который опирается на пользовательский интерфейс iOS или Android для чего-то, что не займет все функции вашего приложения, как можно было бы по-прежнему использовать Flutter для разработки остальных ваших приложений, пока все еще используете пакеты для конкретной платформы?
- Можно ли иметь более 1 Activity или ViewController, который делает это, а затем переходить к части Flutter? Потому что я думаю, что это одно из возможных решений предыдущего вопроса.
Примечание:
Я знаю, что в Dart Pub есть пакеты для аутентификации, но я просто использую MSAL в качестве примера, мы также используем другие пакеты, которые полагаются на отображение пользовательских представлений для аутентификации пользователей.
1 ответ
Я получил это работать с использованием каналов платформы. Чтобы ответить на мои конкретные вопросы:
- Это все еще может быть обработано каналами платформы. Как пример, я использую MSAL с веб-просмотром, и он все еще возвращается к оригиналу
FlutterActivity
после аутентификации моего пользователя. - Я не уверен на 100% в этом, потому что я не создал
Activity
сам, но пакет смог открыть свой собственный веб-просмотр, поэтому он должен работать
Основное занятие
private val LOGIN_CHANNEL = "flutter.android/msal"
private val scopes = arrayOf("https://graph.microsoft.com/User.Read", "https://graph.microsoft.com/User.ReadBasic.All")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
GeneratedPluginRegistrant.registerWith(this)
MyLibrary.setupClientApp(applicationContext, R.raw.auth_config, scopes)
MethodChannel(flutterView, LOGIN_CHANNEL).setMethodCallHandler { call, result ->
if (call.method == "login") {
login{
result.success(it)
}
}
}
}
private fun login(callback: (String?) -> Unit) {
MyLibrary.instance!!.acquireToken(
this,
scopes,
MyLibrary.getAuthInteractiveCallback {
callback(MyLibrary.getUser()?.displayName)
}
)
}
MyHomePage (Штат)
class _MyHomePageState extends State<MyHomePage> {
String _responseFromNativeCode = "";
static const platform = const MethodChannel('flutter.android/msal');
Future _login() async {
String response = "";
try {
response = await platform.invokeMethod('login');
} on PlatformException catch (e) {
response = "Failed to Invoke: '${e.message}'.";
}
setState(() {
_responseFromNativeCode = response;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'You have pushed the button this many times:',
),
Text(
'Hi $_responseFromNativeCode',
style: Theme.of(context).textTheme.display1,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _login,
tooltip: 'Login',
child: Icon(Icons.lock),
),
);
}
}