天天看點

Dart基礎第14篇: 庫 自定義庫、系統庫、第三方庫

文章目錄

    • 一丶 庫
    • 二丶 導入自己本地庫
    • 三丶 導入系統内置庫 math庫
    • 四丶 導入系統内置庫實作請求資料httpClient
    • 五丶 關于 Async Await
    • 六丶 導入Pub包管理系統中的庫
    • 七丶 庫的重命名 Dart沖突解決
    • 八丶 部分導入
    • 九丶 延遲加載

前面介紹Dart基礎知識的時候基本上都是在一個檔案裡面編寫Dart代碼的,但實際開發中不可能這麼寫,子產品化很重要,是以這就需要使用到庫的概念。

在Dart中,庫的使用時通過import關鍵字引入的。

library指令可以建立一個庫,每個Dart檔案都是一個庫,即使沒有使用library指令來指定。

Dart中的庫主要有三種:

1、我們自定義的庫

import ‘lib/xxx.dart’;

2、系統内置庫

import ‘dart:math’;

import ‘dart:io’;

import ‘dart:convert’;

3、Pub包管理系統中的庫

https://pub.dev/packages

https://pub.flutter-io.cn/packages

https://pub.dartlang.org/flutter/

1、需要在自己想項目根目錄建立一個pubspec.yaml

2、在pubspec.yaml檔案 然後配置名稱 、描述、依賴等資訊

3、然後運作 pub get 擷取包下載下傳到本地

4、項目中引入庫 import ‘package:http/http.dart’ as http; 看文檔使用

Animal.dart

class Animal{
  String _name;   //私有屬性
  int age; 
  //預設構造函數的簡寫
  Animal(this._name,this.age);

  void printInfo(){   
    print("${this._name}----${this.age}");
  }

  String getName(){ 
    return this._name;
  } 
  void _run(){
    print('這是一個私有方法');
  }

  execRun(){
    this._run();  //類裡面方法的互相調用
  }
}
           
import 'lib/Animal.dart';
main(){
  var a=new Animal('小黑狗', 20);
  print(a.getName());
}
           

// import 'dart:io';
import "dart:math";
main(){
    print(min(12,23));
    print(max(12,25));
}
           

import 'dart:io';
import 'dart:convert';

void main() async{
  var result = await getDataFromZhihuAPI();
  print(result);
}

//api接口: http://news-at.zhihu.com/api/3/stories/latest
getDataFromZhihuAPI() async{
  //1、建立HttpClient對象
  var httpClient = new HttpClient();  
  //2、建立Uri對象
  var uri = new Uri.http('news-at.zhihu.com','/api/3/stories/latest');
  //3、發起請求,等待請求
  var request = await httpClient.getUrl(uri);
  //4、關閉請求,等待響應
  var response = await request.close();
  //5、解碼響應的内容
  return await response.transform(utf8.decoder).join();
}
           

async和await

這兩個關鍵字的使用隻需要記住兩點:

隻有async方法才能使用await關鍵字調用方法

如果調用别的async方法必須使用await關鍵字

async是讓方法變成異步。

await是等待異步方法執行完成。

void main() async{
  var result = await testAsync();
  print(result);
}
//異步方法
testAsync() async{
  return 'Hello async';
}
           

pub包管理系統:

1、從下面網址找到要用的庫

2、建立一個pubspec.yaml檔案,内容如下

name: xxx

description: A new flutter module project.

dependencies:

http: ^0.12.0+2

date_format: ^1.0.6

3、配置dependencies

4、運作pub get 擷取遠端庫

5、看文檔引入庫使用

import 'dart:convert' as convert;
import 'package:http/http.dart' as http;
import 'package:date_format/date_format.dart';

main() async {
  // var url = "http://www.phonegap100.com/appapi.php?a=getPortalList&catid=20&page=1";

  //   // Await the http get response, then decode the json-formatted responce.
  //   var response = await http.get(url);
  //   if (response.statusCode == 200) {
  //     var jsonResponse = convert.jsonDecode(response.body);
     
  //     print(jsonResponse);
  //   } else {
  //     print("Request failed with status: ${response.statusCode}.");
  //   }
  
    print(formatDate(DateTime(1989, 2, 21), [yyyy, '*', mm, '*', dd]));
}
           

Person1.dart

class Person{
  String name;
  int age; 
  //預設構造函數的簡寫
  Person(this.name,this.age);  

  Person.setInfo(String name,int age){
    this.name=name;
    this.age=age;
  }

  void printInfo(){   
    print("Person1:${this.name}----${this.age}");
  }
}
           

Person2.dart

class Person{
  String name;
  int age; 
  //預設構造函數的簡寫
  Person(this.name,this.age);  

  Person.setInfo(String name,int age){
    this.name=name;
    this.age=age;
  }

  void printInfo(){   
    print("Person2:${this.name}----${this.age}");
  }
}
           
import 'lib/Person1.dart';
import 'lib/Person2.dart' as lib;

main(List<String> args) {
  Person p1=new Person('張三', 20);
  p1.printInfo();
  lib.Person p2=new lib.Person('李四', 20);
  p2.printInfo();
}
           

myMath.dart

void getName(){
  print('張三');
}
void getAge(){
  print(20);
}
void getSex(){
  print('男');
}
           
import 'lib/myMath.dart' hide getName;

void main(){
//  getName();
  getAge();
}
           

也稱為懶加載,可以在需要的時候再進行加載。
懶加載的最大好處是可以減少APP的啟動時間。

懶加載使用deferred as關鍵字來指定,如下例子所示:

import 'package:deferred/hello.dart' deferred as hello;

當需要使用的時候,需要使用loadLibrary()方法來加載:

greet() async {
  await hello.loadLibrary();
  hello.printGreeting();
}