zoukankan      html  css  js  c++  java
  • Dart入门

    要学Flutter必先学Dart,Dart和Java的语法很像,学过Java的人很快就能入手

    Dart下载地址https://dart.dev/get-dart

    VSCode下载地址https://code.visualstudio.com/

    VSCode装好以后,安装插件Chinese汉化插件、Dart插件、code runner插件

    1.基础

    main(){
      print('你好 dart');
    }

    var会自动推断变量类型,赋值类型不一致会报错

    常量用const或final定义,final是懒加载的,编译时不赋值,运行时才赋值

    * 三个单引号或三个双引号允许字符串内部换行,一个单引号和双引号都不行

    void main(){
      String str = '''
        这是第一行
        这是第二行
        这是第三行
      ''';
      print(str);
    }

    * 字符串的拼接

    void main(){
      String str1 = "你好";
      String str2 = 'Dart';
      print(str1+str2);
      print("$str1$str2");
    }

    数值只有int和double两个类型

    * map字典类型

    void main(){
      var person={
        "name":"张三",
        "age":20
      };
      print(person["name"]);
    }

    * 判断变量类型

    void main(){
      var str = '1234';
      if(str is String){
        print('str是String类型');
      }
    }

    * 非空不赋值

    void main(){
      int b;
      //如果b为空,才赋值
      b??=3;
      print(b);  
      b??=6;
      print(b); 
    }
    void main(){
      var a;
      var b=a??10;
      print(b);
    }
    打印10

    * 类型转换

    void main(){
      String str = '111';
      var myNum = int.parse(str);
      print(myNum is int);
    }
    void main(){
      List myList =['香蕉','苹果','西瓜'];
      myList.fillRange(1,2,'梨子');
      print(myList);
    }
    输出[香蕉, 梨子, 西瓜]

    * 数组转字符串

    void main(){
      List myList =['香蕉','苹果','西瓜'];
      var str = myList.join('-');
      print(str);
    }
    输出香蕉-苹果-西瓜

    * 条件判断

    any只要有一个值符合条件就返回true,every必须所有值都符合条件才返回true

    void main(){
      List myList =[1,3,4,6,7,9,10];
      var newList = myList.where((value){
        return value>5;
      });
      print(newList.toList());
    }
    输出[6, 7, 9, 10]
    void main(){
      List myList =[1,3,4,6,7,9,10];
      var newList = myList.any((value){
        return value>5;
      });
      print(newList);
    }
    输出true
    void main(){
      List myList =[1,3,4,6,7,9,10];
      var newList = myList.every((value){
        return value>5;
      });
      print(newList);
    }
    输出false

    * 迭代

    void main(){
      var s=new Set();
      s.addAll([1,22,333]);
      s.forEach((value)=>print(value));
    }
    输出
    1
    22
    333

    * 可选参数,默认参数

    void main(){
      print(printUserInfo("张三"));
    }
    
    String printUserInfo(String username,[String sex='男',int age]){
      if(age!=null){
          return "姓名:$username--年龄:$age--性别:$sex";
      }
      return "姓名:$username--年龄保密--性别:$sex";
    }
    输出 姓名:张三--年龄保密--性别:男

    * 把方法当做参数来传递

    fn1(){
      print('fn1');
    }
    
    fn2(a){
      a();
    }
    
    main(){
      fn2(fn1);
    }
    输出 fn1

    * 箭头函数

    main(){
      List list=['苹果','香蕉','西瓜'];
      list.forEach((value)=>print(value));
      list.forEach((value)=>{
        print(value)
      });
    }

    * 匿名函数

    main(){
      var printNum=(){
        print(123);
      };
      printNum();
    }

    * 自执行方法

      ((n){
        print('我是自执行方法 $n');
      })(12);

    全局变量会常驻内存,污染全局;局部变量不常驻内存,会被垃圾机制回收,不污染全局

    * 闭包能够常驻内存,且不污染全局

    main(){
      fn(){
        var a =123;
        return(){
          a++;
          print(a);
        };
      }
    
      var b = fn();
      b();
      b();
      b();
    }
    
    输出:
    124
    125
    126

    * 命名构造函数

    class Person{
      String name;
      int age;
      //默认构造函数的简写
      Person(this.name,this.age);
      //命令构造函数
      Person.now(){
        print('我是命名构造函数');
      }
      //命令构造函数
      Person.setInfo(String name,int age){
        this.name = name;
        this.age = age;
      }
      void printInfo(){
        print("${this.name}---${this.age}");
      }
    }
    main(){
      Person p1 = new Person('张三',20);
      p1.printInfo();
    
      Person p2 = new Person.setInfo('李四',30);
      p2.printInfo();
    }

    变量前面加下划线_,就申明为私有变量了;方法前面加下划线_,就申明为私有方法了

    * 通过访问属性的方式访问方法

    class Rect{
      num height;
      num width;
      Rect(this.height,this.width);
      get area{
        return this.height*this.width;
      }
      set areaHeight(value){
        this.height = value;
      }
    }
    main(){
      Rect r = new Rect(10, 4);
      r.areaHeight = 6;
      print("面积:${r.area}");
    }

    初始化属性

    class Rect{
      num height;
      num width;
      Rect():height=2,width=10{
    
      }
      get area{
        return this.height*this.width;
      }
      set areaHeight(value){
        this.height = value;
      }
    }
    main(){
      Rect r = new Rect();
      print("面积:${r.area}");
    }

    2.属性

    * 继承

    class Person{
      String name;
      num age;
      Person(this.name,this.age);
      void printInfo(){
        print("${this.name}---${this.age}");
      }
    }
    
    class Student extends Person{
      String sex;
      Student(String name,num age,String sex) : super(name,age){
        this.sex = sex;
      }
      @override
      void printInfo(){
        print("${this.name}---${this.age}---${this.sex}");
        //调用父类的方法
        super.printInfo();
      }
    }
    
    main(){
      var p;
      //当p为null时不会执行
      p?.printInfo();
      p = new Person('张三', 20);
      //强制转换类型
      (p as Person).printInfo();
      //连缀操作
      p..name="李四"
      ..age=30
      ..printInfo();
      //子类继承及复写
      Student s = new Student('王五', 10,'男');
      s.printInfo();
    }

    dart没有interface关键字,可以用abstract关键字

    * mixins相当于多继承

    class A{
      void printA(){
        print("A");
      }
    }
    
    class B{
      void printB(){
        print("B");
      }
    }
    
    class C with A,B{
    
    }
    
    void main(){
      var c = new C();
      c.printA();
      c.printB();
    }

    作为mixins的类不能有构造函数,不能继承其他类,而且如果with顺序不同,相同方法会覆盖

    3.调库

    * 调用内置库

    import 'dart:convert';
    import 'dart:io';
    import 'dart:math';
    
    void main() async{
      print(min(12, 14));
      var result = await getDataFromZhihuAPI();
      print(result);
    }
    
    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();
    }

    调用asyc必须要用await

    * 第三方库的地址是https://pub.dev

    配置文件pubspec.yaml

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

    cmd命令行执行pub get下载库

    例子

    import 'dart:convert' as convert;//重命名
    import 'package:http/http.dart' as http;//重命名
    
    main(List<String> arguments) async {
      // This example uses the Google Books API to search for books about http.
      // https://developers.google.com/books/docs/overview
      var url = "https://www.googleapis.com/books/v1/volumes?q={http}";
    
      // 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);
        var itemCount = jsonResponse['totalItems'];
        print("Number of books about http: $itemCount.");
      } else {
        print("Request failed with status: ${response.statusCode}.");
      }
    }

    导库使用as重命名可以解决冲突的问题,导库后使用show或hide可以限制部分引入

    欢迎关注我的微信公众号:安卓圈

  • 相关阅读:
    2020-10-24;我对机器学习实现的理解
    2020软件工程作业03
    友链
    导航页
    POJ3694 Network (板子题)
    洛谷 P1084 [NOIP2012 提高组] 疫情控制
    AcWing 355. 异象石
    洛谷P4556 雨天的尾巴
    POJ1639 Picnic Planning (K度限制最小生成树)
    POJ2728 Desert King
  • 原文地址:https://www.cnblogs.com/anni-qianqian/p/12048430.html
Copyright © 2011-2022 走看看