Flutter的项⽬⽂件结构
项⽬⽂件结构是怎样⼦的?
⼀个Flutter项⽬的通常⽂件结构是这样⼦的:
flutter开发app┬
└ projectname
┬
├ android - Android部分的⼯程⽂件
├ build - 项⽬的构建输出⽬录
├ ios - iOS部分的⼯程⽂件
├ lib - 项⽬中的Dart源⽂件
┬
└ src - 包含其他源⽂件
└ main.dart - ⾃动⽣成的项⽬⼊⼝⽂件,类似RN的index.js⽂件
├ test - 测试相关⽂件
└ pubspec.yaml - 项⽬依赖配置⽂件类似于RN的 package.json
在哪⾥归档图⽚资源以及如何处理不同分辨率?
虽然Android将resources 和 assets 区别对待,但在Flutter中它们都会被作为assets处理,所有存在于Android上res / drawable- *⽂件夹中的资源都放在Flutter的assets⽂件夹中。
与Android类似,iOS 同样将 images 和 assets 作为不同的东西,⽽ Flutter 中只有 assets。被放到 iOS 中 asset ⽂件夹下的资源在 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');
}
对于图⽚,Flutter 像 iOS ⼀样,遵循了⼀个简单的基于像素密度的格式。Image assets 可能是 1.0x 2.0x 3.0x 或是其他的任何倍数。这
个 devicePixelRatio 表⽰了物理像素到单个逻辑像素的⽐率。
Android不同像素密度的图⽚和Flutter的像素⽐率的对应关系
ldpi 0.75x
mdpi 1.0x
hdpi 1.5x
xhdpi 2.0x
xxhdpi 3.0x
xxxhdpi 4.0x
Assets 可以被放置到任何属性⽂件夹中——Flutter 并没有预先定义的⽂件结构。我们需要在pubspec.yaml⽂件中声明 assets 的位置,然后Flutter 会把他们识别出来。
举个例⼦,要把⼀个名为my_icon.png的图⽚放到 Flutter ⼯程中,你可能想要把它放到images⽂件夹中。把图⽚(1.0x)放置到 images ⽂件夹中,并把其它分辨率的图⽚放在对应的⼦⽂件夹中,并接上合适的⽐例系数,就像这样:
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⽂件中这样声明这个图⽚资源:
assets:
- images/my_icon.png
现在,我们就可以借助AssetImage来访问它了。
return AssetImage("images/a_dot_burr.jpeg");
也可通过Image widget 直接使⽤:
@override
Widget build(BuildContext context) {
return Image.asset("images/my_image.png");
}
如何归档strings资源,以及如何处理不同语⾔?
不像 iOS 拥有⼀个Localizable.strings⽂件,Flutter⽬前没有专门的字符串资源系统。⽬前,最佳做法是将strings资源作为静态字段保存在类中。例如:
class Strings {
static String welcomeMessage = "Welcome To Flutter";
}
然后像如下⽅式来访问它:
Text(Strings.welcomeMessage)
默认情况下,Flutter 只⽀持美式英语字符串。如果你要⽀持其他语⾔,请引⼊flutter_localizations包。你可能也要引⼊ intl 包来⽀持其他的
i10n 机制,⽐如⽇期/时间格式化。
dependencies:
# ...
flutter_localizations:
sdk: flutter
intl: "^0.15.6"
要使⽤flutter_localizations包,还需要在 app widget 中指定localizationsDelegates和supportedLocales。
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
],
// ...
)
这些代理包括了实际的本地化值,并且supportedLocales定义了 App ⽀持哪些地区。上⾯的例⼦使⽤了⼀个MaterialApp,所以它既
有GlobalWidgetsLocalizations⽤于基础 widgets,也有MaterialWidgetsLocalizations⽤于Material wigets 的本地化。如果你使⽤WidgetsApp,则⽆需包括后者。注意,这两个代理虽然包括了“默认”值,但如果你想让你的 App 本地化,你仍需要提供⼀或多个代理作为你的 App 本地化副本。
当初始化时,WidgetsApp或MaterialApp会使⽤你指定的代理为你创建⼀个Localizations widget。Localizations widget 可以随时从当前上下⽂中访问设备的地点,或者使⽤ Window.locale。
要访问本地化⽂件,使⽤Localizations.of()⽅法来访问提供代理的特定本地化类。如需翻译,使⽤ intl_translation 包来取出翻译副本到 arb ⽂件中。把它们引⼊ App 中,并⽤ intl 来使⽤它们。
更多 Flutter 中国际化和本地化的细节,请访问 internationalization guide ,⾥⾯有不使⽤ intl 包的⽰例代码。
注意,在 Flutter 1.0 beta 2 之前,在 Flutter 中定义的 assets 不能在原⽣⼀侧被访问。原⽣定义的资源在 Flutter 中也不可⽤,因为它们在独⽴的⽂件夹中。
如何添加Flutter项⽬所需的依赖?
在Android中,你可以在Gradle⽂件来添加依赖项;
在 iOS 中,通常把依赖添加到 Podfile 中;
在RN中,通常是由package.json来管理项⽬依赖;
Flutter 使⽤ Dart 构建系统和 Pub 包管理器来处理依赖。这些⼯具将Android 和 iOS native 包装应⽤程序的构建委派给相应的构建系统。dependencies:
flutter:
sdk: flutter
google_sign_in: ^3.0.3
在Flutter中,虽然在Flutter项⽬中的Android⽂件夹下有Gradle⽂件,但只有在添加平台相关所需的依赖关系时才使⽤这些⽂件。
否则,应该使⽤pubspec.yaml来声明⽤于Flutter的外部依赖项。
iOS也是⼀样,如果你的 Flutter ⼯程中的 iOS ⽂件夹中有 Podfile,请仅在添加iOS平台相关的依赖时使⽤它。否则,应该使
⽤pubspec.yaml来声明⽤于Flutter的外部依赖项。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论