Flutter 插件开发:以微信SDK为例

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 模板创建一个名为 wechatpackage。在开发过程中,如果需要上传应用到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应用复用。在实际开发中,还需要考虑更多细节,比如错误处理、回调管理等。

相关推荐
风象南22 分钟前
SpringBoot实现简易直播
java·spring boot·后端
这里有鱼汤30 分钟前
有人说10日低点买入法,赢率高达95%?我不信,于是亲自回测了下…
后端·python
武子康1 小时前
Java-39 深入浅出 Spring - AOP切面增强 核心概念 通知类型 XML+注解方式 附代码
xml·java·大数据·开发语言·后端·spring
米粉03051 小时前
SpringBoot核心注解详解及3.0与2.0版本深度对比
java·spring boot·后端
一只帆記2 小时前
SpringBoot EhCache 缓存
spring boot·后端·缓存
yuren_xia5 小时前
Spring Boot中保存前端上传的图片
前端·spring boot·后端
JohnYan8 小时前
Bun技术评估 - 04 HTTP Client
javascript·后端·bun
shangjg38 小时前
Kafka 的 ISR 机制深度解析:保障数据可靠性的核心防线
java·后端·kafka
青莳吖9 小时前
使用 SseEmitter 实现 Spring Boot 后端的流式传输和前端的数据接收
前端·spring boot·后端
我的golang之路果然有问题10 小时前
ElasticSearch+Gin+Gorm简单示例
大数据·开发语言·后端·elasticsearch·搜索引擎·golang·gin