美文网首页
Flutter Plugin 调用 Native API

Flutter Plugin 调用 Native API

作者: Shorebloom_59f6 | 来源:发表于2020-10-29 21:48 被阅读0次

    一、新建plugin

    由于1、2 方式未生成平台对应文件,我一般使用第三种命令行方式创建

    1. 通过IntelliJ

    (1) Create New Project 或者 点击 File>New>Project…;
    (2) 在左侧菜单选择 Flutter, 然后点击 Next;
    (3) 输入 Project name 和 Project location,Project type 选择 "Plugin";
    (4)最后点击 Finish。

    截屏2020-10-29 17.23.24.png

    2. 通过Android Studio

    (1) Start a new flutter project -> flutter plugin ,然后点击 Next;

    截屏2020-10-29 19.31.28.png

    (2) 选择语言: 不勾选iOS 为OC,安卓为Java

    截屏2020-10-29 19.32.25.png

    上述两种方法创建过后需要手动在插件 pubspec.yaml 文件中 设置每个平台对应的类名等信息,文档描述说在插件目录下执行 flutter packages get 后会生成对应的平台对应目录(如ios、android),不知道为什么未生效,如果有人知道该怎么做欢迎联系我

    截屏2020-10-29 19.44.41.png

    3. 通过命令行

    具体参数设置可参考flutter 文档

    例:

     flutter create --org com.example.nativeapi --template=plugin --platforms=android,ios -i objc native_api
    

    该命令会在插件下自动创建好ios 及 android 目录


    截屏2020-10-29 20.16.08.png

    二、增加方法

    例如想要增加一个方法获取字符串长度

    1. dart (native_api/lib/native_api.dart)

    默认创建的文件如下

    class Nativeapi {
      static const MethodChannel _channel =
          const MethodChannel('nativeapi');
    
      static Future<String> get platformVersion async {
        final String version = await _channel.invokeMethod('getPlatformVersion');
        return version;
      }
    }
    

    新增一个countOfString

    class NativeApi {
      static const MethodChannel _channel = const MethodChannel('native_api');
    
      static Future<String> get platformVersion async {
        final String version = await _channel.invokeMethod('getPlatformVersion');
        return version;
      }
    
      static Future<String> countOfString(str) async {
        final String count = await _channel.invokeMethod('countOfString', str);
        return count;
      }
    }
    

    2. ios (native_api/ios/Classes/NativeApiPlugin.m)

    创建后自动生成的代码如下

    #import "NativeApiPlugin.h"
    
    @implementation NativeApiPlugin
    + (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {
      FlutterMethodChannel* channel = [FlutterMethodChannel
          methodChannelWithName:@"native_api"
                binaryMessenger:[registrar messenger]];
      NativeApiPlugin* instance = [[NativeApiPlugin alloc] init];
      [registrar addMethodCallDelegate:instance channel:channel];
    }
    
    - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
      if ([@"getPlatformVersion" isEqualToString:call.method]) {
        result([@"iOS " stringByAppendingString:[[UIDevice currentDevice] systemVersion]]);
      } else {
        result(FlutterMethodNotImplemented);
      }
    }
    
    @end
    
    

    对countOfString 方法做具体处理,改完后文件代码为

    #import "NativeApiPlugin.h"
    
    @implementation NativeApiPlugin
    + (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {
      FlutterMethodChannel* channel = [FlutterMethodChannel
          methodChannelWithName:@"native_api"
                binaryMessenger:[registrar messenger]];
      NativeApiPlugin* instance = [[NativeApiPlugin alloc] init];
      [registrar addMethodCallDelegate:instance channel:channel];
    }
    
    - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
      if ([@"getPlatformVersion" isEqualToString:call.method]) {
        result([@"iOS " stringByAppendingString:[[UIDevice currentDevice] systemVersion]]);
      }else if ([@"countOfString" isEqualToString:call.method]) {
          NSString *urlParam = call.arguments;
          result(@"字符串长度为 3");
      }else {
        result(FlutterMethodNotImplemented);
      }
    }
    
    @end
    
    

    三、在其他flutter工程中使用本地plugin

    新建plugins 文件,将刚才的plugin拷贝进去

    截屏2020-10-29 21.22.53.png

    修改工程的pubspec文件

    截屏2020-10-29 21.24.46.png

    在工程中引入
    import 'package:native_api/native_api.dart'

    使用

    var futureValue = await NativeApi.countOfString("abc");
    

    结果:

    截屏2020-10-29 21.34.27.png

    想要让更多人用可以使用命令发布插件

    $flutter packages pub publish --dry-run
    $flutter packages pub publish
    

    demo

    demo地址

    参考链接

    相关文章

      网友评论

          本文标题:Flutter Plugin 调用 Native API

          本文链接:https://www.haomeiwen.com/subject/dsclvktx.html