前言
- Flutter的思想是:一切皆组件!
这里我使用开发工具:JDK1.8+AS3.3+Flutter1.6.2
Flutter 调用 Android java方法
- Android 端:需要声明
MethodChannel
并setMethodCallHandler
, 在onCreate()
方法中声明MethodChannel并设置MethodCallHandler// CHANNEL_NAME是String字符串,对Channel命名 MethodChannel methodChannel = new MethodChannel(getFlutterView(), CHANNEL_NAME); // setMethodCallHandler,接收此通道上对方法的调用处理 methodChannel.setMethodCallHandler(new MethodChannel.MethodCallHandler() { @Override public void onMethodCall(MethodCall methodCall, MethodChannel.Result result) { // 通过methodCall可以获取参数和方法名 执行对应的业务逻辑 if (methodCall.method.equals(getAndroidResult)) { //这里将本地的处理结果保存 int random = MainActivity.this.getRandomResult(); if (random >= 0) { //将结果传递给result,通过它回传给Flutter result.success("Success : " + random); } else { result.error("ERROR", "result=" + random, null); } } else { result.notImplemented(); } } } );
- Flutter端:根据指定的MethodChannel,反射获取Android方法回传的结果,通过
setState()
更新UI
结果如下:class _MyHomePageState extends State<MyHomePage> { static const platform_from_android = const MethodChannel("samples.flutter.io/from_android"); static const String method_android_name = "getAndroidResult"; String androidResult = "nuknow result";//接收Android端处理后的姐结果 Future<Null> _getFromAndroid() async { try { print("dart -_getFromAndroid"); // 在通道上调用此方法 androidResult = await platform_from_android.invokeMethod(method_android_name); } on PlatformException catch (e) { androidResult = '${e.message}'; } setState(() { print("dart -setState"); }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( ... ), body: new Center( child: Column( ... children: <Widget>[ new RaisedButton( onPressed: _getFromAndroid, child: new Text("Get from Android"), ), new Text( "结果 : $androidResult", style: new TextStyle( fontSize: 30 ), ), ], ), ), ); } }
总结
- Flutter–>Android间, 桥梁是MethodChannel, Flutter通过MethodChannel.invokeMethod()来调用Android方法,Android端在方法回调onMethodCall()里面处理并回传结果给Flutter