一、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)
}
}
}
网友评论