Flutter之Dart基础语法(一)

2023-08-14  本文已影响0人  Bfmall

一.Hello Dart

1.1. 打印 print
  print('hello dart');
  // command + s 清理运行缓存
1.2. Dart程序分析

1.Dart语言的入口也是main函数,并且必须显示的进行定义;
2.Dart的入口函数main是没有返回值的;
3.传递给main的命令行参数,是通过List完成的。
从字面值就可以理解List是Dart中的集合类型。
其中的每一个String都表示传递给main的一个参数;
4.定义字符串的时候,可以使用单引号或双引号;
5.每行语句必须使用分号结尾,很多语言并不需要分号,比如Swift、JavaScript;
二.定义变量

2.1. 定义变量(Explicit)

/**
声明变量
变量类型 变量名称 = 赋值;
*/

  String name = 'xiao ming';
  int age = 18;
  double height = 1.88;
  print('$name, $age, $height');  
2.2. 类型推导(Type Inference)
/**
    var/dynamic/const/final 变量名称 = 赋值;
    const/final 初始化必须赋值
  */

1.var

  var name = 'name';
  name = 'yh';
  print(name.runtimeType);//String

2.dynamic 动态类型

  // dynamic可以改变变量类型,通常情况下不使用dynamic, 因为类型的变化会带来潜在的危险
  dynamic age = '180';
  print(age.runtimeType);//String
  age = 180;
  print(age.runtimeType);//int

3.final & const
final和const都是用于定义常量的,也就是定义之后不可以修改

final name = 'yh';
// name = 'hy';//错误

const age = 18;
// age = 81;//错误

final和const区别
const在赋值时,赋值的内容必须是在编译期间就确定下来的
final在赋值时,可以动态获取,比如赋值一个函数;final一旦被赋值后就有确定的结果,不会再次赋值

void main(List<String> args) {
  const name = getName();//错误的做法,因为要执行函数才能获取到值
  final name2 = getName();
}

String getName() {
  return 'yh';
}

const修饰赋值语句,只会使用同一份内存,可提高性能:

void main(List<String> args) {
  final a = const Person();
  final b = const Person();
  print(identical(a, b));//true

  final c = Person();
  final d = Person();
  print(identical(c, d));//false
}

class Person {
  const Person();
}

三.数据类型

3.1. Int Double
  //1.整数类型int
  int age = 12;
  int hexAge = 0x12;
  print('$age,$hexAge');//12,18
  //2.浮点型double
  double height = 1.88;

  //字符串与数字转换
  //1.字符串转数字
  var one = int.parse('111');
  print('$one ${one.runtimeType}');//111 int

  //2.数字转字符串
  var num1 = 123;
  var num2 = 123.456;
  var num1Str = num1.toString();
  var num2Str = num2.toString();
  var num2StrD = num2.toStringAsFixed(1);
  print('$num1Str,$num2Str,$num2StrD');//123,123.456,123.5
3.2. bool

注意:Dart中不能判断非0即真,或者非空即真

var isFlag = true;
print('$isFlag,${isFlag.runtimeType}');//true,bool

var message = 'dart';
//错误写法
if (message) {
    print(message);
}
3.3. String

Dart字符串是UTF-16编码单元的序列。您可以使用单引号或双引号创建一个字符串:

//单行字符串
var str1 = 'str1';
var str2 = "str2";
//多行字符串
var str3 = '''
1
2
3
''';
//字符串拼接
var str4 = '$str1,$str2,$str3';
print(str4);
}
3.4. 集合类型

1.集合类型的定义
List:数组 / Set:集合 / Map:字典(映射)

var letters = ['a','b','c'];
List<int> numsList = [1,2,3];
print('$letters,${letters.runtimeType},$numsList,${numsList.runtimeType}');
//[a, b, c],List<String>,[1, 2, 3],List<int>

Set<int> numsSet = {1,2,3,4};
print('$numsSet,${numsSet.runtimeType}');
//{1, 2, 3, 4},_CompactLinkedHashSet<int>

Map<String, Object> map = {'name': 'yh', 'height': 1.88};
print('$map,${map.runtimeType}');
//{name: yh, height: 1.88},_InternalLinkedHashMap<String, Object>

2.集合的常见操作

print(letters.length);
print(numsSet.length);
print(objsMap.length);

//list操作
//增,删,包含
numsList.add(5);
numsSet.add(5);

numsList.remove(1);
numsList.removeAt(1);

numsList.contains(4);

print(numsList);//[2, 5]

//map操作
//1.根据key获取value
print(objsMap['name']);//yh
//2.获取所有的entries
print('${objsMap.entries},${objsMap.entries.runtimeType}');//(MapEntry(name: yh), MapEntry(height: 1.88)),MappedIterable<String, MapEntry<String, Object>>
//3.all keys
print(objsMap.keys);//(name, height)
//4.all values
print(objsMap.values);//(yh, 1.88)
//5.contain key || contain value
print('${objsMap.containsKey('name')},${objsMap.containsValue('yh')}');//true,true
//6.remove from key
objsMap.remove('name');

print(objsMap);//{height: 1.88}

