4. 【文檔講解】項(xiàng)目結(jié)構(gòu)颁井、資源、依賴和本地化

3-5 【文檔講解】項(xiàng)目結(jié)構(gòu)蠢护、資源雅宾、依賴和本地化

聲明:Flutter專欄文檔均來自慕課網(wǎng)
https://coding.imooc.com/class/321.html

【文檔講解】項(xiàng)目結(jié)構(gòu)、資源葵硕、依賴和本地化

  • 項(xiàng)目文件結(jié)構(gòu)是怎樣子的眉抬?
  • 在哪里歸檔圖片資源以及如何處理不同分辨率?
  • 如何歸檔strings資源懈凹,以及如何處理不同語(yǔ)言蜀变?
  • 如何添加Flutter項(xiàng)目所需的依賴?

項(xiàng)目文件結(jié)構(gòu)是怎樣子的介评?

一個(gè)Flutter項(xiàng)目的通常文件結(jié)構(gòu)是這樣子的:

┬
└ projectname
  ┬
  ├ android      - Android部分的工程文件
  ├ build        - 項(xiàng)目的構(gòu)建輸出目錄
  ├ ios          - iOS部分的工程文件
  ├ lib          - 項(xiàng)目中的Dart源文件
    ┬
    └ src        - 包含其他源文件
    └ main.dart  - 自動(dòng)生成的項(xiàng)目入口文件库北,類似RN的index.js文件
  ├ test         - 測(cè)試相關(guān)文件
  └ pubspec.yaml - 項(xiàng)目依賴配置文件類似于RN的 package.json 

當(dāng)然大家也可以根據(jù)需要進(jìn)行調(diào)整。

在哪里歸檔圖片資源以及如何處理不同分辨率们陆?

  • 雖然Android將resources 和 assets 區(qū)別對(duì)待贤惯,但在Flutter中它們都會(huì)被作為assets處理, 所有存在于Android上res / drawable- *文件夾中的資源都放在Flutter的assets文件夾中棒掠。
  • 與Android類似孵构,iOS 同樣將 images 和 assets 作為不同的東西,而 Flutter 中只有 assets烟很。被放到 iOS 中 Images.xcasset 文件夾下的資源在 Flutter 中被放到了 assets 文件夾中颈墅。

在Flutter中assets可以是任意類型的文件,而不僅僅是圖片雾袱。例如恤筛,你可以把 json 文件放置到 my-assets 文件夾中。

my-assets/data.json

記得在 pubspec.yaml 文件中聲明 assets:

assets:
 - my-assets/data.json

然后在代碼中我們可以通過 AssetBundle 來訪問它:

import 'dart:async' show Future;
import 'package:flutter/services.dart' show rootBundle;

Future<String> loadAsset() async {
  return await rootBundle.loadString('my-assets/data.json');
}

對(duì)于圖片芹橡,F(xiàn)lutter 像 iOS 一樣毒坛,遵循了一個(gè)簡(jiǎn)單的基于像素密度的格式。Image assets 可能是 1.0x 2.0x 3.0x 或是其他的任何倍數(shù)林说。這個(gè) devicePixelRatio 表示了物理像素到單個(gè)邏輯像素的比率煎殷。

Android不同像素密度的圖片和Flutter的像素比率的對(duì)應(yīng)關(guān)系

ldpi    0.75x
mdpi    1.0x
hdpi    1.5x
xhdpi   2.0x
xxhdpi  3.0x
xxxhdpi 4.0x

Assets 可以被放置到任何屬性文件夾中——Flutter 并沒有預(yù)先定義的文件結(jié)構(gòu)。我們需要在 pubspec.yaml 文件中聲明 assets 的位置腿箩,然后 Flutter 會(huì)把他們識(shí)別出來豪直。

舉個(gè)例子,要把一個(gè)名為my_icon.png 的圖片放到 Flutter 工程中珠移,你可能想要把它放到images文件夾中弓乙。把圖片(1.0x)放置到 images 文件夾中末融,并把其它分辨率的圖片放在對(duì)應(yīng)的子文件夾中,并接上合適的比例系數(shù)暇韧,就像這樣:

images/my_icon.png       // Base: 1.0x image
images/2.0x/my_icon.png  // 2.0x image
images/3.0x/my_icon.png  // 3.0x image

接下來就可以在pubspec.yaml文件中這樣聲明這個(gè)圖片資源:

assets:
 - images/my_icon.png

