1.数字类型
num 是数字类型的父类,有两个字累 int 和 double
2.字符串
String
3.布尔类型
bool
4.List集合
List
5.map
map
import 'package:flutter/material.dart';
import 'package:flutter_study/data_type.dart';
///入口函数 ,每次运行 通过main方法启动程序
void main() {
runApp(const MyApp());
}
///StatelessWidget 无状态
///StatefulWidget 有状态
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter必备Dart基础',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
appBar: AppBar(title: Text("Flutter必备Dart基础"),),
body: Container(
child: ListView(
children: const [
DataType()
],
),
),
)
);
}
}
新建Dart类data_type
import 'package:flutter/material.dart';
/// author : Majunbao
/// github : https://github.com/MaJunBaox
/// time : 2022/5/16 3:25 下午
/// desc : Dart基本数据类型
class DataType extends StatefulWidget {
const DataType({Key? key}) : super(key: key);
@override
State<DataType> createState() => _DataTypeState();
}
class _DataTypeState extends State<DataType> {
@override
Widget build(BuildContext context) {
//数字类型
_numType();
//字符串类型
_stringType();
//布尔类型
_boolType();
//集合类型
_listType();
//Map
_mapType();
//扩展
_tips();
return Container(
child: const Text("常用数据类型 ,请查看控制台输出"),
);
}
}
///数字类型
_numType(){
num num1 = -1.0 ; //num是数字类型的父类,有两个子类 int 和 double
num num2 = 2;
int int1 = 3; //只能是证书
double d1 = 1.68; //双精度 浮点数
print("num:$num1 num:$num2 int:$int1 double:$d1");
print(num1.abs()); //求绝对值
print(num1.toInt()); //转换成int
print(num1.toDouble()); //转换成Double
}
///字符串
_stringType(){
String str1 = '字符串' ,str2 = "双引号"; //字符串定义
String str3 = 'str1:$str1 str2:$str2'; //字符串拼接
String str4 = 'str1:' + str1 + 'str2:' + str2; //字符串拼接
String str5 = "常用数据类型 ,请看控制台输出";
print(str3);
print(str4);
/**
* substring 字符串截取 ,留头不留位 从0开始
* indexOf 获取当前字符下标
* startsWith 字符串开头是否是该文字 bool true是 false否
* replaceAll 替换字符串 常用 替换成 京城
* contains 字符串是否包含某个字符 bool true是 false否
* split 裁剪字符串 ,得到的是数组
*/
//常用方法
print(str5.substring(2,5));//字符串截取 :数据类
print(str5.indexOf('类型')); //获取指定字符串位置 :4
print(str5.startsWith('常用')); // "true
print(str5.replaceAll('常用', '经常')); // :经常数据类型 ,请看控制台输出
print(str5.contains('输出')); //true
print(str5.split('请')); // :[常用数据类型 ,, 看控制台输出]
}
///布尔类型,Dart是强bool类型检查 ,只有boool类型的值是true , 才被认为是true
_boolType(){
/**
* || 有一个为true 即 为 true
* && 有一个为false 即为 false
*/
print('布尔类型-请查看控制台');
bool success = true ,fail = false;
print(success); //true
print(fail); //false
print(success || fail); //true
print(success && fail); //false
}
///List集合
_listType(){
print("List集合-请查看控制台");
//集合初始化的方式
List list = [1,2,3,'集合']; //初始化是,添加元素
print(list); // [1, 2, 3, 集合]
List<int> list2 = [];
//list2 = list; 错误做法,类型转换错误
List list3 = [];
list3.add('list3'); //通过add方法添加元素
list3.addAll(list);
print(list3); // [list3, 1, 2, 3, 集合]
List list4 = List.generate(3, (index) => index * 2);
print(list4); // [0, 2, 4]
//遍历集合的方式
for(int i = 0 ; i < list.length ; i++){
print(list[i]); // 1 2 3 集合
}
list.forEach((element) {
print(element); // 1 2 3 集合
});
list.remove(1);//删除值为1的元素 返回bool true成功 false失败
list.removeAt(1); //删除下标为1的元素 并返回删除的值
list.insert(0, "majunbao"); //下标为0的位置添加 majunbao
print(list.sublist(0,2)); //裁剪 从0开始 ,留头去尾
print(list.indexOf("majunbao")); //返回值为majunbao的下标
}
///map是key 与 value 相关联的对象,key和value都可以是任何类型的对象,并且key是唯一
_mapType(){
print('map-请查看控制台');
//Map初始化
Map names = {'zhangsan' : '张三' , 'lisi':'李四'};
print(names); //{zhangsan: 张三, lisi: 李四}
Map ages = {};
ages['xiaoming'] = 16;
ages['xiaohong'] = 18;
print(ages); //{xiaoming: 16, xiaohong: 18}
//遍历
ages.forEach((key, value) {
print("$key : $value");
});
Map ages2 = ages.map((key, value){
//迭代生成一个新Map
return MapEntry(key, value);
});
print(ages2);
for(var key in ages.keys){
print("$key ${ages[key]}");
}
ages.remove("xiaohong");//删除key为小红的值
ages.containsKey("xiaohong"); //ages集合中是否包含key为小红的 bool true包含 false不包含
}
///dynamic ,var ,Object三者的区别
///dynamic:是所有Dart对象的基础类型 ,在大多数情况下,通常不直接使用它
///通过它定义的变量会关机类型检查,这一位置dynamic x = 'hal'; x.foo();
///这段代码静态类型检查不会报错,但是运行是会crash,因为x并没有foo()方法,所以建议大家在编程时不要直接使用dynamic;
///var:是一个关键字,意思是“我不关心这里的类型是什么。”,系统会自动推断类型runtimeType;
///Object:是Dart对象的基类,当你定义:Object o=xxx;时这时候系统会认为o是个对象,你可以调用o的toString()和hashCode()方法
///因为Object提供了这些方法,但是如果你尝试调用o.foo()时,静态类型检查会进行报错;
///综上不难看出dynamic与Object的最大的区别是在静态类型检查上;
_tips(){
print('----_tips----');
dynamic x = 'hal';
//x.foo(); 没有这个方法
print(x.runtimeType);
print(x);
x = 123;
print(x);
print(x.runtimeType);
var a = 'hal';
//a = 123;//你可以改变 x的类型,但是无法改变 a的类型
print(a.runtimeType);
print(a);
Object o1 = '11';
print(o1.runtimeType);
print(o1);
}