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应用复用。在实际开发中,还需要考虑更多细节,比如错误处理、回调管理等。

相关推荐
豌豆花下猫2 小时前
Python 3.14 新特性盘点,更新了些什么?
后端·python·ai
caihuayuan52 小时前
Vue生命周期&脚手架工程&Element-UI
java·大数据·spring boot·后端·课程设计
明月与玄武5 小时前
Spring Boot中的拦截器!
java·spring boot·后端
菲兹园长5 小时前
SpringBoot统一功能处理
java·spring boot·后端
muxue1785 小时前
go语言封装、继承与多态:
开发语言·后端·golang
开心码农1号6 小时前
Go语言中 源文件开头的 // +build 注释的用法
开发语言·后端·golang
北极象6 小时前
Go主要里程碑版本及其新增特性
开发语言·后端·golang
lyrhhhhhhhh6 小时前
Spring框架(1)
java·后端·spring
喝养乐多长不高7 小时前
Spring Web MVC基础理论和使用
java·前端·后端·spring·mvc·springmvc
莫轻言舞8 小时前
SpringBoot整合PDF导出功能
spring boot·后端·pdf