使用Flutter創(chuàng)建插件詳解并發(fā)布到Pub庫

創(chuàng)建Flutter插件可以使得我們在Flutter項目中直接調用原生功能宴树,這大大擴展了我們的應用程序的能力嚣艇。下面是詳細的創(chuàng)建Flutter插件并發(fā)布到Pub庫的步驟:

1. 創(chuàng)建Flutter插件項目

首先靖诗,在任何目錄中打開終端并鍵入以下命令:

flutter create --template=package flutter_plugin

這將創(chuàng)建一個Flutter插件項目模板,命名為“flutter_plugin”。此模板包含插件所需的基本文件結構。

2. 添加插件代碼

現(xiàn)在可以向“flutter_plugin”插件項目添加原生代碼童太。我們可以使用Objective-C、Swift、Java或Kotlin將原生代碼集成到插件中书释。

在這里翘贮,我們以iOS平臺為例,創(chuàng)建Objective-C代碼實現(xiàn)爆惧。在Flutter插件項目的ios文件夾中創(chuàng)建一個FlutterTestPlugin.hFlutterTestPlugin.m文件狸页。FlutterTestPlugin.h文件用于聲明類和方法,而FlutterTestPlugin.m文件實現(xiàn)方法扯再。

// FlutterTestPlugin.h文件

#import <Flutter/Flutter.h>

@interface FlutterTestPlugin : NSObject<FlutterPlugin>

@end
// FlutterTestPlugin.m文件

#import "FlutterTestPlugin.h"

@implementation FlutterTestPlugin

+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {
    FlutterMethodChannel* channel = [FlutterMethodChannel
                                       methodChannelWithName:@"flutter_test"
                                             binaryMessenger:[registrar messenger]];
    FlutterTestPlugin* instance = [[FlutterTestPlugin alloc] init];
    [registrar addMethodCallDelegate:instance channel:channel];
}

- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
    if ([@"getBatteryLevel" isEqualToString:call.method]) {
        int batteryLevel = [self getBatteryLevel];
        if (batteryLevel == -1) {
            result([FlutterError errorWithCode:@"UNAVAILABLE"
                                       message:@"Battery level not available."
                                       details:nil]);
        } else {
            result(@(batteryLevel));
        }
    } else {
        result(FlutterMethodNotImplemented);
    }
}

- (int)getBatteryLevel {
    UIDevice *device = UIDevice.currentDevice;
    device.batteryMonitoringEnabled = YES;
    if (device.batteryState == UIDeviceBatteryStateUnknown) {
        return -1;
    } else {
        return (int)(device.batteryLevel * 100);
    }
}

@end

上述代碼負責將原生方法(getBatteryLevel)公開給Flutter芍耘。getBatteryLevel方法將獲取iOS設備的電池水平并將其以整數(shù)形式返回。

3. Dart部分的實現(xiàn)

接下來熄阻,我們將使用Dart在Flutter中實現(xiàn)對原生代碼的調用斋竞。打開flutter_plugin/lib/flutter_plugin.dart文件,聲明Flutter插件及其方法饺律。

import 'dart:async';
import 'package:flutter/services.dart';

class FlutterTest {
  static const MethodChannel _channel =
      const MethodChannel('flutter_test');

  static Future<int> getBatteryLevel() async {
    try {
      final int result = await _channel.invokeMethod('getBatteryLevel');
      return result;
    } on PlatformException catch (e) {
      print("Error: '${e.message}'.");
      return -1;
    }
  }
}

我們已經(jīng)聲明了一個靜態(tài)函數(shù)窃页,該函數(shù)將通過在指定的Flutter承載平臺上呈現(xiàn)實現(xiàn),從而公開一個異步函數(shù)复濒,使您可以獲取設備電池電量(如果正在運行)。

接下來乒省,打開Flutter應用程序巧颈,并將其添加到flutter_plugin依賴項列表中。在Flutter應用程序主目錄下的pubspec.yaml文件中添加以下代碼:

dependencies:
  flutter:
    sdk: flutter

  flutter_plugin:
    path: ../flutter_plugin

在完成之后袖扛,運行flutter packages get以檢索依賴項砸泛。

