ywzou

ywzou blog


  • 首页

  • 标签

  • 分类

  • 归档

Dart基础

发表于 2019-01-06 | 更新于 2019-01-12

声明:该文章为学习笔记,部分例子值是为了展示dart语法,没有实际意义,只是初步对dart有一个认识,为Flutter打基础。

一、环境搭建

官网:https://www.dartlang.org
具体请教谷歌或度娘

二、数据类型

2.1、变量和常量
使用关键字var声明变量,关键字const声明常量

1
2
3
4
5
6
7
8
9
10
11
12
13
main(List<String> args) {
var length = 100;
print(length);/// 输出100

length = 50;
print(length);/// 输出50

const size = 10;
print(size);/// 输出510

size = 20;/// 编译器报错 常量值不可修改

}

2.2、数值型(num)
int整型
整数型,值通常位于-263~263之间
double浮点型

1
2
3
4
5
6
7
8
9
10
void main(List<String> args) {
int age = 100;
print("age:$age");///age:100

num height = 120;
print("height:$height");///height:120

num money = 100.00;
print("money:$money");///money:100.0
}

简单的运算

1
2
3
4
5
6
7
8
9
///一些简单的运算
int x = 10;
int y = 3;
print("x + y = ${x + y}");///加 13
print("x - y = ${x - y}");///减 7
print("x * y = ${x * y}");///乘 30
print("x / y = ${x / y}");///除 3.333....
print("x ~/ y = ${x ~/ y}");///除 结果取整 3
print("x % y = ${x % y}");///余 1

简单的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
///一些简单的方法和属性
int z = -5;
print("3是基数:${x.isEven}");// 是否是奇数 true
print("10是偶数:${y.isOdd}");// 是否是偶数 true
print("-5是负数:${z.isNegative}");// 是否为负数 5
print("-5的绝对值:${z.abs()}");// 绝对值 5
print("24和36的最大公约数:${24.gcd(36)}");//返回此整数和[other]的最大公约数。
print("10的2次幂对30取模:${10.modPow(2, 30)}"); /// 10^2 % 30 = 10
print("10大于2:${10.compareTo(2)}");/// 数值比较 1大于 0等于 -1小于
print("10转换为double:${x.toDouble()}");/// 10.0
print("10转换为string:${x.toString() is String}");/// is判断是否是某一
个类型 结果true

double dx = 10.5;
print(dx.ceil());///返回不小于this的最小整数。 11
print(dx.ceilToDouble());///返回不小于this的最小整数double值。 11.0
print(dx.floor());///返回不大于this的最小整数。 10
print(dx.floorToDouble());///返回不大于this的最小整数double值。 10.0

/// round() roundToDouble() 返回最接近此的整数
print(3.5.round());// roundToDouble() 返回最接近此的整数。 4
print(-3.5.round());//返回最接近此的整数。-4

更多请自行查看API文档

2.3、布尔型
只有true和false,用bool关键字声明

1
2
3
4
5
6
7
8
9
void main(List<String> args) {
bool success = false;
print(success); ///false

int x = 10;
int y = 3;
success = x > y;
print(success);//true
}

2.4、字符串
Dart 字符串是 UTF-16 编码的字符序列。 可以使用单引号''或者双引号""来创建字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
///字符串
void main(List<String> args) {
String str = "this is a dart String";
print(str);

///使用三个单引号或者双引号也可以 创建多行字符串对象:
str = """这是第一行
这是第二行""";
String str2 = '''这是第一行
这是第二行''';


str = "Hello";
str2 = "Dart";
///字符串拼接
str = str + str2;
print(str);///HelloDart

///常用方法
print(str.toUpperCase());//转大写 HELLODART
print(str.toLowerCase());//转小写 hellodart
print(str.length);///长度 9
print(str.startsWith("He"));///以He开头 true
print(str.endsWith("He"));///以He结尾 false
print(str.contains("He"));///字符传中是否有He true
print(str.replaceFirst("l", "W"));///将第一个l替换为W
print("".isEmpty);///是否为空 true `isNotEmpty`
print(str.substring(2));///从第3个字符开始截取 下标索引 'lloDart'
print(str.substring(2,6));///从第3个字符开始截取到第6个字符为止 [2,6) 下标索引 'lloD'
print(str.indexOf("l"));///第一个'l'出现尾位置 索引 2
print(str.replaceRange(2, 6, "Google"));///将2-6位置字符替换为Google HelloDart => HeGoogleart

String str3 = "\tDart is fun\n";
/// trim() trimLeft() trimRight()
str3 = str3.trim();
print(str3);///去除首尾的空 'Dart is fun'

String a = "10";
int b = int.parse(a);//String 转 int
print(b);
}

