使用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控制台应用!
答案 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 ++公开功能。如果可能,这将为您提供最紧密的整合。
答案 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)))
);
}
}