flutter 國際化(Intl)初始化流程詳解

flutter中常用的國際化是Intl,通常會(huì)生成這樣的目錄結(jié)構(gòu)


image.png

然后在代碼中的使用方式為

MaterialApp(
  localizationsDelegates: [S.delegate],
),
S.of(context).test;

看到of想必大家能聯(lián)想起InheritedWidget,其實(shí)國際化本質(zhì)就是依托于InheritedWidget
下面我們從后往前推,先看下S.of(context)

static S of(BuildContext context) {
    final instance = S.maybeOf(context);
    assert(instance != null,
        'No instance of S present in the widget tree. Did you add S.delegate in localizationsDelegates?');
    return instance!;
  }

  static S? maybeOf(BuildContext context) {
    return Localizations.of<S>(context, S);
  }

這里出現(xiàn)了Localizations

static T? of<T>(BuildContext context, Type type) {
    assert(context != null);
    assert(type != null);
    final _LocalizationsScope? scope = context.dependOnInheritedWidgetOfExactType<_LocalizationsScope>();
    return scope?.localizationsState.resourcesFor<T?>(type);
  }

然后是_LocalizationsScope,他是我們要找的InheritedWidget

image.png

所以,可想而知,我們的國家化的內(nèi)容用該是通過這里獲取
然后我們看看_LocalizationsScope是在哪里創(chuàng)建的
image.png

image.png

最終WidgetsApp就是在MaterialApp中創(chuàng)建的
通過上邊的源代碼發(fā)現(xiàn),我們最初傳入的[S.delegate]給到了Localizationsdelegates屬性,而Localizationsstate,是賦值給了_LocalizationsScopelocalizationsState屬性
所以此時(shí)思路應(yīng)該清晰,Localizations負(fù)責(zé)管理所有的國際化,而_LocalizationsScope是負(fù)責(zé)國際化上下文的管理
這個(gè)時(shí)候我們返回頭再看Localizations.of<S>(context, S)干了什么
image.png

image.png

繼續(xù)尋找_typeToResources的來源
image.png

image.png

這里可以看到Localizationsdelegates最終轉(zhuǎn)化成了_LocalizationsState_typeToResources,而_typeToResources是以國際化的類型與國際化的實(shí)例作為鍵值對(duì)的形式存儲(chǔ)了起來

到此項(xiàng)目中使用國際化的詳細(xì)流程就結(jié)束了

這里我們可以優(yōu)化的一點(diǎn)是:如果是如果我們不想在使用的時(shí)候依托于上下文,來使用國際化,我們可以尋找一個(gè)恰當(dāng)?shù)臅r(shí)機(jī)來保存一個(gè)_LocalizationsScope創(chuàng)建之后的一個(gè)BuildContext,因?yàn)檫@個(gè)BuildContext足以通過上下文獲取到國際化的內(nèi)容,這就有很多種方式了,這列舉一種:onGenerateTitle中的context
因?yàn)橥ㄟ^上下文

image.png

image.png

image.png

這里的title最終會(huì)到_LocalizationsScope下游,所以我們可以保存onGenerateTitle中的BuildContext

MaterialApp(
          onGenerateTitle: (BuildContext context) {
            globalContext = context;
            return "title";
          },
          localizationsDelegates: [S.delegate],
)

T getLanguage<T>() {
    final instance = Localizations.of<T>(globalContext, T);
    assert(instance != null, '沒有找到${T}');
    return instance!;
}

在使用的時(shí)候,直接提供Type就可以了,實(shí)現(xiàn)了國際化與BuildContext樹的解耦

getLanguage<S>().test;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 邂逅FLutter 萬物皆是Widget 一般縮進(jìn)2個(gè)空格 文字居中 Widget Center() Materi...
    JackLeeVip閱讀 3,492評(píng)論 0 4
  • 一. 國際化的認(rèn)識(shí) 開發(fā)一個(gè)App,如果我們的App需要面向不同的語種(比如中文、英文、繁體等),那么我們需要對(duì)齊...
    5e4c664cb3ba閱讀 1,607評(píng)論 0 3
  • 概述 國際化的認(rèn)識(shí) 國際化的適配 國際化的工具 一、國際化的認(rèn)識(shí) 開發(fā)一個(gè)App,如果我們的App需要面向不同的語...
    IIronMan閱讀 845評(píng)論 0 2
  • Flutter 國際化 詳情鏈接[https://book.flutterchina.club/chapter13...
    土豆騎士閱讀 2,240評(píng)論 1 5
  • 一、前言 從 2015 年接觸 Flutter 到現(xiàn)在也有兩年多時(shí)間,在這期間我并沒有正真地去了解這個(gè)神奇的框架,...
    _番茄沙司閱讀 35,346評(píng)論 21 48

友情鏈接更多精彩內(nèi)容