我试图利用MethodChannel调用Android中Kotlin的dart函数。在flutter的函数中使用await时,Android端无法获得返回值。这是我的代码:
颤振:
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return const Center();
}
static const platform = MethodChannel('myChannel');
@override
void initState() {
super.initState();
platform.setMethodCallHandler(myFunction);
}
Future<String> myFunction(MethodCall call) async {
switch (call.method) {
case "yourMethod":
await Future.delayed(const Duration(seconds: 5));
return "delayed 5 seconds";
}
return "not implemented";
}
}
科特林:
class MainActivity: FlutterActivity() {
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine);
}
class MyBook: BookApi {
override fun search(keyword: String): List<Book?> {
return listOf(Book("book_title1", "author1"))
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val flutterEngine = FlutterEngine(this)
flutterEngine
.dartExecutor
.executeDartEntrypoint(
DartExecutor.DartEntrypoint.createDefault()
)
val channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "myChannel")
channel.invokeMethod("yourMethod", "yourArguments", object: MethodChannel.Result {
override fun success(result: Any?) {
Log.d(TAG, "result = $result")
}
override fun error(errorCode: String, errorMessage: String?, errorDetails: Any?) {
Log.d(
TAG,
"errorCode = $errorCode, errorMessage = $errorMessage, errorDetails = $errorDetails"
)
}
override fun notImplemented() {
Log.d(TAG, "notImplemented")
}
})
}
companion object {
private const val TAG = "MainActivity"
}
}
根据我的研究,函数返回的值应该通过MethodChannel.Result中的回调传递,但它从未调用过。
如果删除行await Future.delayed(const Duration(seconds: 5));,则一切正常,即success回调传递的返回值。
它是否应该阻止MethodCallHandler中的await?如果为真,如何实现此功能?