Flutter学习(三)Dart语法汇总

2020-03-26  本文已影响0人  yanhooIT

内部团队学习,以简单直接为主

Dart差异化语法说明

学习工具配置

在VSCode中添加dart文件

入口main函数

main(List<String> args) {
  // dart打印用print函数
  print('Hello Dart');
}

定义变量

明确声明(Explicit)

  String name = "yanhoo";

  // 可以随时被修改
  name = "yety";

  // 不允许赋值其他类型
  // name = 19;

类型推导(Type Inference)

main(List<String> args) {
  // 这样就可以赋值给const修饰的变量
  const p1 = Person("yanhoo");
  const p2 = Person("yanhoo");
  const p3 = Person("yety");

  print(identical(p1, p2));// true
  print(identical(p2, p3));// false
}

class Person {
  // 常量构造函数中的成员变量必须使用final修饰
  final String name;
  // 常量构造函数
  const Person(this.name);
}

数据类型

// 1、Dart字符串是UTF-16编码单元的序列。您可以使用单引号或双引号创建一个字符串
var s1 = 'Hello World';
var s2 = "Hello Dart";
var s3 = 'Hello\'Fullter';
var s4 = "Hello'Fullter";

// 2、可以使用三个单引号或者双引号表示多行字符串
var message1 = '''
哈哈哈
呵呵呵
嘿嘿嘿''';
// ----------------- List定义 -----------------
// 1.使用类型推导定义
var letters = ['a', 'b', 'c', 'd'];
print('$letters ${letters.runtimeType}');

// 2.明确指定类型
List<int> numbers = [1, 2, 3, 4];
print('$numbers ${numbers.runtimeType}');

// Set和List最大的两个不同就是:Set是无序的,并且元素是不重复的

// ----------------- Set定义 -----------------
// 1.使用类型推导定义
var lettersSet = {'a', 'b', 'c', 'd'};
print('$lettersSet ${lettersSet.runtimeType}');

// 2.明确指定类型
Set<int> numbersSet = {1, 2, 3, 4};
print('$numbersSet ${numbersSet.runtimeType}');

// ----------------- Map定义 -----------------
// 1.使用类型推导定义
var infoMap1 = {'name': 'xxx', 'age': 18};
print('$infoMap1 ${infoMap1.runtimeType}');

// 2.明确指定类型
Map<String, Object> infoMap2 = {'height': 1.88, 'address': '北京市'};
print('$infoMap2 ${infoMap2.runtimeType}');
// ----------------- List 和 Set的操作 -----------------
// 获取集合的长度
print(lettersList.length);
print(lettersSet.length);
print(infoMap.length);

// 添加/删除/包含元素
numbersList.add(5);
numbersSet.add(5);
print('$numbersList $numbersSet');

numbersList.remove(1);
numbersSet.remove(1);
print('$numbersList $numbersSet');

print(numbersList.contains(2));
print(numbersSet.contains(2));

// List由于是有序的,所以可以根据index删除元素
numbersList.removeAt(3);
print('$numbersList');

// ----------------- Map的操作 -----------------
// 1.根据key获取value
print(infoMap1['name']);

// 2.获取所有的entries
print('${infoMap1.entries} ${infoMap1.entries.runtimeType}'); // (MapEntry(name: xxx), MapEntry(age: 18)) MappedIterable<String, MapEntry<String, Object>>

// 3.获取所有的keys
print('${infoMap1.keys} ${infoMap1.keys.runtimeType}'); // (name, age) _CompactIterable<String>

// 4.获取所有的values
print('${infoMap1.values} ${infoMap1.values.runtimeType}'); // (xxx, 18) _CompactIterable<Object>

// 5.判断是否包含某个key或者value
print('${infoMap1.containsKey('age')} ${infoMap1.containsValue(18)}'); // true true

// 6.根据key删除元素
infoMap1.remove('age');
print('${infoMap1}'); // {name: xxx}

函数

概述

函数的定义

返回值 函数的名称(参数列表) {
  // coding...
  return 返回值;
}

// 示例
int sum(int num1, int num2) {
  return num1 + num2;
}

// 也可以这么写(不推荐)
sum(num1, num2) {
  return num1 + num2;
}

// 如果函数体只有一句,可以使用箭头函数
// 箭头函数不允许以分号结尾,上面的可以这样写
sum(int num1, int num2) => num1 + num2

函数的参数

int sum(int num1, int num2) {
  return num1 + num2;
}
// 可选参数的默认值
printInfo4(String name, {int age = 18, double height=1.88}) {
  print('name=$name age=$age height=$height');
}
main(List<String> args) {
  // 1.将函数赋值给一个变量
  var bar = foo;
  print(bar);

  // 2.将函数作为另一个函数的参数
  test(foo);

  // 3.将函数作为另一个函数的返回值
  var func = getFunc();
  func('kobe');
}

// 1.定义一个函数
foo(String name) {
  print('传入的name:$name');
}

// 2.将函数作为另外一个函数的参数
test(Function func) {
  func('kobe');
}

