我可以从Dart调用Kotlin功能吗?

时间:2018-03-02 09:03:33

标签: kotlin dart flutter

使用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()
          }
      }

是否有类似于标准Kotlin应用中调用Dart功能的内容,例如Dart控制台应用!

3 个答案:

答案 0 :(得分:2)

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

  

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

...

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

答案 1 :(得分:1)

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

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

原生扩展允许您调用C或C ++代码。我不太了解kotlin是否可以轻松地向C / C ++公开功能。如果可能,这将为您提供最紧密的整合。

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

答案 2 :(得分:0)

您可以看到以下项目:Full Sample

在Andriod中:

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

在Dart中:

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