『Flutter-插件篇』實現(xiàn)一款超酷的動態(tài)天氣背景插件

前言

前不久锁保,利用周末時間學習并完成一個簡單的 Flutter 項目 - 簡悅天氣簡約不簡單半沽,豐富不復雜爽柒,這是一款簡約風格的 flutter 天氣項目,提供實時者填、多日浩村、24 小時、臺風路徑占哟、語音播報以及生活指數(shù)等服務心墅,支持定位、刪除榨乎、搜索等操作怎燥。

下圖為主頁效果,點擊下載 進行體驗:

home

之前發(fā)了三篇文章:

對天氣背景動畫的具體實現(xiàn)做了詳情的分析和總結(jié)蜜暑,很多小伙伴私信我铐姚,希望可以出一個天氣動態(tài)背景插件。正好當時寫的時候肛捍,就以模塊化的思想隐绵,單一和解耦的設計原則,放置在單獨的 package 下篇梭,所以后續(xù)根據(jù)官方編寫插件文檔氢橙,抽成插件酝枢,希望給有需要的小伙伴能提供幫助恬偷。同時,分享如何寫一個高質(zhì)量插件的過程和注意事項帘睦。

因此袍患,本篇文章的主要兩個主題:

  1. 介紹 flutter_weather_bg 此插件的功能和使用說明
  2. 分享編寫插件的方法和注意事項

超酷的動態(tài)天氣背景插件

介紹

pub 地址

Github 地址

這是一款豐富炫酷的天氣動態(tài)背景插件,支持 15 種天氣類型竣付。

功能

  • 支持 15 種 天氣類型:晴诡延、晴晚、多云古胆、多云晚肆良、陰筛璧、小中大雨、小中大雪惹恃、霧、霾巫糙、浮塵和雷暴
  • 支持 動態(tài)縮放尺寸,適配多場景下展示
  • 支持 切換天氣類型時過度動畫

支持的平臺

  • Flutter Android
  • Flutter iOS
  • Flutter web
  • Flutter desktop

安裝

添加 flutter_weather_bg: ^2.8.2pubspec.yaml 文件中醉锄,并且導包:

import 'package:flutter_weather_bg/flutter_weather_bg.dart';

使用

通過創(chuàng)建 WeatherBg 配置天氣類型,需要傳入寬高來完成最終展示

WeatherBg(weatherType: _weatherType,width: _width,height: _height,)

截圖效果

對不同的特點進行相應的 gif 展示浙值。

  1. 全屏沉浸式翻頁效果
home
  1. 城市管理列表效果
list
  1. 多樣的宮格效果
grid
  1. 切換天氣類型時的過度動畫效果
check
  1. 修改寬高的適配效果
width_height

編寫一款高質(zhì)量的插件

目前 Flutter 那么火,離不開高熱度的社區(qū)以及豐富的插件妆够,所以如果有想法或者有能力的話,盡可能的為社區(qū)貢獻出一份微薄之力吧负蚊。

那既然選擇編寫并發(fā)布一款插件神妹,就要對其負責,不只是負責完成編碼任務家妆,盡可能的提供詳細的使用文檔說明,有條件的話伤极,以圖文并茂的方式更好,這樣開發(fā)者才會愿意使用你的插件哨坪。

創(chuàng)建插件項目

image

使用 Android Studio 可以直接創(chuàng)建 Flutter Plugin当编,或者直接通過命令 flutter create -t plugin flutter_demo_plugin 直接在當前文件夾生成插件目錄届慈。

創(chuàng)建好后忿偷,會生成如下的文件目錄:

image
目錄 描述
android/ android 端相關代碼
ios/ ios 相關代碼
example/ 樣例演示項目
lib/ flutter 端代碼
test/ 單元測試代碼
CHANGELOG 每個版本的更新日志說明
LICENSE license 相關
pubspec.yaml 項目名稱、項目描述揍拆、版本茶凳、依賴等相關
README.md 項目的 readme 文檔

編寫插件邏輯

Android 端

android/src/main/java/com/example/flutter_demo_plugin/FlutterDemoPlugin.java 中編寫與 Android 端交互的邏輯嫂拴。

public class FlutterDemoPlugin implements FlutterPlugin, MethodCallHandler {

  private MethodChannel channel;

  @Override
  public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {
    channel = new MethodChannel(flutterPluginBinding.getFlutterEngine().getDartExecutor(), "flutter_demo_plugin");
    channel.setMethodCallHandler(this);
  }

  public static void registerWith(Registrar registrar) {
    final MethodChannel channel = new MethodChannel(registrar.messenger(), "flutter_demo_plugin");
    channel.setMethodCallHandler(new FlutterDemoPlugin());
  }

  @Override
  public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
    if (call.method.equals("getPlatformVersion")) {
      result.success("Android " + android.os.Build.VERSION.RELEASE);
    } else {
      result.notImplemented();
    }
  }

  @Override
  public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
    channel.setMethodCallHandler(null);
  }
}
  1. 創(chuàng)建 MethodChannel筒狠,定義通信的唯一標識 flutter_demo_plugin
  2. 注冊
  3. 根據(jù)方法來處理相應的邏輯

