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

2020-08-18  本文已影响0人  小凡凡520
一、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)
      }
   }
} 
上一篇下一篇

猜你喜欢

热点阅读