Использование платформо-зависимых пакетов во Flutter

Я не уверен, является ли это подходящим сайтом обмена стека, но я думаю, что он подходит здесь больше, чем другие, которые я могу придумать. В любом случае, я работаю в команде разработчиков мобильных приложений, и мы планируем использовать Flutter для разработки наших будущих мобильных приложений, поскольку это сокращает объем работы, необходимой при разработке для iOS и Android (мы всего лишь небольшая команда).

Я прочитал немного о Flutter и проверил доступные пакеты и Dart/Flutter Pub, и есть некоторые пакеты, которые еще не доступны для Flutter, которые мы используем для Android и iOS. Возьмите MSAL (Microsoft Authentication Library), например. Прочитав документацию, я прочитал о каналах платформы и о том, как вы можете запустить некоторый специальный код KT/Swift и т. Д. И вернуть его через что-то вроде MethodChannel в Kotlin, но пример из документов Flutter показывает пример только возвращения определенных типов данных или простых значений. Что если я хочу аутентифицировать пользователя с помощью MSAL? это потребовало бы некоторой работы с пользовательским интерфейсом, которая не происходит во Flutter, в частности, потому что она зависит от браузера или веб-просмотра (в зависимости от конфигурации MSAL)

Мой вопрос здесь, вероятно, будет в 2 основных вещах:

  1. Если у вас есть пакет, который опирается на пользовательский интерфейс iOS или Android для чего-то, что не займет все функции вашего приложения, как можно было бы по-прежнему использовать Flutter для разработки остальных ваших приложений, пока все еще используете пакеты для конкретной платформы?
  2. Можно ли иметь более 1 Activity или ViewController, который делает это, а затем переходить к части Flutter? Потому что я думаю, что это одно из возможных решений предыдущего вопроса.

Примечание:

Я знаю, что в Dart Pub есть пакеты для аутентификации, но я просто использую MSAL в качестве примера, мы также используем другие пакеты, которые полагаются на отображение пользовательских представлений для аутентификации пользователей.

1 ответ

Решение

Я получил это работать с использованием каналов платформы. Чтобы ответить на мои конкретные вопросы:

  1. Это все еще может быть обработано каналами платформы. Как пример, я использую MSAL с веб-просмотром, и он все еще возвращается к оригиналу FlutterActivity после аутентификации моего пользователя.
  2. Я не уверен на 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),
      ),
    );
  }
}
Другие вопросы по тегам