更多的方法请查询API文档,或查看源码。

2.5、Map集合
Map是一个键值对相关的对象。键和值可以是任何类型的对象。键不能重复,值可以重复。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
///Map
void main(List<String> args) {
var map = {
"name": "dart",
"company": "google",
"age": 8
};

print(map);///{name: dart, company: google, age: 8}

Map user = new Map();
user["name"] = "dart";
user["age"] = 8;
user["age"] = 10;
print(user);///{name: dart, age: 10}

Map<String,String> user1 = new Map<String,String>();
user1["name"] = "dart";
/// user1["age"] = 8;/// error A value of type 'int' can't be assigned to a variable of type 'String'.
print(user1);///{name: dart}

///获取值
print(user["name"]);///dart

///修改值
user["name"] = "Flutter";
print(user);//{name: Flutter, age: 10}

print(user.length);//长度
print(user.isEmpty);//是否为空 false

///添加合并两个map
Map user2 = new Map();
user2["email"] = "dart@gmail.com";
user2["phone"] = "911";
user.addAll(user2);
print(user);///{name: Flutter, age: 10, email: dart@gmail.com, phone: 911}

///删除一个值
user.remove("phone");
print(user);///{name: Flutter, age: 10, email: dart@gmail.com}

///遍历 传入的是一个匿名函数
user.forEach((key,value) =>
print("key=$key,value=$value")
);
// key=name,value=Flutter
// key=age,value=10
// key=email,value=dart@gmail.com
}

2.6、列表
在 Dart 中数组就是List对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
///列表
void main(List<String> args) {
var arr = [2,3.3,"dart",true];
print(arr);//[2, 3.3, dart, true]
print("arr的长度是:${arr.length}");//4
print("arr是否是空:${arr.isEmpty}");//false
print("arr[2]:${arr[2]}");//dart
print("arr拼接为字符串:${arr.join()}");//23.3darttrue
print("arr中是否有dart元素:${arr.contains("dart")}");//true
//遍历
arr.forEach((v) => print(v));

//固定长度
List arr2 = new List(2);
arr2[0] = 20;
arr2[1] = "google";
print(arr2);//[20, google]
//遍历
for(int i = 0; i < arr2.length; i++){
print(arr[1]);
}

//固定类型
List<String> arr3 = new List<String>();
arr3.add("google");
// arr3.add(10);//不能添加
print(arr3);//[google]
}

2.7、Set
同为数据列表,与List比较,List中可以有重复的数据,而Set没有顺序且不能重复的集合,所以不能通过索引获取值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void main(List<String> args) {
var arr = new Set();//Set没有固定的元素,所以不能指定长度
arr.add("dart");
arr.add(2);
arr.add(2);

print(arr);//{dart, 2}
print("arr的长度是:${arr.length}");//2
print("arr是否是空:${arr.isEmpty}");//false
print("arr拼接为字符串:${arr.join()}");//dart2
print("arr中是否有dart元素:${arr.contains("dart")}");//true
print("arr中索引为1的元素:${arr.elementAt(1)}");//2
//遍历
arr.forEach((v) => print(v));
}

