工程结构,本地化,依赖和资源
工程结构,本地化,依赖和资源
如何在 Flutter 中引入图片资源?如何处理多分辨率?
在 iOS 里,图片和其他资源会被视为不同的资源分别处理,而在 Flutter 中只有资源这一个概念。iOS 里被放置在 Images.xcasset 文件夹的资源在Flutter 中都被放置到了 assets 文件夹中。和 iOS 一样,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则表达了物理分辨率到逻辑分辨率的对照比例。
Assets 可以放在任何属性的文件夹中—Flutter 没有任何预置的文件结构。你需要在 pubspec.yaml 中声明 assets (包括路径),然后 Flutter 将会识别它们。
例如,要添加一个名为 my_icon.png 的图片到你的 Flutter 工程中,你可以把它存储在 images 文件夹下。把基础的图片(一倍图)放到 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 进行使用:
@overrideWidget build(BuildContext context) { return Image.asset("images/my_image.png");}
关于更多的细节,请参见文档 在 Flutter 中添加资源和图片。
字符串存储在哪里?如何处理本地化?
iOS 里有 Localizable.strings 文件,而 Flutter 则不同,目前并没有关于字符串的处理系统。目前,最佳的方案就是在静态区声明你的文本,然后进行访问。例如:
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"
To use the flutter_localizations package,specify the localizationsDelegates and supportedLocales on the app widget:
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 指定了应用支持的语言,而这些 delegates 则包含了实际的本地化内容。上面的示例使用了一个 MaterialApp,所以它既使用了处理基础 widget 本地化的 GlobalWidgetsLocalizations,也使用了处理 Material widget 本地化的 MaterialWidgetsLocalizations。如果你在应用中使用的是 WidgetApp,就不需要后者了。注意,这两个 delegates 虽然都包含了“默认”值,但是如果你想要实现本地化,就必须在本地提供一个或多个 delegates 的实现副本。
当初始化的时候,WidgetsApp(或 MaterialApp)会根据你提供的 delegates 创建一个 Localizations widget。Localizations widget 可以随时从当前上下文中中获取设备所用的语言,也可以使用 Window.locale。
要使用本地化资源,使用 Localizations.of() 方法可以访问提供代理的特定本地化类。使用 intl_translation 库解压翻译的副本到 arb 文件,然后在应用中通过 intl 来引用它们。
关于 Flutter 中国际化和本地化的细节内容,请参看Flutter 应用里的国际化,里面包含有使用和不使用 intl 库的示例代码。
注意在 Flutter 1.0 beta 2 之前,在 Flutter 里定义的资源是不能被原生代码访问的,反之亦然,而原生的资源也是不能在 Flutter 中使用,因为它们都被放在了独立的文件夹中。
CocoaPods 相当于 Flutter 中的什么?如何添加依赖?
在 iOS 里,可以通过 Podfile 添加依赖。而 Flutter 使用 Dart 构建系统和 Pub 包管理器来处理依赖。这些工具将原生应用的打包任务分发给相应 Android 或 iOS 构建系统。
如果你的 Flutter 项目 iOS 文件夹中存在 Podfile,那么请仅在里面添加原生平台的依赖。总而言之,在 Flutter 中使用 pubspec.yaml 来声明外部依赖。你可以通过 pub.dev来查找一些优秀的 Flutter 第三方包。
