我正在处理平台频道(PlatformChannels),试图从Kotlin(Kotlin)到Flatter(颤振)进行通信。尝试实际执行颤振平台频道文档中解释的操作,但方向相反:
通道文件颤振平台
其思想是从MainActivity上的ConfigureFlatterEngine函数调用颤振函数。kt级。
为此,我做了,在颤振方面,梅因。dart(颤振的默认示例):
class _MyHomePageState extends State<MyHomePage> {
static const platformChannel = const MethodChannel('myTestChannel');
@override
Widget build(BuildContext context) {
platformChannel.setMethodCallHandler((call){
print("Hello from ${call.method}");
return null;
});
//
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
//
//
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'You have pushed the button this many times:',
),
],
),
),
);
}
}
从Kotlin方面来说,我只是尝试调用MainActivity上的颤振回调方法。kt:
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine)
val channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "myTestChannel")
channel.invokeMethod("myTestChannel","the argument from Android")
}
但当我运行代码时,颤振面上没有打印任何内容。也没有崩溃或异常。
这最终在我这边奏效了。如果您想在android生命周期回调中调用您的方法,请尝试以下操作
const val CHANNEL = "yourTestChannel"
class MainActivity : FlutterActivity() {
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine);
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
var flutterEngine = FlutterEngine(this)
flutterEngine
.dartExecutor
.executeDartEntrypoint(
DartExecutor.DartEntrypoint.createDefault()
)
var channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL)
channel.invokeMethod("yourMethod", "yourArguments")
}
}
}
你应该按照下面的方式执行
飞镖代码
method_channel_helper.dart
class AmazonFileUpload {
static const platform = const MethodChannel('amazon');
static StreamController<String> _controller = StreamController.broadcast();
static Stream get streamData => _controller.stream;
Future<BaseResponse> uploadFile() async {
try {
platform.setMethodCallHandler((call) {
switch (call.method) {
case "callBack":
_controller.add("");
break;
}
});
final Map result = await platform.invokeMethod('s3_upload');
return BaseResponse(result["success"], result["error"], "");
} on PlatformException catch (e) {
return BaseResponse(false, e.message, "");
}
}
}
主页。飞奔
class _HomePageState extends State<HomePage> {
@override
void initState() {
super.initState();
AmazonFileUpload.streamData.listen((event) {
print("========$callbackFromKotlinToDart--------");
});
AmazonFileUpload().uploadFile();
@override
Widget build(BuildContext context) {
}
Android代码
class MainActivity : FlutterActivity(), TransferListener {
private val CHANNEL = "amazon"
var methodResult: MethodChannel.Result? = null
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine);
val channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL)
channel.setMethodCallHandler { call, result ->
methodResult = result
if (call.method == "s3_upload") {
//Add you login here
channel.invokeMethod("callBack", "data1")
}
}
}
问题内容: 我正在尝试将一些参数传递给用作回调的函数,该怎么做? 问题答案: 如果您想要更一般的东西,可以使用arguments变量,如下所示: 但是否则,您的示例可以正常工作(可以在测试器中使用arguments [0]代替回调)
问题内容: 从列表中提取项目并将其作为参数传递给函数调用的一种好而简短的方法是什么,例如下面的示例? 例: 问题答案: 您可以使用星号将元组或列表解压缩为位置参数。 同样,您可以使用双星号将字典分解成关键字参数。
我有一个Kotlin代码: 现在我想从Java类调用这个方法。我不知道该怎么称呼这个。这是我试过的 但它显示了以下错误。
我有一个功能:
我正在尝试将侦听器从操作传递给类(适配器)。 在java中(操作代码): (来自适配器的代码) 它起作用了。 现在我试着翻译成kotlin。我先翻译动作(把动作翻译成kotlin): 在这一点上仍然有效。适配器的代码仍在java中,类的代码仍在kotlin中。现在,我将适配器转换为kotlin: 现在它不起作用了。操作未编译。 错误:无法推断此参数“v”的类型。必需的视图。OnClickListe
问题内容: 我想将值传递给javascript。如果可能的话,我该怎么办?如何在后备bean中接收它们? 问题答案: