我可以从 Dart 调用 Kotlin 函数吗
Posted
技术标签:
【中文标题】我可以从 Dart 调用 Kotlin 函数吗【英文标题】:Can I call Kotlin function from Dart 【发布时间】: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 控制台应用程序!
【问题讨论】:
【参考方案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)))
);
【讨论】:
以上是关于我可以从 Dart 调用 Kotlin 函数吗的主要内容,如果未能解决你的问题,请参考以下文章