项目结构与资源

项目结构与资源

如何储存我的图片文件?

Xamarin.Forms 没有独立于平台的存储图像的方法,您必须放置图片在 iOS 的 xcasset 文件夹,或 Android 的 drawable 文件夹中。

Android和iOS将资源(resources)和资产(assets)视为不同的项目,而 Flutter 应用程序只有资产(assets)。Resources/drawable-* 文件夹中的所有资源都放在一个 Flutter 的资产文件夹中。

Flutter 遵循一种与 iOS 类似的简单的基于密度(density-based)的格式。资产可能是 1.0x、2.0x、3.0x 或任何其他倍数。Flutter 没有 dp,但是有逻辑像素,这基本上是与设备无关像素相同。用所谓 devicePixelRatio 表示单个逻辑像素中物理像素的比例。

与 Android 的密度桶相等的是:

Android density qualifier Flutter pixel ratio
ldpi 0.75x
mdpi 1.0x
hdpi 1.5x
xhdpi 2.0x
xxhdpi 3.0x
xxxhdpi 4.0x

资产位于任意文件夹中— Flutter 没有预定义的文件夹结构。在 pubspec.yaml 文件中声明资产(带有位置),Flutter 就会得到它们。

注意,在 Flutter 1.0 beta 2 之前的版本中,Flutter 中定义的资产并不能从原生一侧访问,反之亦然,原生资产和资源对 Flutter 无效,就像他们被放在单独的文件夹中。

在 Flutter beta 2 版本中,资产都被存储在原生的资产文件夹中,并且可以通过 Android 的资产管理器(AssetManager) 从原生一侧被访问。

在 Flutter beta 2 版本中,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.jpeg

之后就可以用 AssetImage 来访问你的图像了:

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

或者可以直接在一个 Image widget 中访问:

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

更多详尽的信息可以在 在 Flutter 中添加资产和图像 中找到。

在哪里存储字符串?如何处理本地化?

与 .NET 拥有 resx 文件不同,Flutter 目前没有一个专门的字符串类资源系统。此时,最佳实践是将复制文本作为静态字段保存在类中,并从那里访问它们。举个例子:

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

那么在你的代码中,你可以像这样访问你的字符串:

new Text(Strings.welcomeMessage)

默认情况下,Flutter 的字符串只支持美式英语。如果你需要添加其他语音的支持,可以包含 flutter_localizations 包。你可能还需要添加 Dart的 intl包来使用 i10n 装置,例如日期、时间的格式化。

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

使用 flutter_localizations 包时,要在应用程序的 widget 上指定 localizationsDelegates 和 supportedLocales:

import 'package:flutter_localizations/flutter_localizations.dart';

new 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 定义了应用程序支持哪些本地化。上面的示例使用了一个 MaterialApp,因此它为基本 widget 本地化值提供了一个 GlobalWidgetsLocalizations,为Material widget 的本地化提供了一个 MaterialWidgetsLocalizations。如果你的应用程序使用 WidgetsApp ,你就不需要后者了。请注意,这两个委托包含“默认”值,但是如果您希望它们也本地化,则需要为您自己的应用程序的可本地化副本提供一个或多个委托。

初始化后, WidgetsApp (或 MaterialApp)为您创建一个Localizationswidget,其中包含您指定的委托。设备的当前区域设置总是可以从当前上下文的 Localizations widget (以 Locale 对象的形式)或使用 Window.locale 访问。

要访问本地化的资源,请使用 Localizations.of() 方法去访问一个由给定委托提供的特定本地化类。使用 intl_translation 包将可翻译的文本拷贝到 arb 文件中进行翻译,并将其导入到应用程序中与 intl 一起使用。

要了解更多关于 Flutter 国际化和本地化的细节,请查阅 国际化指南,它有带和不带 intl 包的示例代码。

我的项目文件在哪里?

Xamarin.Forms 中有一个 csproj 文件。在 Flutter 中最接近的它的是 pubspec.yaml,其中包含包依赖项和各种项目细节。就像 .NET Standard,相同目录中的文件被认为是项目的一部分。

Nuget 的等价物是什么?如何添加依赖项?

在 .NET 生态系统中,原生 Xamarin 项目和 Xamarin.Forms 项目都可以访问 Nuget 和内置的包管理系统。Flutter 应用程序包含一个原生Android 应用程序,原生 iOS 应用程序和 Flutter 应用程序。

在Android中,您可以通过向Gradle添加构建脚本来添加依赖项。而在iOS中,你可以通过添加到 Podfile 来添加依赖项。

Flutter 使用 Dart 自己的构建系统和 Pub 包管理器。这些工具将原生 Android 和 iOS 封装应用程序的构建委托给各自的构建系统。

一般来说,使用 pubspec.yaml 来声明要在 Flutter 中使用的外部依赖项。Pub 是一个寻找 Flutter 包的好地方。