flutter插件开发

Android

1. Open for Editing in Android Studio
2. new module 创建插件
3. 修改build.gradle
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'


def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
    localPropertiesFile.withReader('UTF-8') { reader ->
        localProperties.load(reader)
    }
}
def flutterRoot = localProperties.getProperty('flutter.sdk')
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
android {
    compileSdkVersion 28


    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        consumerProguardFiles 'consumer-rules.pro'
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

}
flutter {
    source '../..'
}
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:28.0.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

4. 编写插件类
package com.ityu.flutter_plugin

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

class FlutterPlugin: MethodCallHandler {
  companion object {
    @JvmStatic
    fun registerWith(registrar: Registrar) {
      val activity = registrar.activity()
      val channel = MethodChannel(registrar.messenger(), "flutter_plugin")
      channel.setMethodCallHandler(FlutterPlugin())
    }
  }

  override fun onMethodCall(call: MethodCall, result: Result) {
    if (call.method == "getPlatformVersion") {
      result.success("Android ${android.os.Build.VERSION.RELEASE}")
    } else {
      result.notImplemented()
    }
  }
}

5. 编写插件注册类
package io.flutter.plugins;

import io.flutter.plugin.common.PluginRegistry;
import com.ityu.flutter_plugin.FlutterPlugin;

/**
 * Generated file. Do not edit.
 */
public final class GeneratedPluginRegistrant {
  public static void registerWith(PluginRegistry registry) {
    if (alreadyRegisteredWith(registry)) {
      return;
    }
    FlutterPlugin.registerWith(registry.registrarFor("com.ityu.flutter_plugin.FlutterPlugin"));
  }

  private static boolean alreadyRegisteredWith(PluginRegistry registry) {
    final String key = GeneratedPluginRegistrant.class.getCanonicalName();
    if (registry.hasPlugin(key)) {
      return true;
    }
    registry.registrarFor(key);
    return false;
  }
}

6. 注册插件
class MainActivity: FlutterActivity() {
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    GeneratedPluginRegistrant.registerWith(this)
  }
}
7. 编写dart
class FlutterPlugin {
  static const MethodChannel _channel =
      const MethodChannel('flutter_plugin');

  static Future<String> get platformVersion async {
    final String version = await _channel.invokeMethod('getPlatformVersion');
    return version;
  }

  static Future<String>  getString() async {
    final String version = await _channel.invokeMethod('getPlatformVersion');
    return version;
  }
}
8. dart中使用
String platformVersion = await FlutterPlugin.platformVersion;

IOS

FlutterPlugin.h
#import <Flutter/Flutter.h>

@interface FlutterPlugin : NSObject<FlutterPlugin>
@end

FlutterPlugin.m
#import "FlutterPlugin.h"
#import <flutter_plugin/flutter_plugin-Swift.h>

@implementation FlutterPlugin
+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {
  [SwiftFlutterPlugin registerWithRegistrar:registrar];
}
@end
SwiftFlutterPlugin.swift
import Flutter
import UIKit

public class SwiftFlutterPlugin: NSObject, FlutterPlugin {
  public static func register(with registrar: FlutterPluginRegistrar) {
    let channel = FlutterMethodChannel(name: "flutter_plugin", binaryMessenger: registrar.messenger())
    let instance = SwiftFlutterPlugin()
    registrar.addMethodCallDelegate(instance, channel: channel)
  }

  public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
    result("iOS " + UIDevice.current.systemVersion)
  }
}

其他

检查插件

flutter packages pub publish --dry-run

发布插件

flutter packages pub publish

依赖包冲突

多个依赖都引用第三方依赖
直接在下面引用这个第三方依赖 优先级最高

打包存在多个一样的so文件,冲突
packagingOptions {
    pickFirst '**/libstlport_shared.so'
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Podspec是CocoaPods使用的一种文件格式,用于描述一个库的元数据信息。在Flutter插件开发中,我们需要使用Podspec文件来描述iOS平台上的插件信息,以便其他开发者在使用我们的插件时能够正确地集成到他们的项目中。 下面是一些关于Podspec语法的整理: 1. Podspec文件的命名应该以插件的名称为准,并以`.podspec`作为文件扩展名,如`flutter_my_plugin.podspec`。 2. Podspec文件应该包含以下信息: - 插件的名称和版本号 - 插件的描述 - 作者信息 - 插件的许可证 - 插件依赖的库和框架 - 插件的源代码文件和资源文件 3. Podspec文件的基本结构如下: ``` Pod::Spec.new do |s| s.name = '插件名称' s.version = '插件版本号' s.summary = '插件描述' s.homepage = '插件主页' s.license = '插件许可证' s.author = { '作者名称' => '作者邮箱' } s.source = { :git => '插件源代码仓库地址', :tag => '插件版本号' } s.dependency '依赖库名称', '依赖库版本号' # 插件依赖的库和框架 s.source_files = '插件源代码文件路径' # 插件的源代码文件 s.resource_bundles = { '插件资源文件名称' => ['插件资源文件路径'] } # 插件的资源文件 end ``` 4. 在描述依赖库时,可以使用以下语法: - `s.dependency '库名称'`:插件依赖的库名称。 - `s.dependency '库名称', '~> 版本号'`:插件依赖的库名称和版本号,其中`~>`表示兼容某个版本号及以上的库。 - `s.dependency '库名称', '>= 版本号'`:插件依赖的库名称和版本号,其中`>=`表示需要某个版本号及以上的库。 5. 在描述源代码文件和资源文件时,可以使用以下语法: - `s.source_files = '路径/**/*.{h,m,swift}'`:插件的源代码文件路径,可以使用通配符`*`和`**`。 - `s.resource_bundles = { 'Bundle名称' => ['路径/**/*'] }`:插件的资源文件,可以使用通配符`*`和`**`。 以上就是关于Podspec语法的整理,希望能对Flutter插件开发有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值