現(xiàn)在勾习,我們就可以借助AssetImage來訪問它了。

return AssetImage("images/a_dot_burr.jpeg");

也可通過 Image widget 直接使用:

@override
Widget build(BuildContext context) {
  return Image.asset("images/my_image.png");
}

更多內(nèi)容懈玻,可參考在Flutter中添加assets 和 images巧婶。

如何歸檔strings資源,以及如何處理不同語(yǔ)言酪刀?

不像 iOS 擁有一個(gè) Localizable.strings 文件,F(xiàn)lutter目前沒有專門的字符串資源系統(tǒng)钮孵。 目前骂倘,最佳做法是將strings資源作為靜態(tài)字段保存在類中。 例如:

class Strings {
  static String welcomeMessage = "Welcome To Flutter";
}

然后像如下方式來訪問它:

Text(Strings.welcomeMessage)

默認(rèn)情況下巴席,F(xiàn)lutter 只支持美式英語(yǔ)字符串历涝。如果你要支持其他語(yǔ)言,請(qǐng)引入 flutter_localizations 包漾唉。你可能也要引入 intl 包來支持其他的 i10n 機(jī)制荧库,比如日期/時(shí)間格式化。

dependencies:
  # ...
  flutter_localizations:
    sdk: flutter
  intl: "^0.15.6"

要使用 flutter_localizations 包赵刑,還需要在 app widget 中指定 localizationsDelegatessupportedLocales分衫。

import 'package:flutter_localizations/flutter_localizations.dart';

MaterialApp(
 localizationsDelegates: [
   // Add app-specific localization delegate[s] here
   GlobalMaterialLocalizations.delegate,
   GlobalWidgetsLocalizations.delegate,
 ],

 supportedLocales: [
    const Locale('en', 'US'), // English
    const Locale('he', 'IL'), // Hebrew
    // ... other locales the app supports
  ],
  // ...
)

這些代理包括了實(shí)際的本地化值,并且 supportedLocales 定義了 App 支持哪些地區(qū)般此。上面的例子使用了一個(gè) MaterialApp 蚪战,所以它既有 GlobalWidgetsLocalizations 用于基礎(chǔ) widgets,也有 MaterialWidgetsLocalizations 用于 Material wigets 的本地化铐懊。如果你使用 WidgetsApp 邀桑,則無需包括后者。注意科乎,這兩個(gè)代理雖然包括了“默認(rèn)”值壁畸,但如果你想讓你的 App 本地化,你仍需要提供一或多個(gè)代理作為你的 App 本地化副本茅茂。

當(dāng)初始化時(shí)捏萍,WidgetsAppMaterialApp 會(huì)使用你指定的代理為你創(chuàng)建一個(gè) Localizations widget。Localizations widget 可以隨時(shí)從當(dāng)前上下文中訪問設(shè)備的地點(diǎn)空闲,或者使用 Window.locale照弥。

要訪問本地化文件,使用 Localizations.of() 方法來訪問提供代理的特定本地化類进副。如需翻譯这揣,使用 intl_translation 包來取出翻譯副本到 arb 文件中悔常。把它們引入 App 中,并用 intl 來使用它們给赞。

更多 Flutter 中國(guó)際化和本地化的細(xì)節(jié)机打,請(qǐng)?jiān)L問 internationalization guide ,里面有不使用 intl 包的示例代碼片迅。

注意残邀,在 Flutter 1.0 beta 2 之前,在 Flutter 中定義的 assets 不能在原生一側(cè)被訪問柑蛇。原生定義的資源在 Flutter 中也不可用芥挣,因?yàn)樗鼈冊(cè)讵?dú)立的文件夾中。

如何添加Flutter項(xiàng)目所需的依賴耻台?

  • 在Android中空免,你可以在Gradle文件來添加依賴項(xiàng);
  • 在 iOS 中盆耽,通常把依賴添加到 Podfile 中蹋砚;
  • 在RN中,通常是由package.json來管理項(xiàng)目依賴摄杂;

Flutter 使用 Dart 構(gòu)建系統(tǒng)和 Pub 包管理器來處理依賴坝咐。這些工具將Android 和 iOS native 包裝應(yīng)用程序的構(gòu)建委派給相應(yīng)的構(gòu)建系統(tǒng)。

dependencies:
  flutter:
    sdk: flutter
  google_sign_in: ^3.0.3