2.8、Dynamic
动态的数据类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void main(List<String> args) {
dynamic age = 20;
dynamic name = "dart";
dynamic height = 10.2;
dynamic success = true;

print(age is int);
age = "google";

print(age is int);
print(name is String);
print(height is double);
print(success is bool);
}

三、控制语句

3.1、if and esle

1
2
3
4
5
6
7
8
9
10
11
12
void main(List<String> args) {
int score = 65;
if (score >= 80) {
print("优秀");
} else if(score >= 70){
print("良好");
}else if(score >= 60){
print("中等");
}else{
print("不及格");
}
}

3.2、for loop

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void main(List<String> args) {
for(int i = 1; i < 10; i++){
for(int j = 1; j < 10; j++){
print("$i * $j = ${i * j}");
}
}

// continue 跳出当次循环 break结束循环
var list = [1, "dart", 30, 12.6];
for(int n = 0; n < list.length; n++){
var val = list[n];
if("dart" == val){
continue;
}

if(30 == val){
break;
}
print(val);
}
}

3.3、while and do-while
while循环在执行循环之前先判断条件是否满足,而do-while循环是先执行循环代码再判断条件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void main(List<String> args) {
int i = 1;
while(i < 10){
int j = 1;
while(j < 10){
print("$i * $j = ${i * j}");
j++;
}
i++;
}

int a = 3;
int step = 0;
do{
step ++;
print("执行$step次");//执行1次
}while(a < 2);
}

3.4、switch and case
Dart 中的 Switch 语句使用 ==比较 integer、string、或者编译时常量。比较的对象必须都是同一个类的实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void main(List<String> args) {
var cmd = "close_win";//close_io
switch (cmd) {
case "close_win":
case "close_io":
print("close");
break;
case "open":
print("open");
break;
default:
print("default");
}
}

四、异常

代码中可以出现异常和捕获异常。异常表示一些未知的错误情况。如果异常没有捕获,则异常会抛出,导致抛出异常的代码终止执行。
throw 抛出一个异常
try{} catch(e){} 捕获异常

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
void main(List<String> args) {
int a = 1;
var arr = [1, 2, 3];
try {
if(a == 1){
throw new Exception("a can't eq 1");
}

if(a == 2){
throw new NumException("自定义异常......");
}

print(arr[3]);
} catch (e) {
print(e);
}
}

class NumException implements Exception{
NumException([this.msg=""]);
final String msg;
String toString() {
if (msg == null) return "NumException";
return "Exception: $msg";
}
}

五、方法

Dart是一个真正的面向对象语言,方法也是对象并且具有一种类型Function。方法可以赋值给变量,也可以当做其他方法的参数。 也可以把 Dart 类的实例当做方法来调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
void main(List<String> args) {
String name ="小明";
int age = 10;
String email = "xiaoming@qq.com";

createUser(name, age, email);
createUserOpt();
createUserOptName(name: name,email: email);
createUserPos(name, age);
var f = (val){
print("value : $val");
};
callFunction(f);
}
///参数必需
void createUser(String name,int age,String email) {
print("name:$name,age:$age,email:$email");
}

///可选参数
void createUserOpt([String name,int age,String email]) {
print("name:$name,age:$age,email:$email");
}

///可选命名参数 默认参数值
void createUserOptName({String name,int age = 20,String email}) {
print("name:$name,age:$age,email:$email");
}
///可选位置参数
void createUserPos(String name,[int age,String email]) {
print("name:$name,age:$age,email:$email");
}

///方法作为参数
void callFunction(void f(int age)){
f(100);//执行传入的方法
}

六、类

Dart是一个面向对象编程语言,同时支持基于mixin的继承机制。每个对象都是一个类的实例,所有的类都继承于Object。
基于Mixin的继承意味着每个类(Object 除外)都只有一个超类,一个类的代码可以在其他多个类继承中重复使用。
使用new关键字和构造函数来创建新的对象。构造函数名字可以为ClassName或者 ClassName.identifier。

