插件化開發(fā)之flutter和原生顏色傳輸

描述

在開發(fā)flutter地圖插件時蕊苗,其中有一個功能是要實現(xiàn)顯示簽到地點范圍栗精,簽到地點范圍是一個圓圈益老,為了通用彪蓬,需要從flutter層傳圓圈的填充顏色給原生,記錄下flutter和原生顏色的傳輸捺萌。

題外話

flutter和原生數(shù)據(jù)的傳輸档冬,個人比較喜歡的方式就是,把傳輸?shù)臄?shù)據(jù)都轉(zhuǎn)成string類型桃纯,并且是json 格式string類型來傳輸酷誓,不管是model還是單個數(shù)據(jù),這樣我們可以像解析網(wǎng)絡(luò)請求返回的數(shù)據(jù)一樣解析flutter和原生傳輸?shù)臄?shù)據(jù)态坦。
之前做flutter和原生通訊的插件盐数,試過直接把單個數(shù)據(jù)如int類型直接從flutter層傳給原生,但后面flutter sdk升級后伞梯,導(dǎo)致通訊失敗玫氢,花費了一些時間排查解決,所以flutter和原生數(shù)據(jù)的傳輸用json 格式string類型來傳輸靠譜又便于擴展谜诫;

踩過坑

最開始做法是:flutter層顏色定義為int型漾峡,原生android也用int型接收,android端會報錯猜绣,如下

com.google.gson.JsonSyntaxException: java.lang.NumberFormatException: Expected an int but was 4294967295 

上面?zhèn)鞯念伾禐?xffffffff,對應(yīng)的10進(jìn)制值為4294967295灰殴,對int會越界;但如果直接用0xffffffff在原生android設(shè)置顏色掰邢,它的參數(shù)也為int型牺陶,不會報錯,并且正常顯示辣之,翻譯就是setTextColor(0xffffffff)正常顯示顏色掰伸,setTextColor(4294967295)直接報錯;
仔細(xì)看設(shè)置顏色的int型前面多個@ColorInt注解怀估,估計是@ColorInt的作用:

public abstract void setTextColor(@ColorInt int color);

@ColorInt
Denotes that the annotated element represents a packed color int, AARRGGBB. If applied to an int array, every element in the array represents a color integer.
翻譯:被ColorInt注解的元素是一個包裝之后的顏色整型值 ( 格式:AARRGGBB )狮鸭,如果作用在整型數(shù)組上說明數(shù)組中的每一個值都代表一個顏色值

進(jìn)入正題

flutter層
1合搅、定義flutter傳給原生的model
import 'dart:convert';
import 'dart:ui';

class MarkerCircleOptions {
  ...
  ///圓圈填充顏色
  Color fillColor;//這里顏色定義為Color類型,是為了讓flutter層使用無感
 

  MarkerCircleOptions({
     ...
    @required this.fillColor,
     ...
  });



  Map<String, Object> toJson() {
    return {
      ...
      'fillColor':fillColor.value.toRadixString(16),//實際傳給原生是string類型歧蕉,比如白色灾部,原生接收到的值為ffffffff的字符串,這樣在ios和android都可以處理惯退;
    };
  }

  String toJsonString() => jsonEncode(toJson());//將model轉(zhuǎn)為json格式string赌髓,為傳給原生的數(shù)據(jù)


}

  • Color fillColor; 這里顏色定義為Color類型,是為了讓flutter層使用無感
  • 'fillColor':fillColor.value.toRadixString(16),這里是傳給原生的color催跪,Color類型通過fillColor.value.toRadixString(16)轉(zhuǎn)為string類型锁蠕,實際傳給原生是string類型,比如白色懊蒸,原生接收到的值為ffffffff的字符串荣倾,這樣在ios和android都通用;
  • String toJsonString() => jsonEncode(toJson()); 將model轉(zhuǎn)為json格式string骑丸,為傳給原生的數(shù)據(jù)
2舌仍、flutter使用
///flutter層使用
 MarkerCircleOptions markOptions = MarkerCircleOptions(
      ...
     fillColor: Color(0x263F8EF5),//flutter層使用顏色無感
     ...
  );
 _aMapController.addCircleMarker(markOptions);
  ///flutter傳原生方法
  Future addCircleMarker(MarkerCircleOptions options) {
    final _optionsJson = options.toJsonString();//將model轉(zhuǎn)為json格式string,傳給原生
    return _mapChannel.invokeMethod(
      AMapNativeChannelConstant.METHOD_ADD_CIRCLE_MARKER,
      {AMapNativeParamsKeyConstant.MARKER_CIRCLE_OPTIONS: _optionsJson},
    );
  }
