Flutter

发布于 11 天前  14 次阅读


Dart语法基础

1.Dart中的数据类型

显示类型声明:

String str = 'hello world'; //每一句后面都必须要有分号

int num = 10;

double num2 = 1.2;

bool flag = false;

类型推断

var v = 100; //自动推断为int

var person = {'name': 'zs', 'age':20}; //自动推断为Map<String, dynamic>

字符串的常用操作:

var str = '123';

var str2 = 'hello';

var combine = str + '&' + str2; //123&hello

//换行

var str = '''

123

345

''';

//字符串插值

var s1 = 's1';

String s2 = 's2';

String s3 = 's3 $s1' //输出s3 s1

流程控制语句:和JS中的if-else,for,while一样使用即可

函数

普通函数定义

int sum(int a, int b){

return a+b; //返回int数据,和C语言类似

}

同理也有void函数,以及一些其它的函数。

可选参数

1)命名参数:

void printf({int? a, String? b, double? c, bool? d}){print('$a $b $c $d');}

//调用的时候

printf(a: 100, c: 1.2, d: true); //打印100 null 1.2 true

2)位置参数:

String greet(String name, [String title = '先生']){ //传递了就用传递的值,没传递就用默认值

return '你好$name$title';

}

Dart中的集合类

List(列表):实际上就是JS中的数组,有续集和,运行重复,索引从0开始

List<String> strArr = ['1', '2', 'a', 'b'];

strArr.add('3'); //在末尾添加一个元素

strArr.remove('1'); //删除值为字符1的元素

strArr.removeAt(1); //删除下标1的元素

strArr[3] = 'c'; //把下标3的元素的值赋为字符c

strArr.insert(1, '12345'); //在下标1处差如一个字符串'12345'

常用方法:

print(strArr.sublist(1, 3)); //获取子列表。就是截取下标1-3的元素作为一个子列表

print(strArr.indexOf('a'));//查找元素值为'a'的下标

strArr.sort();//列表排序

strArr.forEach(print);//遍历列表并打印每一项

for(var item in strArr){print(item)};//遍历列表并打印每一项

Set(集合)

元素唯一,无序,快速查找O(1)

var set1 = {1, 2, 3};

var emptySet = String{}; //空集,且集合中的每一项都必须是字符串

var colors = {'green', 'red'};

colors.add('blue');//添加元素

colors.remove('green');//删除元素

colors.addAll({'red', 'green'});//一次添加多个元素,重复元素自动过滤

// 集合运算
var primary = {'red', 'blue', 'yellow'};
print(colors.union(primary)); // 并集
print(colors.intersection(primary)); // 交集
print(colors.difference(primary)); // 差集

Map(映射,字典):类似于JS中的对象

键值对集合,键唯一,快速查找(基于键)

var pserson = {

'name':"zs",

'age':20

};

//或者

Map<string, dynamic> person = {'name':'lisi', 'age':18};

//或者

var person = Map<String, dynamic>();

常用方法:

person["name"] = "wangwu"; //只能通过[key]的形式获取map里面的值

person.remove('name'); //删除键为name的键值对

person.ForEach((k, v)=>print(’$k, $v‘));

for(var entry in person.entries){

print('$entry.key $entry.value');

}

集合的高阶操作

扩展运算符

var list1 = [1, 2];
var list2 = [3, …list1]; // [3, 1, 2]
var combined = […list1, …?list2]; // 空安全展开

列表的常用方法

var arr = [1, 2, 3, 4];

var double = arr.map((item)=>item * 2); //就是JS中的map

var evenNumbers = arr.where((n)=>n%2 == 0); //过滤,类似于JS中的filter

int sum = arr.fold(0, (prev, n)=>prev + n); //叠加器,就是JS中的reduce

集合转换

var listFromSet = Set.of([1, 2, 3]).toList();

var setFromList = List.from([1, 2, 3]).toSet();

var mapFromList = List.of(['1', '2', '3']).asMap(); // 转换后的结果就是:{0: '1', 1: '2', 2: '3'};

var entryList = person.entries.toList();

