包管理
依赖本地包
dependencies:
pkg1:
path: ../../code/pkg1
依赖git包
dependencies: pkg1: git: url: git://github.com/xxx/pkg1.git
资源管理
指定Assets
flutter: assets: - assets/my_icon.png - assets/background.png
Asset 变体
在选择匹配设备分辨率图片时,会使用Asset变体
加载 Assets
通过AssetBundle 对象访问asset
加载文本assets
1、通过直接使用package:flutter/services.dart 中的静态对象rootBundle
2、建议使用 DefaultAssetBundle 来获取当前BuildContext的AssetBundle。 这种方法不是使用应用程序构建的默认asset bundle,而是使父级widget在运行时动态替换的不同的AssetBundle,这对于本地化或测试场景很有用.
import 'dart:async' show Future;import 'package:flutter/services.dart' show rootBundle; Future<String> loadAsset() async { return await rootBundle.loadString('assets/config.json');}
加载图片
声明分辨率图片assets
../image.png
../Mx/image.png
../Nx/image.png
..etc
主资源默认1.0 倍分辨率图片
../my_icon.png
../2.0x/my_icon.png
../3.0x/my_icon.png
使用AssetImage类
Widget build(BuildContext context) { return new DecoratedBox( decoration: new BoxDecoration( image: new DecorationImage( image: new AssetImage('graphics/background.png'), ), ), );}
Image.asset() 直接返回一个图片widget
Widget build(BuildContext context){ return Image.asset('graphics/background.png') }
使用依赖包中的资源图片
依赖包my_icons, 目录结构
-
…/icons/heart.png
-
…/icons/1.5x/heart.png
-
…/icons/2.0x/heart.png
new AssetImage('icons/heart.png", package:'my_icons')
或
new Image.asset('icons/heart.png', package: 'my_icons')
打包 assets 资源
需要在 pubspec.yaml 文件中声明 期望的资源,它将会被打包到相应的package中。
例如,一个名为“fancy_backgrounds”的包,可能包含以下文件:
-
…/lib/backgrounds/background1.png
-
…/lib/backgrounds/background2.png
-
…/lib/backgrounds/background3.png
flutter:
assets:
- packages/fancy_backgrounds/backgrounds/background1.png
Dart 单线程模式,
Java OC 多线程,因为任意线程触发异常没有捕获,会终止进程退出程序
异常捕获
try/catch/finally 来捕获代码异常
异常捕获和上报代码
void collectLog(String line){ ... //收集日志}void reportErrorAndLog(FlutterErrorDetails details){ ... //上报错误和日志逻辑} FlutterErrorDetails makeDetails(Object obj, StackTrace stack){ ...// 构建错误信息} void main() { FlutterError.onError = (FlutterErrorDetails details) { reportErrorAndLog(details); }; runZoned( () => runApp(MyApp()), zoneSpecification: ZoneSpecification( print: (Zone self, ZoneDelegate parent, Zone zone, String line) { collectLog(line); // 收集日志 }, ), onError: (Object obj, StackTrace stack) { var details = makeDetails(obj, stack); reportErrorAndLog(details); }, );}
使用字体
在asset 中声明
将字体文件打包到应用中,在pubspec.yaml 中声明,然后将字体复制到指定的位置。如
flutter: fonts: - family: Raleway fonts: - asset: assets/fonts/Raleway-Regular.ttf - asset: assets/fonts/Raleway-Medium.ttf weight: 500 - asset: assets/fonts/Raleway-SemiBold.ttf weight: 600 - family: AbrilFatface fonts: - asset: assets/fonts/abrilfatface/AbrilFatface-Regular.ttf
使用字体
// 声明文本样式const textStyle = const TextStyle( fontFamily: 'Raleway',); // 使用文本样式var buttonText = const Text( "Use the font for this text", style: textStyle,);
Package 中的字体
要使用Package中定义的字体,需要加上package 参数
const textStyle = const TextStyle( fontFamily: 'Raleway', package: 'my_package', //指定包名);
如果在package包内部使用它自己定义的字体,也应该在创建文本样式时指定package参数,如上例所示。
一个包也可以只提供字体文件而不需要在pubspec.yaml中声明。 这些文件应该存放在包的lib/文件夹中。字体文件不会自动绑定到应用程序中,应用程序可以在声明字体时有选择地使用这些字体。假设一个名为my_package的包中有一个字体文件:
lib/fonts/Raleway-Medium.ttf
然后,应用程序可以声明一个字体,如下面的示例所示:
flutter: fonts: - family: Raleway fonts: - asset: assets/fonts/Raleway-Regular.ttf - asset: packages/my_package/fonts/Raleway-Medium.ttf weight: 500
lib/是隐含的,所以它不应该包含在asset路径中。
在这种情况下,由于应用程序本地定义了字体,所以在创建TextStyle时可以不指定package参数:
const textStyle = const TextStyle( fontFamily: 'Raleway',);