原生層
android

通過Color.parseColor("#"+fillColor)使用

ios

String擴展方法:

#import <Foundation/Foundation.h>

@interface NSString (Color)

- (UIColor *)hexStringToColor;

@end



#import "NSString+Color.h"


@implementation NSString (Color)

- (UIColor *)hexStringToColor {
    NSString *cString = [[self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] uppercaseString];

    // String should be 6 or 8 characters
    if ([cString length] < 6) {
        return [UIColor clearColor];
    }

    // 從六位數(shù)值中找到RGB對應(yīng)的位數(shù)并轉(zhuǎn)換
    NSRange range;
    range.location = 0;
    range.length = 2;

    //A, R,G, B
    NSString *aString = [cString substringWithRange:range];

    range.location = 2;
    NSString *rString = [cString substringWithRange:range];

    range.location = 4;
    NSString *gString = [cString substringWithRange:range];

    range.location = 6;
    NSString *bString = [cString substringWithRange:range];

    // Scan values
    unsigned int a, r, g, b;
    [[NSScanner scannerWithString:aString] scanHexInt:&a];
    [[NSScanner scannerWithString:rString] scanHexInt:&r];
    [[NSScanner scannerWithString:gString] scanHexInt:&g];
    [[NSScanner scannerWithString:bString] scanHexInt:&b];

    return [UIColor colorWithRed:((float) r / 255.0f) green:((float) g / 255.0f) blue:((float) b / 255.0f) alpha:((float) a / 255.0f)];
}

@end

使用

UIColor xxx = [fillColor hexStringToColor];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市者娱,隨后出現(xiàn)的幾起案子抡笼,更是在濱河造成了極大的恐慌苏揣,老刑警劉巖黄鳍,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異平匈,居然都是意外死亡框沟,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門增炭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來忍燥,“玉大人,你說我怎么就攤上這事隙姿∶仿ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵输玷,是天一觀的道長队丝。 經(jīng)常有香客問我,道長欲鹏,這世上最難降的妖魔是什么机久? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮赔嚎,結(jié)果婚禮上膘盖,老公的妹妹穿的比我還像新娘胧弛。我一直安慰自己,他們只是感情好侠畔,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布结缚。 她就那樣靜靜地躺著,像睡著了一般软棺。 火紅的嫁衣襯著肌膚如雪掺冠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天码党,我揣著相機與錄音德崭,去河邊找鬼。 笑死揖盘,一個胖子當(dāng)著我的面吹牛眉厨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播兽狭,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼憾股,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了箕慧?” 一聲冷哼從身側(cè)響起服球,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎颠焦,沒想到半個月后斩熊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡伐庭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年粉渠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片圾另。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡霸株,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出集乔,到底是詐尸還是另有隱情去件,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布扰路,位于F島的核電站尤溜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏幼衰。R本人自食惡果不足惜靴跛,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望渡嚣。 院中可真熱鬧梢睛,春花似錦肥印、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至藏畅,卻和暖如春敷硅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背愉阎。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工绞蹦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人榜旦。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓幽七,卻偏偏與公主長得像,于是被迫代替她去往敵國和親溅呢。 傳聞我的和親對象是個殘疾皇子澡屡,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 久違的晴天,家長會咐旧。 家長大會開好到教室時驶鹉,離放學(xué)已經(jīng)沒多少時間了。班主任說已經(jīng)安排了三個家長分享經(jīng)驗铣墨。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,513評論 16 22
  • 創(chuàng)業(yè)是很多人的夢想室埋,多少人為了理想和不甘選擇了創(chuàng)業(yè)來實現(xiàn)自我價值,我就是其中一個踏兜。 創(chuàng)業(yè)后词顾,我由女人變成了超人,什...
    亦寶寶閱讀 1,802評論 4 1
  • 今天感恩節(jié)哎碱妆,感謝一直在我身邊的親朋好友。感恩相遇昔驱!感恩不離不棄疹尾。 中午開了第一次的黨會,身份的轉(zhuǎn)變要...
    迷月閃星情閱讀 10,559評論 0 11
  • 可愛進(jìn)取骤肛,孤獨成精纳本。努力飛翔,天堂翱翔腋颠。戰(zhàn)爭美好繁成,孤獨進(jìn)取。膽大飛翔淑玫,成就輝煌巾腕。努力進(jìn)取面睛,遙望,和諧家園尊搬∪可愛游走...
    趙原野閱讀 2,720評論 1 1