在Flutter中析恢,雖然在Flutter項(xiàng)目中的Android文件夾下有Gradle文件墨坚,但只有在添加平臺(tái)相關(guān)所需的依賴關(guān)系時(shí)才使用這些文件。 否則映挂,應(yīng)該使用pubspec.yaml來聲明用于Flutter的外部依賴項(xiàng)框杜。

iOS也是一樣,如果你的 Flutter 工程中的 iOS 文件夾中有 Podfile袖肥,請(qǐng)僅在添加iOS平臺(tái)相關(guān)的依賴時(shí)使用它咪辱。否則,應(yīng)該使用pubspec.yaml來聲明用于Flutter的外部依賴項(xiàng)椎组。

推薦一個(gè)用于查找Flutter插件的網(wǎng)站:Pub site油狂。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市寸癌,隨后出現(xiàn)的幾起案子专筷,更是在濱河造成了極大的恐慌,老刑警劉巖蒸苇,帶你破解...
    沈念sama閱讀 223,207評(píng)論 6 521
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件磷蛹,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡溪烤,警方通過查閱死者的電腦和手機(jī)味咳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,455評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門庇勃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人槽驶,你說我怎么就攤上這事责嚷。” “怎么了掂铐?”我有些...
    開封第一講書人閱讀 170,031評(píng)論 0 366
  • 文/不壞的土叔 我叫張陵罕拂,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我全陨,道長(zhǎng)爆班,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,334評(píng)論 1 300
  • 正文 為了忘掉前任辱姨,我火速辦了婚禮柿菩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘炮叶。我一直安慰自己碗旅,他們只是感情好渡处,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,322評(píng)論 6 398
  • 文/花漫 我一把揭開白布镜悉。 她就那樣靜靜地躺著,像睡著了一般医瘫。 火紅的嫁衣襯著肌膚如雪侣肄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,895評(píng)論 1 314
  • 那天醇份,我揣著相機(jī)與錄音稼锅,去河邊找鬼。 笑死僚纷,一個(gè)胖子當(dāng)著我的面吹牛矩距,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播怖竭,決...
    沈念sama閱讀 41,300評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼锥债,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了痊臭?” 一聲冷哼從身側(cè)響起哮肚,我...
    開封第一講書人閱讀 40,264評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎广匙,沒想到半個(gè)月后允趟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,784評(píng)論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鸦致,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,870評(píng)論 3 343
  • 正文 我和宋清朗相戀三年潮剪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了涣楷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,989評(píng)論 1 354
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鲁纠,死狀恐怖总棵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情改含,我是刑警寧澤情龄,帶...
    沈念sama閱讀 36,649評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站捍壤,受9級(jí)特大地震影響骤视,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鹃觉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,331評(píng)論 3 336
  • 文/蒙蒙 一专酗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盗扇,春花似錦祷肯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,814評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至斑鼻,卻和暖如春蒋纬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背坚弱。 一陣腳步聲響...
    開封第一講書人閱讀 33,940評(píng)論 1 275
  • 我被黑心中介騙來泰國(guó)打工蜀备, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人荒叶。 一個(gè)月前我還...
    沈念sama閱讀 49,452評(píng)論 3 379
  • 正文 我出身青樓碾阁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親些楣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子脂凶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,995評(píng)論 2 361

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

  • 官方英文原文: https://flutter.io/flutter-for-android/ 說明:此文上接 給...
    horseLai閱讀 2,304評(píng)論 0 9
  • 一、初識(shí)flutter image 在講解源碼之前戈毒,我們先看下面幾個(gè)例子艰猬,回顧一下flutter加載圖片資源的方式...
    五月_f6d4閱讀 11,210評(píng)論 3 23
  • 前言 如果APP有需要支持多種語(yǔ)言,就需要支持國(guó)際化,無論是android和ios,現(xiàn)在針對(duì)flutter的國(guó)際化...
    lebonbill閱讀 10,739評(píng)論 4 6
  • 1??Flutter中的UIView相當(dāng)于什么冠桃? 在iOS中,您在UI中創(chuàng)建的大部分內(nèi)容都是使用視圖對(duì)象完成的道宅,這...
    蓋世英雄_ix4n04閱讀 1,213評(píng)論 0 1
  • 一天整體表現(xiàn)一般食听。 吃奶按時(shí)喂養(yǎng)胸蛛,三小時(shí)一次,每次吃的時(shí)候都感覺不是很餓樱报。 睡覺沒有深度睡眠葬项。哄睡放下,十幾分鐘就...
    hs雙兒閱讀 94評(píng)論 0 0