6.1、类的定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
void main(List<String> args) {
Person emp = new Employee("张三", "男", 18.4, "15188889999", "xx@qq.com", 10.2);
print(emp.getName);
emp.speak("你好!");
}

class Person{
String name;
String gender;
double height;
///构造方法
///方法一
/// Person({this.name,this.gender="男",this.height});
// Person(this.name,this.gender,this.height);

Person(String name,String gender,double height){
this.name = name;
this.gender = gender;
this.height = height;
}

//get set
String get getName => this.name;
set setName(String name) => this.name;

void speak(String text){
print("Person speak $text");
}
}

///扩展类
class Employee extends Person{

String phone;
String email;
double salary;

Employee(
String name,
String gender,
double height,
this.phone,
this.email,
this.salary
):super(name,gender,height);

@override
void speak(String text){
print("Employee speak $text");
}
}

6.2、抽象类

使用abstract修饰符定义一个抽象类,抽象类不能被实例化。通常用来定义接口,以及部分实现。如果希望实例化抽象类,可使用工厂构造函数方式。抽象类通常有抽象方法(没有实现体的方法)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/// 不可实例化
abstract class AbstractContainer {
/// 抽象方法
void updateChildren();
}

/// 可以势力化
class SpecializedContainer extends AbstractContainer {

void updateChildren() {
}

void doSomething();
}

6.3、隐式接口

每个类都隐式的定义了一个包含所有实例成员的接口,且这个类实现了这个接口。如果你想创建类A来支持类B的api,而不想继承B的实现, 则类A应该实现B的接口。
可以通过implements关键字来实现一个或者多个接口,并实现每个接口定义的API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
void main(List<String> args) {
// Person person = new Person(name:"张三");
// person.run();

// Employee emp = new Employee();
// emp.run();

// person = new Employee(name:"李四",phone: "15198989999");
// person.run();

greetBob(new Person(name:"川普"));
greetBob(new Employee(name:"李四",phone: "15198989999"));
}

greetBob(Person person) => person.run();


class Person{
final String name;
Person({this.name});

void run(){
print("Person[$name] runing...");
}
}

///继承
class Employee implements Person{
final String name;
final String phone;
Employee({
this.name,
this.phone
}
):super();

void run(){
print("Employee [$name] runing...");
}
}

6.4 枚举

枚举类型通常称之为enumerations或者enums, 是一种特殊的类,用来表现一个固定 数目的常量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void main(List<String> args) {
List<Color> colors = Color.values;
print(colors[0] == Color.red);
Color aColor = Color.blue;
switch (aColor) {
case Color.red:
print('Red as roses!');
break;
case Color.green:
print('Green as grass!');
break;
default:
print(aColor);
}
}

enum Color {
red,
green,
blue
}

6.5、泛型

将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型。泛型类是引用类型,是堆对象,主要是引入了类型参数这个概念

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void main(List<String> args) {
List<String> list = ["A","B"];

Result result = new Result(code: "0000",msg: "请求成功!",data: list);
print(result.toString());//[code=0000,msg:请求成功!,data:[A, B]]
}

class Result<T>{
String code;
String msg;
T data;
Result({this.code,this.msg,this.data});

String toString(){
return "[code=$code,msg:$msg,data:$data]";
}
}

Markdown 简明语法手册

发表于 2018-05-06 | 更新于 2019-01-12

Markdown 简明语法手册

标签: Cmd-Markdown


1. 斜体和粗体

使用 * 和 ** 表示斜体和粗体。

示例:

这是 斜体,这是 粗体。

2. 分级标题

使用 === 表示一级标题,使用 — 表示二级标题。

示例:

1
2
3
4
5
6
7
这是一个一级标题
============================

这是一个二级标题
--------------------------------------------------

### 这是一个三级标题

你也可以选择在行首加井号表示不同级别的标题 (H1-H6),例如:# H1, ## H2, ### H3,#### H4。

