flutter - 05 项目结构、资源、依赖和本地化

项目结构、资源、依赖和本地化

  • 项目文件结构是怎样子的?
  • 在哪里归档图片资源以及如何处理不同分辨率?
  • 如何归档strings资源,以及如何处理不同语言?
  • 如何添加Flutter项目所需的依赖?

项目文件结构是怎样子的?

一个Flutter项目的通常文件结构是这样子的:

project name

  • android - Android部分的工程文件
  • build - 项目的构建输出目录
  • ios - iOS部分的工程文件
  • lib - 项目中的Dart源文件
    • src - 包含其他源文件
    • main.dart - 自动生成的项目入口文件
  • test - 测试相关文件
  • pubspec.yaml - 项目依赖配置文件类

在哪里归档图片资源以及如何处理不同分辨率?

  • 虽然Android将resources和assets区别对待, 但在Flutter中它们都会被作为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

然后在代码中我们可以通过Asset Bundle来访问它:

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或是其他的任何倍数。这个device Pixel Ratio表示了物理像素到单个逻辑像素的比率。

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

接下来就可以在pub spec.yaml文件中这样声明这个图片资源:

assets:
	- images/my_icon.png

现在, 我们就可以借助Assetlmage来访问它了。

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

也可通过Imagewidget直接使用:

@override
Widget build(Build Context 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包。你可能也要引入inti包来支持其他的`i10n机制, 比如日期/时间格式化。

默认情况下, Flutter只支持美式英语字符串。如果你要支持其他语言, 请引入flutter_localizations包。你可能也要引

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

要使用flutter_localizations包, 还需要在app widget中指定localizations DelegatessupportedLocales

这些代理包括实际的本地化值, 并且supportedLocales定义了App支持哪些地区。上面的例子使用了一个Material App, 所以它既有GlobalWidgetsLocalizations用于基础widgets, 也有 MaterialWidgetsLocalizations用于Material wigets的本地化。如果你使用WidgetsApp, 则无需包括后者。注意, 这两个代理虽然包括了默认值, 但如果你想让你的App本地化, 你仍需要提供一或多个代理作为你的App本地化副本。

当初始化时,Widgets AppMaterial App会使用你指定的代理为你创建一个Localizations wigetsLocalizations widget可以随时从当前上下文中访问设备的地点, 或者使用Window.locale。

要访问本地化文件, 使用Localizations.of()方法来访问提供代理的特定本地化类。如需翻译, 使用intl_translation包来取出翻译副本到arb文件中。把它们引入App中, 并用intl来使用它们。

更多Flutter中国际化和本地化的细节, 请访问internationalization guide, 里面有不使用intl包的示例代码

注意, 在Flutter 1.0beta 2之前, 在Flutter中定义的assets不能在原生一侧被访问。原生定义的在Flutter中也不可用, 因为它们在独立的文件夹中。

如何添加Flutter项目所需的依赖?

  • 在Android中, 你可以在Gradle文件来添加依赖项;
  • 在iOS中, 通常把依赖添加到Podfile中;

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平台相关的依赖时使用它。否则, 应该使用pub spec.yaml来声明用于Flutter的外部依赖项。

你可能感兴趣的:(Flutter,flutter)