定时延时器

import 'dart:async';

void main(){

Timer(Duration(seconds: 3), (){print('3秒过去了!');});//延时定时器

int i = 0;

const timer = Timer.periodic(Duration(seconds: 3), (){

print(++i);

if(timer.tick == 5){ //5秒后关闭定时器

timer.cancle(); //关闭定时器,两种定时器都是通过这种方法关闭

}

}); //周期定时器

}

Future:类似于JS中的Promise

在dart中,Future用于处理异步操作的核心类,异步操作不会阻塞程序的执行流程,而future代表一个可能还未执行完的操作结果,当操作完成时会返回一个结果或者抛出一个错误。

使用:

Future<String> future(){

return Future<String>((completer){

//模拟一个耗时操作

Future.delayed(Duration(seconds: 3), (){

completer.complete('操作完成!!!');

});

});

}

这里使用 completer 来控制 Future 的完成状态,completer.complete 用于返回操作的结果。

Future.value与Future.error

通过Future.value返回一个已完成且指定值的Future,示例:

Future<int> futureWithValue = Future.value(2); //就相当于Promise中的resolve

通过Future.error返回一个已完成且带有错误的Future,示例:

Future<String> futureWithError = Future.error('error!!!'); //相当于Promise中的reject

处理Future的结果

Future的处理结果就和Promise的处理结果一样,可以用then和async/await来处理,语法都是一样的。

网络请求

在Flutter中使用网络请求的步骤如下:

1.配置网络请求

在pubspec.yaml的dependencies中配置:

dependencies:

http: ^1.0.0//去pubdev官网查找对应的版本

2.使用

导入网络请求库

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

void main async(){

const res = await http.get(Uri.pares('http://www.m.baidu.com/'));

if(res.statusCode == 200){

print('数据获取成功!!!${res.body}');

}else{

print('数据获取失败!!!${res.statusCode}');

}

}

面向对象

在Flutter中也有面向对象的概念,它运行你通过定义类和对象来组织代码。

1.类的定义:

class Person{

string? name; //默认是共有属性,在Flutter中声明私有属性不使用关键字private,而是直接在变量前面加一个下划线,即:string? _name; 就表示这是一个私有属性,外部不能直接访问。

int? age;

Person(thid.name, this.age); //构造函数的定义有多种,这种是最常用的

void introduce(){ //普通的成员方法

print('我叫$this.name, 今年$this.age岁');

}

}

抽象类

在Flutter中,没有接口的概念,与之对应的是抽象类,只定义属性和方法,不给属性赋值和方法的实现,可以被继承和实现。

flutter
abstract class Person{
  String? name;
  int? id;
  int? age;
  void introduce();
}

//继承
class Teacher extends Person{

  String? _subject; //学科

  Teacher(String name, int id, int age, this._subject){
   this.name = name;
   this.id = id;
   this.age = age;
  }

  @override
  void introduce(){
    print('我是${name},一名${_subject}老师,教师号为:${id},今年${age}岁');
  }

  @override
  String toString(){
    return '我是${name},一名${_subject}老师,教师号为:${id},今年${age}岁';
  }
}
//实现
class Student implements Person{

  String? _college;
  @override
  int? age;

  @override
  int? id;

  @override
  String? name;

  Student(this.name, this.age, this.id, this._college);

  @override
  void introduce() {
    // TODO: implement introduce
    print('我是${name},一名${_college}学生,学号为:${id},今年${age}岁');
  }

}
//调用示例
import 'package:day3review/model/type.dart';

void main(){
   Teacher stu = Teacher('teacher wang', 1, 26, 'math');
   stu.introduce();
   Student student = Student('lisi', 20, 1, 'tinghua');
   student.introduce();
}

常用组件

Container,Text,TextFiled,TextButton,EleviatedButton,IconButton,SizeBox,ListView。

列表渲染:

1.最直接的方法

Column(

children: '1234567890'.split('').map((item)=>Text(item)).toList(),

)


真正的英雄主义,是认清生活真相后依然热爱生活 ——罗曼.罗兰