Flutter插件开发:调用原生方法

本文详细介绍了如何在Flutter中创建并使用自定义插件,包括建立Flutter插件项目、编辑Android与iOS原生代码、实现跨平台通信以及发布插件的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

目录

 

1、新建一个FlutterPlugin工程

2、编辑android原生工程

3、编辑ios原生工程

4、发布插件

1、新建一个FlutterPlugin工程

打开Android Studio后依次File-->New-->New Flutter Project-->Flutter Plugin,工程lib文件夹默认实现了一个FlutterPlugin,并且main.dart中有使用代码段。按照业务需求进行增加、修改。

FlutterPlugin类

import 'dart:async';

import 'package:flutter/services.dart';

class FlutterPlugin {
  //通过字符串flutter_plugin找到约定的MethodChannel
  static const MethodChannel _channel = const MethodChannel('flutter_plugin');

  /*
   *传参方式调用原生,默认工程无此方法 
   */
  static Future<String> get say async {
    //需要使用async、await标记异步调用,say为自定义原生方法名称
    //<String, dynamic>{'message': "Flutter arguments"}通过key-value方式传参数
    final String res = await _channel
      	.invokeMethod("say", <String, dynamic>{'message': "Flutter arguments"});
    return res;
  }

  static Future<String> get platformVersion async {
    //需要使用async、await标记异步调用
    //getPlatformVersion为自定义原生方法名称
    final String version = await _channel.invokeMethod('getPlatformVersion');
    return version;
  }
}

main.dart类

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

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

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _platformVersion = 'Unknown';

  @override
  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.
    // 平台消息可能会失败,因此我们使用try/catch平台异常。
    try {
      platformVersion = await FlutterPlugin.platformVersion;
    } 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.
    //setState来更新UI。
    if (!mounted) return;

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Center(
          //界面显示获取到的字符串
          child: Text('Running on: $_platformVersion\n'),
        ),
      ),
    );
  }
}

2、编辑android原生工程

插件工程右键找到Flutter菜单,点击“Open Android module in Android studio”在android studio中打开Android原生工程。新版本android studio默认使用kotlin语言,使用java语言请注意区别。工程打开后flutter_plugin中找到FlutterPlugin类,工程结构如下

FlutterPlugin类

package plugin.flutter.zhou.com.flutter_plugin

import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
import io.flutter.plugin.common.MethodChannel.Result
import io.flutter.plugin.common.PluginRegistry.Registrar

class FlutterPlugin : MethodCallHandler {
    companion object {
        /**
         * 注册MethodChannel
         */
        @JvmStatic
        fun registerWith(registrar: Registrar) {
            //flutter_plugin为约定的MethodChannel名称,flutter、android、ios三端一致即可
            val channel = MethodChannel(registrar.messenger(), "flutter_plugin")
            channel.setMethodCallHandler(FlutterPlugin())
        }
    }

    /*
     *处理method,原始工程没有if-else,笔者增加
     */
    override fun onMethodCall(call: MethodCall, result: Result) {
        //getPlatformVersion、say为约定method,flutter、android、ios三端一致即可
        if ("getPlatformVersion" == call.method) {
            result.success("Android ${android.os.Build.VERSION.RELEASE}")
        } else if ("say" == call.method) {
            //传参方式调用原生,默认工程无此方法,通过key-value方式传参数
            val msg = call.argument<String>("message")
            result.success(msg)
            //返回null
//            result.success(null)
            //返回错误
//            result.error("","",null)
        } else {
            //没有找到method
            result.notImplemented()
        }
    }
}

3、编辑ios原生工程

插件工程右键找到Flutter菜单,点击“Open IOS module in Xcode”在xcode中打开IOS原生工程。自动创建的工程没有设置Vsersion和Build,编译请注意相关错误。工程结构如下图

SwiftFlutterPlugin类

import Flutter 
import UIKit 
public class SwiftFlutterPlugin: NSObject,Flutter.FlutterPlugin {  
   //注册MethodChannel   
   public static func register(with registrar: FlutterPluginRegistrar) { 
      //flutter_plugin为约定的MethodChannel名称,flutter、android、ios三端一致即可     
      let channel = FlutterMethodChannel(name: "flutter_plugin"
                                      , binaryMessenger: registrar.messenger())     
      let instance = SwiftFlutterPlugin()
      registrar.addMethodCallDelegate(instance, channel: channel)
   }
   //处理method,原始工程没有if-else,笔者增加
   public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
      //getPlatformVersion、say为约定method,flutter、android、ios三端一致即可
      if("getPlatformVersion"==call.method){
          result("iOS " + UIDevice.current.systemVersion)
      }else if("say"==call.method){
           //传参方式调用原生,默认工程无此方法,通过Dictionary传参数
           let map = call.arguments as? Dictionary<String,String>; 
           let msg = map?["message"] 
           result(msg)
           //返回null 
           //result(nil) 
      }else{
         //没有找到method
         result(FlutterMethodNotImplemented)
      }
   }
} 

4、发布插件

请参考社区教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值