iOS 端

iOS 類似,只不過是按照 iOS 端的寫法窟蓝。

  1. 創(chuàng)建 FlutterDemoPlugin.h
#import <Flutter/Flutter.h>

@interface FlutterDemoPlugin : NSObject<FlutterPlugin>
@end
  1. FlutterDemoPlugin.m 中編寫邏輯
#import "FlutterDemoPlugin.h"

@implementation FlutterDemoPlugin
+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {
  FlutterMethodChannel* channel = [FlutterMethodChannel
      methodChannelWithName:@"flutter_demo_plugin"
            binaryMessenger:[registrar messenger]];
  FlutterDemoPlugin* instance = [[FlutterDemoPlugin 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

Flutter 端

直接在 lib/flutter_demo_plugin.dart 中調(diào)用定義好的方法即可:

class FlutterDemoPlugin {
  static const MethodChannel _channel =
      const MethodChannel('flutter_demo_plugin');

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

發(fā)布前準備

代碼邏輯編寫完畢,離發(fā)布還有最后一步状共,也是編寫高質(zhì)量插件的重要一步谁帕。

image

在項目發(fā)布后,等待一段時間匈挖,這里會有對項目的評價分數(shù)碾牌,開發(fā)者可以據(jù)此作為選擇的標準。那如何達到此標準儡循,接下來會進行介紹。

  1. 在 pubspec.yaml 中配置版本信息
// 配置項目名稱
name: flutter_demo_plugin
// 配置項目描述择膝,簡要并能概括項目的內(nèi)容和特點
description: A new Flutter plugin.
// 項目版本,每次發(fā)布更新肴捉,都需要增加此配置
version: 0.0.1
// 作者信息
author:
// 主頁信息
homepage:

environment:
  sdk: ">=2.7.0 <3.0.0"
  flutter: ">=1.20.0 <2.0.0"

dependencies:
  flutter:
    sdk: flutter

dev_dependencies:
  flutter_test:
    sdk: flutter

// 如果只是純 dart 插件,此斷可以不加
flutter:
  plugin:
    platforms:
      android:
        package: com.example.flutter_demo_plugin
        pluginClass: FlutterDemoPlugin
      ios:
        pluginClass: FlutterDemoPlugin
      macos:
        pluginClass: FlutterDemoPlugin
      web:
        pluginClass: FlutterDemoPlugin
        fileName: flutter_demo_plugin.dart
  1. 提供詳細的 README.md 項目使用介紹傲隶,最好是英文

  2. 提供詳細的 CHANGELOG.md 版本迭代更新日志

  3. example/lib/main.dart 中窃页,要有詳細的代碼使用案例

  4. 代碼中,對公有方法和變量腮出,提供盡可能詳細的說明

  5. 完善插件支持平臺

  6. 代碼保證完整性芝薇、正確性和可編譯

  7. 插件包中的所有依賴要保證是最新版本

這些是通過腳本工具自動檢測,除此靜態(tài)的配置洛二,更重要的代碼質(zhì)量和盡可能的去維護攻锰,這樣才是一款合格的插件妓雾。

發(fā)布

最后娶吞,只需要通過 flutter packages pub publish --server=https://pub.dartlang.org 命令即可發(fā)布。

當看到:

image

恭喜證明你上傳成功了

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末妒蛇,一起剝皮案震驚了整個濱河市楷拳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌欢揖,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件烈钞,死亡現(xiàn)場離奇詭異坤按,居然都是意外死亡毯欣,警方通過查閱死者的電腦和手機臭脓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來算吩,“玉大人佃扼,你說我怎么就攤上這事〖嬉” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵窍霞,是天一觀的道長。 經(jīng)常有香客問我但金,道長郁季,這世上最難降的妖魔是什么冷溃? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任似枕,我火速辦了婚禮,結(jié)果婚禮上凿歼,老公的妹妹穿的比我還像新娘。我一直安慰自己答憔,他們只是感情好,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布洁桌。 她就那樣靜靜地躺著侯嘀,像睡著了一般另凌。 火紅的嫁衣襯著肌膚如雪戒幔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天工坊,我揣著相機與錄音敢订,去河邊找鬼。 笑死楚午,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的矾柜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼里覆,長吁一口氣:“原來是場噩夢啊……” “哼缆瓣!你這毒婦竟也來了喧枷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤窟却,失蹤者是張志新(化名)和其女友劉穎呻逆,沒想到半個月后菩帝,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體咖城,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡宜雀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年握础,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片禀综。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖定枷,靈堂內(nèi)的尸體忽然破棺而出孤澎,到底是詐尸還是另有隱情欠窒,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布型将,位于F島的核電站,受9級特大地震影響茶敏,放射性物質(zhì)發(fā)生泄漏缚俏。R本人自食惡果不足惜惊搏,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一恬惯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧酪耳,春花似錦、人聲如沸碗暗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至噪奄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間都毒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工账劲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留金抡,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓竟终,卻偏偏與公主長得像,于是被迫代替她去往敵國和親统捶。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354