当前位置: 首页 > 知识库问答 >
问题:

在颤振中使用平台专用软件包

郭琦
2023-03-14

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

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

我的问题可能有两个主要方面:

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

注:

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

共有1个答案

秦弘亮
2023-03-14

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

    < li >这个还是可以通过平台渠道处理的。例如,我在webview中使用MSAL,在认证我的用户后,它仍然返回到原来的< code>FlutterActivity。 < li >我对此不是100%确定,因为我自己没有创建< code>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)
            }
    )
}

我的主页(州)

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),
      ),
    );
  }
}
 类似资料:
  • 我想知道在联邦插件上实现平台特定功能的最佳方式是什么,以及如何从主应用程序调用它。 例如,让我们看看这个联邦插件代码: 定义功能的平台接口: Android系统的实现: Web实现: 所以这里的问题是在我的应用程序上,我在我的然后在代码

  • E/flatter(31135):[错误:flatter/lib/ui/ui\u dart\u state.cc(186)]未处理的异常:MissingPluginException(未找到通道颤振上的方法speak的实现)E/flatter(31135):\0 MethodChannel_调用方法(包:颤振/src/services/platform_channel.dart:156:7)E/颤

  • 我将location包添加到project的pubspec.yamel中,当我构建我的项目时,我得到以下错误: 失败:生成失败,出现异常。 失败:生成失败,出现异常。 错误:任务“:compilereleaseJavaWithJavac”执行失败。编译失败;有关详细信息,请参阅编译器错误输出。 try:使用--stacktrace选项运行以获取堆栈跟踪。使用--info或--debug选项运行以获

  • 我已经按照这里的所有步骤进行了操作,我还在Firebase控制台中添加了SHA1键。 这是我的代码 我按照以下步骤创建了一个debug. keystore 异常:平台异常(sign_in_failed,com.google.android.gms.common.api.ApiException:10:,null)E/flutter(30467):#0 StandardMethodCodec。dec