四.函数 Function

4.1 函数定义
//函数返回值可以省略

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

void main(List<String> args) {
  print(sum(1, 2));
  print(sum2(1, 2));
}

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

//注意:这里只能是一个表达式,不能是一个语句
sum2(num1, num2) => num1 + num2;
4.2 函数的参数

可选参数
注意, 只有可选参数才可以有默认值, 必须参数不能有默认值

//命名可选参数: {param1, param2, ...}
//位置可选参数: [param1, param2, ...]
  
//命名可选参数
optionParamsFun1(String name, {int age = 10, double height = 1.8}) {
    print('$name,$age,$height');
}
//调用
optionParamsFun1('yh');
optionParamsFun1('yh',age: 20);
optionParamsFun1('yh',age: 20,height: 1.88);
// yh,10,1.8
// yh,20,1.8
// yh,20,1.88

//位置可选参数
optionParamsFun1(String name, [int age = 10, double height = 1.8]) {
    print('$name,$age,$height');
}
optionParamsFun1('yh');
optionParamsFun1('yh', 20);
optionParamsFun1('yh', 20, 1.88);
// yh,10,1.8
// yh,20,1.8
// yh,20,1.88
4.3. 函数是一等公民

函数可以作为参数、返回值

//调用
test(getFunc());

//1.定义一个函数
foo(String name) {
  print(name);
}
//2.将函数作为另一个函数的返回值
getFunc() {
 return foo; 
}
//3.将函数作为另一个函数的参数
test(Function func) {
  func("func");
}
4.4. [匿名函数]
void main(List<String> args) {
//匿名函数
  var movies = ['盗梦空间', '星际穿越', '少年派', '大话西游'];
  //1.定义匿名函数
  printElement(item) {
    print(item);
  }
  movies.forEach(printElement);

  //2.使用forEach遍历:匿名函数
  movies.forEach((element) {
    print(element);
  });
  movies.forEach((element) => print(element));
}
4.5. 词法作用域

dart中的词法有自己明确的作用域范围,它是根据代码的结构({})来决定作用域范围的
优先使用自己作用域中的变量,如果没有找到,则一层层向外查找。

var name = 'global';
main(List<String> args) {
  // var name = 'main';
  void foo() {
    // var name = 'foo';
    print(name);
  }
  foo();
}
4.6. [闭包]作用域

闭包可以访问其词法范围内的变量,即使函数在其他地方被使用,也可以正常的访问。

void main(List<String> args) {

  sum(num m) {
    return (num n) {
      return m + n;
    };
  }

  var func = sum(10);
  print(func(10));//20
}
4.7. 返回值问题

所有函数都返回一个值。如果没有指定返回值,则语句返回null;隐式附加到函数体。

main(List<String> args) {
  print(foo()); // null
}

foo() {
  print('foo function');
}

五.运算符

5.1.普通运算符
  1. 除法、整除、取余
  var num = 7;
  print(num / 3);//除 2.3333
  print(num ~/ 3);//整除 2
  print(num % 3);//取余 1

2.??=

//当变量不为null时使用变量,当变量为null时,后面的值将被赋值给变量
  var name = 'lucy';
  name ??= 'sala';
  print(name);//lucy

  var name2 = null;
  name2 ??= 'Toms';
  print(name2);//Toms

3.??

//当变量不为null时使用变量,当变量为null时使用后面的值
  var name = 'lucy';
  print(name ?? 'sala');//lucy

  var name2 = null;
  print(name2 ?? 'Toms');//Toms

5.2. 级联语法:…
对一个对象进行连续的操作,这个时候可以使用级联语法。

class Person {
  String name = 'Tom';
  void eat() {
  }
  void drink() {
  }
  void sleep() {
  }
}

void main(List<String> args) {

  final p1 = Person();
  p1.name = 'Lucy';
  p1.eat();
  p1.drink();
  p1.sleep();
  //级联
  final p2 = Person()
            ..name = "Tom"
            ..eat()
            ..drink()
            ..sleep();

}

5.3. if else
dart不支持非零即真,判断语句中必须有明确的bool类型

  var isBool = true;
  if (isBool) {
  } else {
  }

5.4. switch-case

  var direction = 'east';
  switch (direction) {
    case 'east':
      print('东方');
      break;
    case 'west':
      print('西方');
      break;

    default:
      print('其他方');
  }
  //东方

5.5. 循环
for、for in

  var list = ['1','2','3'];
  for (var i = 0; i < list.length; i++) {
    print(list[i]);
  }
  
  for (var str in list) {
    print(str);
  }
  //1 2 3

while do-while 与其他语法一致
break continue 与其他语法一致

六.枚举 enum

6.1.枚举的定义

枚举使用 enum关键字 来定义:

void main(List<String> args) {
  print(Colors.red);
  //枚举属性 index索引,从0开始;values包含所有枚举值的list
  print(Colors.red.index);
  print(Colors.values);
}

enum Colors {
  red,
  green,
  blue
}

————————————————
版权声明:本文为CSDN博主「weixin_42580612」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42580612/article/details/124137706

上一篇下一篇

猜你喜欢

热点阅读