3. 外链接

使用 [描述](链接地址) 为文字增加外链接。

示例:

这是去往 本人博客 的链接。

4. 无序列表

使用 *,+,- 表示无序列表。

示例:

  • 无序列表项 一
  • 无序列表项 二
  • 无序列表项 三

5. 有序列表

使用数字和点表示有序列表。

示例:

  1. 有序列表项 一
  2. 有序列表项 二
  3. 有序列表项 三

6. 文字引用

使用 > 表示文字引用。

示例:

野火烧不尽,春风吹又生。

7. 行内代码块

使用 `代码` 表示行内代码块。

示例:

让我们聊聊 html。

8. 代码块

使用 四个缩进空格 表示代码块。

示例:

这是一个代码块,此行左侧有四个不可见的空格。

9. 插入图像

使用 ![描述](图片链接地址) 插入图像。

示例:

我的头像

Cmd Markdown 高阶语法手册

1. 内容目录

在段落中填写 [TOC] 以显示全文内容的目录结构。

[TOC]

2. 标签分类

在编辑区任意行的列首位置输入以下代码给文稿标签:

标签: 数学 英语 Markdown

或者

Tags: 数学 英语 Markdown

3. 删除线

使用 ~~ 表示删除线。

这是一段错误的文本。

4. 注脚

使用 [^keyword] 表示注脚。

这是一个注脚[^footnote]的样例。

这是第二个注脚[^footnote2]的样例。

5. LaTeX 公式

$ 表示行内公式:

质能守恒方程可以用一个很简洁的方程式 $E=mc^2$ 来表达。

$$ 表示整行公式:

$$\sum_{i=1}^n a_i=0$$

$$f(x_1,x_x,\ldots,x_n) = x_1^2 + x_2^2 + \cdots + x_n^2 $$

$$\sum^{j-1}{k=0}{\widehat{\gamma}{kj} z_k}$$

访问 MathJax 参考更多使用方法。

6. 加强的代码块

支持四十一种编程语言的语法高亮的显示,行号显示。

非代码示例:

1
$ sudo apt-get install vim-gnome

Python 示例:

1
2
3
4
5
6
7
8
9
10
11
12
@requires_authorization
def somefunc(param1='', param2=0):
'''A docstring'''
if param1 > param2: # interesting
print 'Greater'
return (param2 - param1 + 1) or None

class SomeClass:
pass

>>> message = '''interpreter
... prompt'''

JavaScript 示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* nth element in the fibonacci series.
* @param n >= 0
* @return the nth element, >= 0.
*/
function fib(n) {
var a = 1, b = 1;
var tmp;
while (--n >= 0) {
tmp = a;
a += b;
b = tmp;
}
return a;
}

document.write(fib(10));

7. 流程图

示例

1
2
3
4
5
6
7
8
9
10
st=>start: Start:>https://www.zybuluo.com
io=>inputoutput: verification
op=>operation: Your Operation
cond=>condition: Yes or No?
sub=>subroutine: Your Subroutine
e=>end

st->io->op->cond
cond(yes)->e
cond(no)->sub->io

更多语法参考:流程图语法参考

8. 序列图

示例 1

1
2
3
Alice->Bob: Hello Bob, how are you?
Note right of Bob: Bob thinks
Bob-->Alice: I am good thanks!

示例 2

1
2
3
4
5
Title: Here is a title
A->B: Normal line
B-->C: Dashed line
C->>D: Open arrow
D-->>A: Dashed open arrow

更多语法参考:序列图语法参考

9. 甘特图

甘特图内在思想简单。基本是一条线条图,横轴表示时间,纵轴表示活动(项目),线条表示在整个期间上计划和实际的活动完成情况。它直观地表明任务计划在什么时候进行,及实际进展与计划要求的对比。

