我试图利用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
?如果为真,如何实现此功能?