// 3.将函数作为另一个函数的返回值
getFunc() {
  return foo;
}
main(List<String> args) {
  // 1.定义数组
  var movies = ['少年', '你的答案', '缘字书', '不谓侠'];

  // 2.使用forEach遍历: 有名字的函数
  printElement(item) {
    print(item);
  }
  movies.forEach(printElement);

  // 3.使用forEach遍历: 匿名函数
  movies.forEach((item) {
    print(item);
  });
  movies.forEach((item) => print(item));
}
typedef Calculate = int Function(int num1, int num2);
void test(Calculate calc) {
  var result = calc(20, 30);
  print(result);
}

运算符

var num = 7;
print(num / 3); // 除法操作, 结果2.3333..
print(num ~/ 3); // 整除操作, 结果2;
print(num % 3); // 取余/模操作, 结果1;
// 1 当原来的变量有值时, 那么??=不执行
var name = "kobe";
name ??= "lilei";
print(name);// kobe
// 2 原来的变量为null, 那么将值赋值给这个变量
var name1 = null;
name1 ??= "lilei";
print(name1);// lilei
// 如果expr1是null,则返回expr2的结果;
// 如果expr1不是null,直接使用expr1的结果
var temp = 'yanhoo';
var name = temp ?? 'kobe';
print(name);// yanhoo
var temp1 = null;
var name1 = temp1 ?? 'kobe';
print(name1);// kobe
main(List<String> args) {
  // 分开调用
  final p1 = Person();
  p1.name = 'kobe';
  p1.run();
  p1.eat();
  p1.swim();

  // 通过级联语法
  final p2 = Person()
              ..name = "kobe"
              ..run()
              ..eat()
              ..swim();
}

// 自定义类
class Person {
  String name;

  void run() {
    print("${name} is running");
  }

  void eat() {
    print("${name} is eating");
  }

  void swim() {
    print("${name} is swimming");
  }
}

流程控制

泛型

// ------------------- 创建List的方式 -------------------
var names1 = ['why', 'kobe', 'james', 111];
print(names1.runtimeType); // List<Object>

// 限制类型
var names2 = <String>['why', 'kobe', 'james', 111]; // 最后一个报错
List<String> names3 = ['why', 'kobe', 'james', 111]; // 最后一个报错

// ------------------- 创建Map的方式 -------------------
var infos1 = {1: 'one', 'name': 'why', 'age': 18}; 
print(infos1.runtimeType); // _InternalLinkedHashMap<Object, Object>

// 对类型进行显示
Map<String, String> infos2 = {'name': 'why', 'age': 18}; // 18不能放在value中
var infos3 = <String, String>{'name': 'why', 'age': 18}; // 18不能放在value中

main(List<String> args) {
  Location l2 = Location<int>(10, 20);
  print(l2.x.runtimeType); // int 

  Location l3 = Location<String>('aaa', 'bbb');
  print(l3.x.runtimeType); // String
}
}

class Location<T> {
  T x;
  T y;

  Location(this.x, this.y);
}
main(List<String> args) {
  Location l2 = Location<int>(10, 20);
  print(l2.x.runtimeType);
    
  // 错误的写法, 类型必须继承自num
  Location l3 = Location<String>('aaa', 'bbb');
  print(l3.x.runtimeType);
}

// 限制泛型类型为继承自num的类型
class Location<T extends num> {
  T x;
  T y;

  Location(this.x, this.y);
}
main(List<String> args) {
  var names = ['Jordan', 'kobe'];
  var first = getFirst(names);
  print('$first ${first.runtimeType}'); // Jordan String
}

T getFirst<T>(List<T> ts) {
  return ts[0];
}

库的使用

library math;
// dart:前缀表示Dart的标准库,如dart:io、dart:html、dart:math
import 'dart:io';

//当然,你也可以用相对路径或绝对路径的dart文件来引用
import 'lib/student/student.dart';

//Pub包管理系统中有很多功能强大、实用的库,可以使用前缀 package:
import 'package:flutter/material.dart';

// 希望只导入库中某些内容,或者刻意隐藏库里面某些内容,可以使用show和hide关键字(这个功能个人感觉好鸡肋)
import 'lib/student/student.dart' show Student, Person;
import 'lib/student/student.dart' hide Person;
import 'lib/student/student.dart' as Stu;

// Stu.Student使用指定命名空间里的类
Stu.Student s = new Stu.Student();
mathUtils.dart
dateUtils.dart

可以新建一个utils.dart文件,并在文件中集中导入
export 'mathUtils.dart';
export 'dateUtils.dart'; 

// 使用
import "lib/utils.dart";
// 这样定义的函数,当前库以外的就不能访问
int _min(int num1, int num2) {
  return num1 > num2 ? num2: num1;
}
name: 自己去个有意义的名字
description: 描述信息
dependencies: 
  http: ^0.12.0+4
import 'package:http/http.dart';
上一篇 下一篇

猜你喜欢

热点阅读