Dart 语言TS开发者速通(ChatGPT)
一、值类型、变量、常量
1. 类型
Dart是一门静态类型的编程语言,这意味着在编译时会对变量的类型进行检查。以下是Dart中的一些常见数据类型:
- 数字类型:
int
:整数类型,可以表示整数值。例如:int age = 30;
double
:双精度浮点数类型,用于表示带小数点的数字。例如:double pi = 3.14;
- 字符串类型:
String
:字符串类型,用于表示文本数据。例如:String name = "Alice";
- 布尔类型:
bool
:布尔类型,用于表示逻辑值(true或false)。例如:bool isFlutterFun = true;
- 列表和集合:
List
:表示有序的列表,类似于数组。例如:List<int> numbers = [1, 2, 3];
Set
:表示无序不重复的集合。例如:Set<String> uniqueNames = {"Alice", "Bob", "Charlie"};
- 映射类型:
Map
:表示键值对映射,类似于JavaScript中的对象。例如:Map<String, int> ageMap = {"Alice": 30, "Bob": 25};
- 动态类型:
dynamic
:用于表示可以存储任何类型的值。例如:dynamic dynamicVar = "Hello";
- 可空类型:
Type?
:Dart 2.12及更高版本引入了可空类型,允许变量的值为空(null)。例如:int? nullableAge = null;
- 枚举类型:
enum
:用于定义一组命名的常量值。例如:
enum Color {
red, green, blue }
Color selectedColor = Color.blue;
2. 变量、常量
var声明变量、const、final声明常量,const主要用在局部函数内,final主要用在Class和实例化对象,final做成员变量时,可以由构造函数完成初始化。
注意:与TS不同,const不可声明实例化对象
const 用法
void main(List<String> arguments) {
const String myString = 'hello world';
print('${
myString}!');
}
final用法
class Person {
final String name;
// Only static fields can be declared as const. (Documentation)
const int age;
Person(this.name);
}
与TS不同,const不能用来修饰引用数据类型,在Dart中,const
只能用于修饰编译时常量,而不是用于自定义类的实例。具体来说,您不能将 const
用于自定义类的实例,因为类的实例通常是在运行时创建的,而不是在编译时。
class Person {
final String name;
Person(this.name);
}
void main(List<String> arguments) {
// Const variables must be initialized with a constant value. (Documentation)
const person = Person("张三");
}
如果const非得修饰实例对象,
const、final区别
在Dart中,final
和 const
都用于声明不可变的变量,但它们之间有一些重要的区别:
-
final
变量:final
声明的变量只能被赋值一次。一旦赋值后,其值不能再被改变。final
变量的值可以在运行时确定,也可以在构造函数中赋值。final
变量不要求在声明时初始化,但必须在构造函数中或在变量声明后的某个地方进行初始化。
dartCopy codefinal int age = 30; final String name; MyClass(this.name); // 构造函数中初始化
-
const
变量:const
声明的变量是编译时常量,其值必须在编译时确定。这意味着const
变量的值必须是在编译时已知的常量表达式。const
变量在声明时必须被初始化,不能在构造函数中赋值。它的值在编译时就已经确定,不会在运行时改变。
const double pi = 3.14; const String greeting = "Hello, World!";
总结 final
和 const
的主要区别是:
final
是运行时常量,允许在运行时确定其值。const
是编译时常量,要求在编译时确定其值,并且必须在声明时进行初始化。final
变量可以具有不同值,但只能被赋值一次。const
变量的值在编译时已知,不会改变。
3. 类型检查
void main(List<String> arguments) {
String variable = "variable";
if (variable is String) {
print("variable 是一个字符串");
}
String? str = variable as String;
if(str != null) {
print('variable 是一个字符串');
}
if(variable.runtimeType == String) {
print("variable 是一个字符串");
}
variable.runtimeType.toString(); // String
}
请注意,尽量避免过度使用类型检查,因为它可能暗示您的代码可能需要更好的结构。Dart的静态类型检查通常会在编译时捕获类型错误,因此应该优先考虑使用强类型来确保类型安全。只有在处理不同类型的外部数据或需要运行时动态确定类型的情况下,才应该使用类型检查。
4. 包装类型
在Dart中,基本数据类型和对象都是相同的,例如 int
、double
和 String
都是类,不需要包装类型。这使得Dart代码更加简洁和直观。
5. 类型转化
Dart中的数据类型转换通常涉及类型转换运算符或构造函数。以下是一些常见的数据类型转换方式:
-
整数转换为浮点数:您可以使用
toDouble()
方法将整数转换为浮点数。int intValue = 42; double doubleValue = intValue.toDouble();
-
浮点数转换为整数:您可以使用
toInt()
方法将浮点数转换为整数。请注意,小数部分将被截断。double doubleValue = 3.14159; int intValue = doubleValue.toInt();
-
字符串转换为整数或浮点数:您可以使用
int.parse()
和double.parse()
函数将字符串转换为整数或浮点数。String intString = "42"; int intValue = int.parse(intString); String doubleString = "3.14159"; double doubleValue = double.parse(doubleString);
-
整数或浮点数转换为字符串:您可以使用
toString()
方法将整数或浮点数转换为字符串。int intValue = 42; String intString = intValue.toString(); double doubleValue = 3.14159; String doubleString = doubleValue.toString();
-
字符串转换为布尔值:在Dart中,非空的字符串被视为
true
,空字符串被视为false
。String nonEmptyString = "Hello"; bool isTrue = (nonEmptyString == true); String emptyString = ""; bool isFalse = (emptyString == false);
二、String
Dart中的字符串类型是内置的,它提供了许多字符串操作方法,包括字符串连接、插值和格式化。以下是一些常见的字符串操作方法和技巧:
-
字符串连接:您可以使用
+
运算符来连接两个字符串。String firstName = "John"; String lastName = "Doe"; String fullName = firstName + " " + lastName; // "John Doe"
-
字符串插值:Dart支持字符串插值,使用
${}
来将表达式嵌入到字符串中。String name = "Alice"; String greeting = "Hello, $name!";
-
多行字符串:使用三重引号
'''
或"""
可以创建多行字符串。String multiLine = ''' This is a multi-line string. ''';
-
字符串长度:使用
length
属性来获取字符串的长度。String text = "Hello, World!"; int length = text.length; // 13
-
字符串分割:使用
split
方法来将字符串拆分为列表。String sentence = "This is a sample sentence"; List<String> words = sentence.split(" ");
-
字符串查找:使用
contains
和indexOf
方法来查找子字符串是否存在或获取其索引。String text = "Dart is fun!"; bool containsDart = text.contains("Dart"); // true int indexIs = text.indexOf("is"); // 5
-
字符串替换:使用
replaceAll
或replaceFirst
方法来替换字符串中的子字符串。String text = "Hello, world!"; String newText = text.replaceAll("world", "Dart"); // "Hello, Dart!"
-
字符串剪裁:使用
substring
方法来获取字符串的子串。String text = "Dart is amazing!"; String subtext = text.substring(5, 7); // "is"
-
字符串大小写转换:使用
toLowerCase
和toUpperCase
方法来将字符串转换为小写或大写。String text = "Hello, Dart!"; String lowercase = text.toLowerCase(); // "hello, dart!" String uppercase = text.toUpperCase(); // "HELLO, DART!"
-
字符串格式化:Dart提供了多种字符串格式化的方式,包括使用
printf
风格的格式化和String
的format
方法。还可以使用第三方库来进行更复杂的字符串格式化操作。 -
字符串插值:字符串插值是一种字符串操作技巧,允许您在字符串中嵌入变量或表达式的值。在Dart中,字符串插值使用
${}
语法来实现,允许将变量、表达式或函数的结果嵌入到字符串中。以下是字符串插值的示例:String name = "Alice"; int age = 30; String greeting = "Hello, $name!"; // 基本的字符串插值 String introduction = "My name is $name, and I'm