現(xiàn)在就可以在Flutter中使用插件了。例如蛆封,在Flutter代碼中調用getBatteryLevel方法:

import 'package:flutter/material.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> {
  int _batteryLevel;

  @override
  void initState() {
    super.initState();
    getBatteryLevel();
  }

  Future<void> getBatteryLevel() async {
    final int result = await FlutterTest.getBatteryLevel();

    setState(() {
      _batteryLevel = result;
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: Text('Battery level: $_batteryLevel'),
        ),
      ),
    );
  }
}

4. 發(fā)布到pub.dev

當您完成了您的Flutter插件之后唇礁,您可以發(fā)布它到pub.dev以供其他用戶使用。發(fā)布到Pub.dev需要一些額外的步驟:

4.1 創(chuàng)建Pubspec.yaml文件

在項目的根目錄下惨篱,創(chuàng)建一個名為pubspec.yaml的文件盏筐。該文件描述了整個Flutter插件的元數(shù)據(jù)。以下是示例:

name: flutter_test
description: A Flutter plugin.
version: 0.0.1
author: Your Name
homepage: https://github.com/your/repository
repository: https://github.com/your/repository
dependencies:
  flutter:
    sdk: flutter

確保將name字段更改為您自己的插件名砸讳。

4.2 撰寫README.md文件

創(chuàng)建一個名為README.md的文件琢融,描述您的Flutter插件以及如何使用它。這個markdown文件將顯示在Pub.dev的插件頁面下簿寂。

4.3 打標簽

確保在發(fā)布插件之前打上標簽漾抬,類似以下命令:

git tag <version>

這將在pub.dev中顯示您的發(fā)布版本。

4.4 發(fā)布

終端中導航到Flutter插件項目根目錄常遂,運行以下命令:

flutter packages pub publish

如果您尚未關聯(lián)您的pub.dev帳戶纳令,并且沒有收到關于如何完成此操作的提示,終端將向您提供插件包的鏈接URL。按照步驟完成即可平绩。

總結

本教程詳細介紹了如何創(chuàng)建Flutter插件并將其發(fā)布到Pub.dev上圈匆,有了這個技能,您可以擴展您的應用程序馒过,并充分利用原生功能臭脓。不過,發(fā)布Flutter插件只是一部分腹忽,開發(fā)人員需要了解如何使他們的插件使用方便来累,適用廣泛才能獲得更多的關注。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末窘奏,一起剝皮案震驚了整個濱河市嘹锁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌着裹,老刑警劉巖领猾,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異骇扇,居然都是意外死亡摔竿,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門少孝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來继低,“玉大人,你說我怎么就攤上這事稍走≡蹋” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵婿脸,是天一觀的道長粱胜。 經(jīng)常有香客問我,道長狐树,這世上最難降的妖魔是什么焙压? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮褪迟,結果婚禮上冗恨,老公的妹妹穿的比我還像新娘。我一直安慰自己味赃,他們只是感情好掀抹,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著心俗,像睡著了一般傲武。 火紅的嫁衣襯著肌膚如雪蓉驹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天揪利,我揣著相機與錄音态兴,去河邊找鬼。 笑死疟位,一個胖子當著我的面吹牛瞻润,可吹牛的內容都是我干的。 我是一名探鬼主播甜刻,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼绍撞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了得院?” 一聲冷哼從身側響起傻铣,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎祥绞,沒想到半個月后非洲,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡蜕径,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年两踏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兜喻。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡缆瓣,死狀恐怖,靈堂內的尸體忽然破棺而出虹统,到底是詐尸還是另有隱情,我是刑警寧澤隧甚,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布车荔,位于F島的核電站,受9級特大地震影響戚扳,放射性物質發(fā)生泄漏忧便。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一帽借、第九天 我趴在偏房一處隱蔽的房頂上張望珠增。 院中可真熱鬧,春花似錦砍艾、人聲如沸蒂教。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凝垛。三九已至懊悯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間梦皮,已是汗流浹背炭分。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留剑肯,地道東北人捧毛。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像让网,于是被迫代替她去往敵國和親呀忧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內容