Flutter Plugin简单开发

个人博客:
http://www.milovetingting.cn

新建项目

image-20230302134808397

image-20230302135317486

项目结构

image-20230302135906299

创建完成后的目录如图所示,其中example是测试工程,用来测试我们写的插件。lib目录下的文件,就是需要具体实现的。

flutter_plugin_platform_interface.dart文件就是我们定义接口的地方,flutter_plugin_method_channel.dart是对应AndoidIOS的文件,flutter_plugin_web.dart是对应web平台。

方法实现

AndroidIOS平台要分别实现flutter_plugin_platform_interface.dart定义的方法。这里以AndroidWeb为例,实现接口中的方法。

Android端

1、在android目录上点击右键,选择Flutter菜单下的Open Android module in Android Studio

image-20230302141024419

2、打开后的界面如下

image-20230302141536195

我们主要在FlutterPlugin这个文件的onMethodCall方法中做具体实现

无参方法的调用

1、在flutter_plugin_platform_interface.dart类中增加方法

Future<String?> hello(){
   
  throw UnimplementedError('hello() has not been implemented.');
}

2、在flutter_plugin_method_channel.dart类中实现上面的方法


Future<String?> hello() async {
   
  final msg = await methodChannel.invokeMethod<String>('hello');
  return msg;
}

3、在flutter_plugin.dart中调用

Future<String?> hello() {
   
  return FlutterPluginPlatform.instance.hello();
}

4、Android端实现

FlutterPlugin.kt

override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {
   
  when (call.method) {
   
    "getPlatformVersion" -> {
   
      result.success("Android ${
     android.os.Build.VERSION.RELEASE}")
    }
    "hello" -> {
   
      result.success("Android invoke==>hello()")
    }
    else -> {
   
      result.notImplemented()
    }
  }
}

5、在Example中测试

main.dart

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'dart:async';

import 'package:flutter/services.dart';
import 'package:flutter_plugin/flutter_plugin.dart';

void main() {
   
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
   
  const MyApp({
   super.key});

  
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
   
  String _platformVersion = 'Unknown';
  String? _msg;
  final _flutterPlugin = FlutterPlugin();

  
  void initState() {
   
    super.initState();
    initPlatformState();
  }

  // Platform messages are asynchronous, so we initialize in an async method.
  Future<void> initPlatformState() async {
   
    String platformVersion;
    // Platform messages may fail, so we use a try/catch PlatformException.
    // We also handle the message potentially returning null.
    try {
   
      platformVersion = await _flutterPlugin.getPlatformVersion() ?? 'Unknown platform version';
    } on PlatformException {
   
      platformVersion = 'Failed to get platform version.';
    }

    // If the widget was removed from the tree while the asynchronous platform
    // message was in flight, we want to discard the reply rather than calling
    // setState to update our non-existent appearance.
    if (!mounted) return;

    setState(() {
   
      _platformVersion = platformVersion;
    });
  }

  
  Widget build(BuildContext context) {
   
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Center(
          child: Column(
            children: [
              Text('Running on: $_platformVersion\n'),
              Text('msg: ${
     _msg ?? ""}\n'),
              ElevatedButton(
                onPressed: () async {
   
                  var msg = await _flutterPlugin.hello();
                  if (kDebugMode) {
   
                    print('msg from android:$msg');
                    setState(() {
   
                      _msg = msg;
                    });
                  }
                },
                child: const Text("调用hello")),
            ],
          ),
        ),
      ),
    );
  }
}

6、测试结果

image-20230302142948784

可以看出,成功调用到了Android端的方法

有参方法的调用

1、在flutter_plugin_platform_interface.dart类中增加方法

Future<String?> hi(String message){
   
  throw UnimplementedError('hi() has not been implemented.');
}

2、在flutter_plugin_method_channel.dart类中实现上面的方法


Future<String?> hi(String message) async {
   
  Map<String, dynamic> param = <String, dynamic>{
   };
  param["message"] = message;
  final msg = await methodChannel.invokeMethod<String>('hi', param);
  return msg;
}

3、在flutter_plugin.dart中调用

Future<String?> hi(String message) {
   
  return FlutterPluginPlatform.instance.hi(message);
}

4、Android端实现

FlutterPlugin.kt

override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {
   
  when (call.method) {
   
    "getPlatformVersion" -> {
   
      result.success("Android ${
     android.os.Build.VERSION.RELEASE}")
    }
    "hello" -> 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值