【问题标题】:Using Platform-Specific packages in Flutter在 Flutter 中使用特定于平台的包
【发布时间】:2019-11-26 10:30:48
【问题描述】:

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

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

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

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

注意:

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

【问题讨论】:

    标签: flutter flutter-platform-channel


    【解决方案1】:

    我使用平台渠道来实现这一点。回答我的具体问题:

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

    MainActivity

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

    我的主页(状态)

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

    【讨论】:

      猜你喜欢
      • 2019-05-06
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      • 2020-02-04
      • 2021-09-28
      • 1970-01-01
      • 2021-10-12
      • 1970-01-01
      相关资源
      最近更新 更多