Flutter學習一

包管理
依賴本地包
dependencies:
pkg1:
path: ../../code/pkg1

依賴git包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
一、經過直接使用package:flutter/services.dart 中的靜態對象rootBundle
二、建議使用 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')

github

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

使用字體json

// 聲明文本樣式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',);
相關文章
相關標籤/搜索