1
2
3
4
5
6
7
8
9
10
11
12
13
title 项目开发流程
section 项目确定
需求分析 :a1, 2016-06-22, 3d
可行性报告 :after a1, 5d
概念验证 : 5d
section 项目实施
概要设计 :2016-07-05 , 5d
详细设计 :2016-07-08, 10d
编码 :2016-07-15, 10d
测试 :2016-07-22, 5d
section 发布验收
发布: 2d
验收: 3d

更多语法参考:甘特图语法参考

10. Mermaid 流程图

1
2
3
4
A[Hard edge] -->|Link text| B(Round edge)
B --> C{Decision}
C -->|One| D[Result one]
C -->|Two| E[Result two]

更多语法参考:Mermaid 流程图语法参考

11. Mermaid 序列图

1
2
3
4
Alice->John: Hello John, how are you?
loop every minute
John-->Alice: Great!
end

更多语法参考:Mermaid 序列图语法参考

12. 表格支持

项目 价格 数量
计算机 \$1600 5
手机 \$12 12
管线 \$1 234

13. 定义型列表

名词 1
: 定义 1(左侧有一个可见的冒号和四个不可见的空格)

代码块 2
: 这是代码块的定义(左侧有一个可见的冒号和四个不可见的空格)

代码块(左侧有八个不可见的空格)

14. Html 标签

本站支持在 Markdown 语法中嵌套 Html 标签,譬如,你可以用 Html 写一个纵跨两行的表格:

<table>
    <tr>
        <th rowspan="2">值班人员</th>
        <th>星期一</th>
        <th>星期二</th>
        <th>星期三</th>
    </tr>
    <tr>
        <td>李强</td>
        <td>张明</td>
        <td>王平</td>
    </tr>
</table>












值班人员 星期一 星期二 星期三
李强 张明 王平

15. 内嵌图标

本站的图标系统对外开放,在文档中输入

<i class="icon-weibo"></i>

即显示微博的图标:

替换 上述 i 标签 内的 icon-weibo 以显示不同的图标,例如:

<i class="icon-renren"></i>

即显示人人的图标:

更多的图标和玩法可以参看 font-awesome 官方网站。

16. 待办事宜 Todo 列表

使用带有 [ ] 或 [x] (未完成或已完成)项的列表语法撰写一个待办事宜列表,并且支持子列表嵌套以及混用Markdown语法,例如:

- [ ] **Cmd Markdown 开发**
    - [ ] 改进 Cmd 渲染算法,使用局部渲染技术提高渲染效率
    - [ ] 支持以 PDF 格式导出文稿
    - [x] 新增Todo列表功能 [语法参考](https://github.com/blog/1375-task-lists-in-gfm-issues-pulls-comments)
    - [x] 改进 LaTex 功能
        - [x] 修复 LaTex 公式渲染问题
        - [x] 新增 LaTex 公式编号功能 [语法参考](http://docs.mathjax.org/en/latest/tex.html#tex-eq-numbers)
- [ ] **七月旅行准备**
    - [ ] 准备邮轮上需要携带的物品
    - [ ] 浏览日本免税店的物品
    - [x] 购买蓝宝石公主号七月一日的船票

对应显示如下待办事宜 Todo 列表:

  • Cmd Markdown 开发
    • 改进 Cmd 渲染算法,使用局部渲染技术提高渲染效率
    • 支持以 PDF 格式导出文稿
    • 新增Todo列表功能 语法参考
    • 改进 LaTex 功能
      • 修复 LaTex 公式渲染问题
      • 新增 LaTex 公式编号功能 语法参考
  • 七月旅行准备
    • 准备邮轮上需要携带的物品
    • 浏览日本免税店的物品
    • 购买蓝宝石公主号七月一日的船票

[^footnote]: 这是一个 注脚 的 文本。

[^footnote2]: 这是另一个 注脚 的 文本。

12

ywzou

ywzou space

12 日志
1 分类
4 标签
GitHub
© 2019 ywzou
由 Hexo 强力驱动 v3.8.0
|
主题 – NexT.Gemini v6.7.0