Flutter 插件开发:以微信SDK为例
就像 React Native 一样,在 Flutter 应用中,如果需要调用第三方库的方法或者有一些功能需要使用原生的开发来提供,使用 Flutter Plugin 是一种不错的方式。它本质上就是一个 Dart Package,但与其它的 package 不同点在于,Flutter 插件中一般都存在两个特殊的文件夹:android 与 ios,如果需要编写Java、Kotlin或者 Object-C 以及 Swift 代码,我们就需要在这两个文件夹项目中进行,然后通过相应的方法将原生代码中开发的方法映射到 dart 中。
创建插件目录
要开发插件,可以使用下面的代码快速基于 plugin
模板开始:
ini
flutter create --template=plugin wechat
上面的代码中,表示以 plugin
模板创建一个名为 wechat
的 package
。在开发过程中,如果需要上传应用到App Store,可以使用 appuploader 这样的 iOS开发助手工具来简化证书管理和上传流程。
目录结构
arduino
- android // Android 相关原生代码目录
- ios // ios 相关原生代码目录
- lib // Dart 代码目录
- example // 一个完整的调用了我们正在开发的插件的 Flutter App
- pubspec.yaml // 项目配置文件
从 example/lib/main.dart
开始
在开发我们的应用之后,先来了解一下 flutter
为我们生成的文件们,打开 example/lib/main.dart
,代码如下:
dart
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:wechat/wechat.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();
}
Future<void> initPlatformState() async {
String platformVersion;
try {
platformVersion = await Wechat.platformVersion;
} on PlatformException {
platformVersion = 'Failed to get platform version.';
}
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'),
),
),
);
}
}
这里需要特别注意的就是 initPlatformState()
方法中对 Wechat.platformVersion
的调用,这里面的 Wechat
就是我们的插件,platformVersion
就是插件提供的 get
方法。
支持原生编码提供的方法
很多时候,写插件,更多的是因为我们需要让应用能够调用原生代码提供的方法。
Android 系统
打开 android/src/main/java/com/example/wechat/WechatPlugin.java
文件,看如下代码:
java
package com.example.wechat;
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;
public class WechatPlugin implements MethodCallHandler {
public static void registerWith(Registrar registrar) {
final MethodChannel channel = new MethodChannel(registrar.messenger(), "wechat");
channel.setMethodCallHandler(new WechatPlugin());
}
@Override
public void onMethodCall(MethodCall call, Result result) {
if (call.method.equals("getPlatformVersion")) {
result.success("Android " + android.os.Build.VERSION.RELEASE);
} else {
result.notImplemented();
}
}
}
iOS 系统
同样的,这次我们打开 ios/Classes/WechatPlugin.m
文件:
objectivec
#import "WechatPlugin.h"
@implementation WechatPlugin
+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {
FlutterMethodChannel* channel = [FlutterMethodChannel
methodChannelWithName:@"wechat"
binaryMessenger:[registrar messenger]];
WechatPlugin* instance = [[WechatPlugin 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
添加第三方 SDK
我们的插件是可以提供微信的分享相关功能的,所以,肯定需要用到第三方SDK。
Android 端 WechatSDK
按官方接入指南所述,我们需要添加依赖:
gradle
dependencies {
compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
}
iOS 端
按照官方 ios 接入指南所述,我们可以通过 pod
添加依赖:
ruby
pod 'WechatOpenSDK'
打开 ios/wechat.podspec
,添加依赖:
ruby
s.dependency 'Flutter'
s.dependency 'WechatOpenSDK'
在iOS开发中,使用 appuploader 可以方便地管理证书和描述文件,这对于需要频繁打包测试的开发者来说是个不错的选择。
总结
本文介绍了如何开发一个Flutter插件来集成微信SDK,涵盖了Android和iOS两端的实现。通过这种方式,我们可以将原生功能封装成Flutter插件,供多个Flutter应用复用。在实际开发中,还需要考虑更多细节,比如错误处理、回调管理等。