Flutter调Android原生

120 阅读2分钟

「这是我参与2022首次更文挑战的第11天,活动详情查看:2022首次更文挑战

实际上一年前我接触flutter的时候弄过一次,具体的实现放到上家公司的conflunce了。过了一年重新开始弄flutter,再次记录一下。

目前,咸鱼商业使用flutter是比较成功的,开发是使用的咸鱼的Fish_Redux框架,咸鱼也有调原生的框架Flutter Boost,不过这次先不讲,后面有机会在写一写。

其实Flutter调原生还算简单,先给出flutter实战的教程地址。
book.flutterchina.club/chapter12/p…

一、创建一个新的应用程序项目

在终端中运行:flutter create batterylevel
默认情况下,模板支持使用Java编写Android代码,或使用Objective-C编写iOS代码。要使用Kotlin或Swift,请使用-i和/或-a标志:

在终端中运行:flutter create -i swift -a kotlin batterylevel

二、先在需要调用的State中定义一个通道

  ///定义一个通道
  static const platform = const MethodChannel('com.hikvision.bettery');

需要注意的是通道的名字要唯一,可以在前面加上包名之类的。

三、写一个方法来调取原生的方法

  Future<Null> getBetteryLevel() async {
    try {
      final int result = await platform.invokeMethod('getBetteryLevel');
      betteryText = "the bettery is $result";
    } on PlatformException catch (e) {
      betteryText = "the bettery get failed ${e.message}";
    }
    setState(() {});
  }

很简单就是要调用原生的getBetteryLevel这个方法。

四、写一个按钮来调上面的方法

 RaisedButton(onPressed:() async{
              await getBetteryLevel();
            } )

这个地方需要注意是getBetteryLevel是异步的,一定要加上async 和await。
到这里flutter端的代码已经完成。是不是很简单!
接下来就开始原生的代码了,写getBetteryLevel这个方法给flutter这调一下。

五、在Android Studio中打开您的Flutter应用的Android部分:

启动 Android Studio
选择 File > Open…
定位到您 Flutter app目录, 然后选择里面的 android文件夹,点击 OK
在java目录下打开 MainActivity.java

为什么要单独打开,因为可以单独运行,调试。

六、

class MainActivity: FlutterActivity() {
     //这个跟flutter的通道名称保持一直
    private val channel = "com.hikvision.bettery"
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        GeneratedPluginRegistrant.registerWith(flutterEngine!!);
        
        MethodChannel(flutterEngine?.dartExecutor,channel).setMethodCallHandler { call, result ->
            //这里是判断是不是调getBetteryLevel方法,因为所有的方法都走这里
            if(call.method == "getBetteryLevel"){
                result.success(1);
                showDialog()
            }else{
                result.notImplemented()
            }
        }

    }

    fun  showDialog(){
        AlertDialog.Builder(this).setMessage("你好  flutter")
                .setTitle("flutter 调取原生")
                .setPositiveButton("一级棒",DialogInterface.OnClickListener{
                    dialogInterface,i ->
                    Toast.makeText(this@MainActivity,"实验很成功",Toast.LENGTH_SHORT).show()
                    Log.d("azy","toast show()")
                })
                .setNegativeButton("取消",null)
                .create()
                .show();
    }
}

代码很少,关键的两个点也注释了。flutter实战的写法我这有点不一样,它那个比较旧了。

image.png