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可以限制部分引入

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

本文分享自微信公众号 - 安卓圈(gh_df75572d44e4),作者:King磊

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SpringAOP

    动态代理分两种 JDK动态代理:只能对实现了接口的类产生代理 Cglib动态代理:第三方代理技术,对没有实现接口的类产生代理对象,生成子类对象,可以动态添加类的...

    用户3112896
  • Struts2访问Servlet

    servlet是单例的,Action是多例的,一次请求,创建一个Action的实例

    用户3112896
  • SpringBoot集成MyBatis

    各位应该都了解SSH和SSM工程搭建时候需要各种配置代码,还要Tomcat配置,非常麻烦

    用户3112896
  • es6(三):es6中函数的扩展(参数默认值、rest参数、箭头函数)

    1.函数可以设置参数默认值 1 function test1(x,y=1){ 2 console.log(x,y) 3 } 4 te...

    用户1149564
  • 06JavaScript作用域与对象

    即使我们在定义这个函数之前调用它,函数仍然可以工作。这是因为在 JavaScript 中执行上下文的工作方式造成的。

    Dreamy.TZK
  • [第13期] 掌握前端面试基础系列一: ES6

    这里我们可以看到, 第一行中的a虽然还没声明, 但是我们用起来却不会报错。这种情况, 就是变量声明的提升。

    用户6900878
  • ES6 学习笔记之函数的拓展

    本文记录了一些 ES6 函数相关的改动,比较重要的就是箭头函数及箭头函数内部 this 的变化,其他一些不常见的概念我也仅仅是看了看,并没有实际操作测试效果。待...

    我与梦想有个约会
  • JS面向对象笔记二

    注意点:当构造函数里面有return关键字时,如果返回的是非对象,new命令会忽略返回的信息,最后返回时构造之后的this对象;   如果return返回的是与...

    tandaxia
  • 【面试】386- JavaScript 面试 20 个核心考点

    Javascript是前端面试的重点,本文重点梳理下 Javascript 中的常考基础知识点,然后就一些容易出现的题目进行解析。限于文章的篇幅,无法将知识点讲...

    pingan8787
  • 横扫 JS 面试核心考点

    Javascript是前端面试的重点,本文重点梳理下Javascript中的常考知识点,然后就一些容易出现的题目进行解析。限于文章的篇幅,无法将知识点讲解的面面...

    grain先森

扫码关注云+社区

领取腾讯云代金券