【问题标题】:Can I call Kotlin function from Dart我可以从 Dart 调用 Kotlin 函数吗
【发布时间】:2018-08-10 11:20:34
【问题描述】:

使用Flutter,可以通过以下方式调用 kotlin/swift 函数:

file.dart:

static const platform = const MethodChannel('my.test.flutterapp/battery');
final int result = await platform.invokeMethod('getBatteryLevel');

file.kt:

private val CHANNEL = "my.test.flutterapp/battery"
MethodChannel(flutterView, CHANNEL).setMethodCallHandler { call, result ->
          if (call.method == "getBatteryLevel") {
              ...
          } else {
              result.notImplemented()
          }
      }

是否有类似于从标准Dart 应用程序调用Kotlin 函数的东西,例如 Dart 控制台应用程序!

【问题讨论】:

    标签: android flutter kotlin dart flutter-channel


    【解决方案1】:

    https://flutter.io/developing-packages/

    插件包:一个专门的 Dart 包,其中包含用 Dart 代码编写的 API,并结合了适用于 Android(使用 Java 或 Kotlin)和/或 iOS(使用 ObjC 或 Swift)的特定于平台的实现。一个具体的例子是电池插件包。

    ...

    flutter create --template=plugin -i swift -a kotlin hello
    

    【讨论】:

      【解决方案2】:

      对于 VM,可用的机制是基本的操作系统操作和本机扩展。

      我的意思是操作系统操作,您可以使用文件或网络堆栈启动一个单独的进程并与之交互。这可能不像您想要的那样精细。

      本机扩展允许您调用 C 或 C++ 代码。我对 kotlin 的了解还不够,不知道您是否可以轻松地将功能公开给 C/C++。如果可能的话,这将为您提供最紧密的集成。

      https://www.dartlang.org/articles/dart-vm/native-extensions

      【讨论】:

        【解决方案3】:

        你可以看到这个项目:Full Sample

        在安卓中:

        class MainActivity: FlutterActivity() {
            private val DATA_CHANNEL = "app.channel.shared.data"
            override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
                GeneratedPluginRegistrant.registerWith(flutterEngine);
                MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), DATA_CHANNEL).setMethodCallHandler { call, result ->
                    if (call.method!!.contentEquals("getSharedText")) {
                        result.success("Shared Text")
                    } 
                }
            }
        }
        

        在飞镖中:

        import 'package:flutter/material.dart';
        import 'package:flutter/services.dart';
        void main() {
           WidgetsFlutterBinding.ensureInitialized();
          runApp(MyApp());
        }
        
        class MyApp extends StatefulWidget {
          @override
          State<StatefulWidget> createState() {
            return _MyAppState();
          }
        }
        
        class _MyAppState extends State<MyApp> {
        
          static const platform = const MethodChannel('app.channel.shared.data');
          String dataShared = "No Data";
        
        @override
          void initState() {
            super.initState();
            getSharedText();
          }
        
          getSharedText() async {
            var sharedData = await platform.invokeMethod("getSharedText");
            if (sharedData != null) {
              setState(() {
                dataShared = sharedData;
              });
            }
          }
          @override
          Widget build(BuildContext context) {
            return MaterialApp(
              home:Scaffold(body: Center(child: Text(dataShared))) 
            );
          }
        }
        

        【讨论】:

          猜你喜欢
          • 2021-05-03
          • 1970-01-01
          • 2014-06-14
          • 2020-05-06
          • 1970-01-01
          • 1970-01-01
          • 2021-08-07
          • 2018-07-08
          • 1970-01-01
          相关资源
          最近更新 更多