Dart 语言入门

2020-02-01  本文已影响0人  张_何

Dart 介绍

Dart 语言特性

借助于先进的工具链和编译器,Dart 是少数同时支持 JIT和 AOT的语言之一。

内存分配与垃圾回收
单线程模型
环境搭建
注释
// var str='this is var';  双斜杠注释
/// String str='this is var'; 三斜杠注释

//块注释
/*
  var str='this is var';
  String str='this is var';
*/
入口函数
main() {
}
// 或者
void main() {
}

变量和常量

变量
常量
命名规则

数据类型

字符串
String str1 = "string1";
String str2 = 'string2';
String str3 = '''
  duo
  hang
  string
  ''';
数值类型
bool类型
List(数组)
Maps(字典)

Set

var s=new Set();
  s.add('香蕉');
  s.add('苹果');
  s.add('苹果');
  print(s);   //{香蕉, 苹果}
判断数据类型
  var list = ['0','11','222'];
  if (list is String) {
    print("list is string");
  } else if (list is int) {
    print("list is int");
  } else if (list is List) {
    print("list is list");
  }

运算符

赋值运算符
数值类型与String之间的转换
      String price='';
      try{
        var myNum=double.parse(price);
        print(myNum);
      }catch(err){
           print(0);
      } 

函数

返回类型  方法名称(参数1,参数2,...){
     方法体
     return 返回值;
}
  void xxx(){
      aaa(){
          print(getList());
          print('aaa');
      }
      aaa();
  }
    String printUserInfo(String username,[String home = "中国",int age]){  //行参
      if(age!=null){
        return "姓名:$username---家乡:$home---年龄:$age";
      }
      return "姓名:$username---家乡:$home---年龄保密";
    }
    print(printUserInfo('张三',21,'上海')); 
    print(printUserInfo('张三'));
  String printUserInfo(String username,{int age,String sex='男'}){  //行参
      if(age!=null){
        return "姓名:$username---性别:$sex--年龄:$age";
      }
      return "姓名:$username---性别:$sex--年龄保密";
  }
  print(printUserInfo('张三',age:20,sex:'未知'));
  var fn=(){
    print('我是一个匿名方法');
  };      
  fn();
  //方法
  fn1(){
    print('fn1');
  }
  //方法
  fn2(fn){
    fn();
  }
  //调用fn2这个方法 把fn1这个方法当做参数传入
  fn2(fn1);
    ((int n){
      print(n);
      print('我是自执行方法');
    })(12);
    fn(){
        var a=123;  /*不会污染全局   常驻内存*/
        return(){           
          a++;          
          print(a);
        };       
      }     
      var b=fn();   
      b(); //124
      b(); //125

构造函数
默认构造函数
命名构造函数
Dart中的私有属性和方法
getter 和 setter
class Rect{
  num height;
  num width; 
  //Rect(this.height,this.width);
  Rect():height=2,width=10{//在构造函数体运行之前初始化实例变量
    
  }
  get area{
    return this.height*this.width;
  }
  set areaHeight(value){
    this.height=value;
  }
}

静态成员和静态方法

class Person {
  static String name = '张三';
  int age=20;
  static void show() {
    print(name);
  }
  void printInfo(){  /*非静态方法可以访问静态成员以及非静态成员*/
      print(name);  //访问静态属性
      print(this.age);  //访问非静态属性
      show();   //调用静态方法
  }
  static void printUserInfo(){//静态方法
        print(name);   //静态属性
        show();        //静态方法
        // print(this.age);     //静态方法没法访问非静态的属性 报错
        // this.printInfo();   //静态方法没法访问非静态的方法 报错
        // printInfo();        //静态方法没发访问非静态的方法  报错
        Person p = Person();
        p.printInfo();
  }
}

Dart 中的对象操作符

    var p;
    p='';
    p=new Person();
    (p as Person).printInfo(); //如果p不是Person类型则报错
  Person p=new Person('张三', 20);
    if(p is Person){
        p.name="李四";
    }
   Person p1=new Person('张三1', 20);
   p1.printInfo();
   p1..name="李四"
     ..age=30
     ..printInfo(); //等同于下面三句
  //  p1.name='张三222';
  //  p1.age=40;
  //  p1.printInfo();

