flutter - 在 Flutter 中使用特定于平台的包

标签 flutter flutter-platform-channel

我不确定这是否是合适的堆栈交换站点,但我认为它比我能想到的其他站点更适合这里。无论如何,我在一个移动应用程序开发团队工作,我们正在考虑使用 Flutter 来开发我们 future 的移动应用程序,因为它减少了为 iOS 和 Android 开发时所需的工作量(我们只是一个小团队)。

我通读了一些有关 Flutter 的信息,并检查了可用的软件包和 Dart/Flutter Pub,其中有一些软件包尚不能用于我们用于 Android 和 iOS 的 Flutter。以 MSAL(Microsoft 身份验证库)为例。阅读文档后,我了解了平台 channel 以及如何运行一些 KT/Swift 等特定代码并通过 Kotlin 中的 MethodChannel 之类的方法返回它,但 Flutter 文档中的示例显示了一个示例只返回特定数据类型或简单值。如果我想使用 MSAL 对用户进行身份验证怎么办?这将涉及一些在 Flutter 中不会发生的 UI 工作,因为它依赖于浏览器或 webview(取决于您的 MSAL 配置)

我的问题可能主要有两点:

  1. 如果您有一个依赖于 iOS 或 Android 用户界面的软件包,但不会占用您应用程序的全部功能,那怎么可能仍然使用 Flutter 来开发其余的您的应用程序,同时仍在使用特定于平台的软件包?
  2. 是否可以让超过 1 个 Activity 或 ViewController 执行此操作,然后再转到 Flutter 部分?因为我认为这是上一个问题的一种可能解决方案。

注意:

我知道 Dart Pub 中有用于身份验证的包,但我只是以 MSAL 为例,我们还使用其他依赖于显示自定义 View 来对用户进行身份验证的包。

最佳答案

我使用平台 channel 让它工作。回答我的具体问题:

  1. 这仍然可以由平台 channel handler 。例如,我将 MSAL 与 webview 结合使用,它在对我的用户进行身份验证后仍会返回到原始的 FlutterActivity
  2. 我对此不是 100% 确定,因为我自己没有创建 Activity,但包能够打开自己的 webview,所以它应该可以工作

主事件

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),
      ),
    );
  }
}

关于flutter - 在 Flutter 中使用特定于平台的包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57078400/

相关文章:

flutter - Flutter/Dart:窗口小部件中的文本根据哪个屏幕调用而变化?

Flutter:添加 firebase 后台功能后,热重载和热重启在 android 上不起作用

android - 将 Flutter 集成到原生宿主应用时从 Flutter 完成 FlutterActivity [Add2App]

android - Flutter - 返回自定义对象的 PlatformChannel 绑定(bind)方法

swift - 使用 Swift 回调处理程序时无法通过平台 channel 返回值

flutter - 有没有办法将 appbar 放在 flutter 的底部?

flutter - flutter :从 flutter 应用程序构建apk失败

firebase - "java.lang.IllegalArgumentException: Unsupported value"访问FireStore子集合异常

javascript - Node.js:注册 token 不是有效的 FCM 注册 token