美文网首页
Flutter插件开发-----调用原生方法

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

作者: 小凡凡520 | 来源:发表于2020-08-18 17:04 被阅读0次
    一、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'),
            ),
          ),
        );
      }
    }
    
    三、编辑ios原生工程
    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)
          }
       }
    } 
    

    相关文章

      网友评论

          本文标题:Flutter插件开发-----调用原生方法

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