Dart 中的继承

class Person {
  String name;
  num age; 
  Person(this.name,this.age);
  void printInfo() {
    print("${this.name}---${this.age}");  
  }
}
class Web extends Person{
  Web(String name, num age) : super(name, age){ //子类实现自己的构造方法,同时调用父类的构造方法
  }
}

Dart中的抽象类

extends抽象类 和 implements的区别:
abstract class Animal{
  eat();   //抽象方法
  run();  //抽象方法  
  printInfo(){
    print('我是一个抽象类里面的普通方法');
  }
}
class Dog extends Animal{
  @override
  eat() {
     print('小狗在吃骨头');
  }
  @override
  run() {
    print('小狗在跑');
  }  
}
class Cat extends Animal{
  @override
  eat() {
    print('小猫在吃老鼠');
  }
  @override
  run() {
    print('小猫在跑');
  }
}
Dart 中的多态
Dart中的接口

Dart 中的接口

abstract class A{
  String name;
  printA();
}
abstract class B{
  printB();
}
class C implements A,B{  
  @override
  String name;  
  @override
  printA() {
    print('printA');
  }
  @override
  printB() {
    return null;
  }
}
Dart 中的混入
class Person{
  String name;
  num age;
  Person(this.name,this.age);
  printInfo(){print('${this.name}----${this.age}');}
  void run(){print("Person Run");}
}
class A {
  String info="this is A";
  void printA(){ print("A");}
  void run(){print("run")}
}
class B {  
  void printB(){print("B");}
  void run(){print("B Run");}
}
class C extends Person with B,A{
  C(String name, num age) : super(name, age);
  
}

class A {
  String info="this is A";
  void printA(){
    print("A");
  }
}
class B {
  void printB(){
    print("B");
  }
}
class C with A,B{
  
}
void main(){  
  var c=new C();   
  print(c is C);    //true
  print(c is A);    //true
  print(c is B);   //true
}

泛型

T getData<T>(T value){
      return value;
 }

自定义库
系统内置库
三方库

1、从下面网址找到要用的库

https://pub.dev/packages
https://pub.flutter-io.cn/packages
https://pub.dartlang.org/flutter/

2、需要在自己想项目根目录新建一个pubspec.yaml
3、在pubspec.yaml文件 然后配置名称 、描述、依赖等信息,内容如下

name: xxx
description: A new flutter module project.
dependencies:
http: ^0.12.0+2
date_format: ^1.0.6

4、然后运行 pub get 获取包下载到本地
5、看文档引入库使用

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

Dart库中的冲突解决

import 'lib/Person1.dart';
import 'lib/Person2.dart' as lib; // 这里使用as关键字指定Person2.dart库的前缀为lib

main(List<String> args) {
  Person p1=new Person('张三', 20); // 这里调用的是Person1.dart库中的Person
  p1.printInfo();
  lib.Person p2=new lib.Person('李四', 20);// 这里通过lib前缀调用的是Person2.dart中的Person
  p2.printInfo();
}
部分导入
只导入需要的部分
隐藏不需要导入的部分
延迟加载
    greet() async {
      await hello.loadLibrary();
      hello.printGreeting();
    }
Flutter 包管理
1、pub仓库下载的包
dependencies:
     english_words: ^3.1.3
2、 本地包
dependencies:
    pkg1:
        path: ../../code/pkg1      // 本地包路径
3、使用git 方式引入第三方库
dependencies:
  carousel_pro:
    git:
      url: git://github.com/jlouage/flutter-carousel-pro.git      // url 提供仓库的地址
      ref: master     // ref参数将依赖关系固定到特定git commit,branch或tag
      path: path/subPath      // Pub假定包位于Git存储库的根目录中,如果不是这种情况,您可以使用path参数指定位置
上一篇 下一篇

猜你喜欢

热点阅读