本文主要介绍

1.解释一下 Flutter 中的热重载?

热重载功能使您可以快速轻松地在项目中执行实验。它有助于构建 UI、添加新功能、修复错误并加快应用程序开发。要执行 Flutter 应用程序的热重载,请执行以下步骤:

  • 在受支持的 Flutter 编辑器或终端窗口中运行应用程序。
  • 修改项目中的任何 Dart 文件。
  • 如果您使用支持 Flutter 的 IDE,则选择 Save All 或单击工具栏上的 Hot Reload 按钮。您可以立即在模拟器或真实设备中看到结果。

2.flutter 中的构建上下文是什么?

BuildContext Class 只是对 Widget 在所有构建的 Widget 的树结构中的位置的引用。每个Flutter小部件都有一个带有BuildContext参数的 @override build () 方法。

3.flutter中的脚手架是什么?

脚手架窗口小部件提供了实现的基本材料设计可视布局结构的框架应用程序。它提供了用于显示抽屉、小吃店和底部床单的 API。看看它的构造函数和它的属性。

4.flutter中的material app是什么?

MaterialApp是一个小部件,它引入了许多有趣的工具,例如 Navigator 或 Theme 来帮助您开发您的应用程序。…然后当您想使用 Text 或 InkWell 时,使用引入Material实例(如 Scaffold 、 Appbar 、 Dialog 等)的小部件。

5.flutter中setState有什么用?

状态对象由框架创建。为了更改您的小部件,您需要更新状态对象,这可以使用可用于有状态小部件的setState ()函数来完成。setState () 设置状态对象的属性,进而触发对 UI 的更新。但是这种技术有其自身的缺点。

6.Dart 中“var”和“dynamic”类型的区别?

dynamic是所有 Dart 对象的基础类型。在大多数情况下,您不需要明确使用它。

var是一个关键字,意思是“我不在乎说明这里的类型是什么。” Dart 将用初始化器类型替换var关键字,如果没有初始化器,则默认情况下保持动态

如果您希望变量赋值在其生命周期内发生变化,请使用var

var msg = "Hello world.";
msg = "Hello world again.";

如果您希望变量赋值在其生命周期内保持不变,请使用final

final msg = "Hello world.";

使用final(自由地)将帮助您发现您无意中更改了变量赋值的情况。

请注意,在对象方面,finalconst之间存在细微差别。 final不一定使对象本身不可变,而const则:

// can add/remove from this list, but cannot assign a new list to fruit.
final fruit = ["apple", "pear", "orange"];
fruit.add("grape");

// cannot mutate the list or assign a new list to cars.
final cars = const ["Honda", "Toyota", "Ford"];

// const requires a constant assignment, whereas final will accept both:
const names = const ["John", "Jane", "Jack"];

DartPad 中试试这个:

void main() {
  dynamic x = 'hal';
  x = 123;
  print(x);
  var a = 'hal';
  a = 123;
  print(a);
}

dynamic:可以改变变量的类型,&可以在代码后面改变变量的值。

var: 不能改变变量的TYPE,但可以在代码后面改变变量的VALUE。

final: 不能改变变量的类型,&不能在代码后面改变变量的值。

dynamic v = 123;   // v is of type int.
v = 456;           // changing value of v from 123 to 456.
v = 'abc';         // changing type of v from int to String.

var v = 123;       // v is of type int.
v = 456;           // changing value of v from 123 to 456.
v = 'abc';         // ERROR: can't change type of v from int to String.

final v = 123;       // v is of type int.
v = 456;           // ERROR: can't change value of v from 123 to 456.
v = 'abc';         // ERRO

7.Dart 支持命名可选参数和位置可选参数。两者之间有什么区别?

Dart 有两种类型的可选参数:namedpositional。在我讨论差异之前,让我先讨论相似之处。

Dart 的可选参数是可选的,因为调用者在调用函数时不需要为参数指定值。

可选参数只能在任何必需参数之后声明。

可选参数可以有一个默认值,在调用者没有指定值时使用。

位置可选参数

包裹的参数[ ]是一个位置可选参数。下面是一个例子:

getHttpUrl(String server, String path, [int port=80]) {
  // ...
}

在上面的代码中,port是可选的,默认值为80

您可以getHttpUrl使用或不使用第三个参数进行调用。

getHttpUrl('example.com', '/index.html', 8080); // port == 8080
getHttpUrl('example.com', '/index.html');       // port == 80

您可以为一个函数指定多个位置参数:

getHttpUrl(String server, String path, [int port=80, int numRetries=3]) {
  // ...
}

可选参数是位置参数,port如果要指定numRetries.

getHttpUrl('example.com', '/index.html');
getHttpUrl('example.com', '/index.html', 8080);
getHttpUrl('example.com', '/index.html', 8080, 5);

当然,除非您应该知道 8080 和 5 是什么,否则很难说出那些看似神奇的数字是什么。您可以使用命名的可选参数来创建更具可读性的 API。

命名的可选参数

包装的参数{ }是一个命名的可选参数。下面是一个例子:

getHttpUrl(String server, String path, {int port = 80}) {
  // ...
}

您可以getHttpUrl使用或不使用第三个参数进行调用。你必须调用函数时使用的参数名称。

getHttpUrl('example.com', '/index.html', port: 8080); // port == 8080
getHttpUrl('example.com', '/index.html');             // port == 80

您可以为一个函数指定多个命名参数:

getHttpUrl(String server, String path, {int port = 80, int numRetries = 3}) {
  // ...
}

因为命名参数是按名称引用的,所以它们的使用顺序可以不同于它们的声明。

getHttpUrl('example.com', '/index.html');
getHttpUrl('example.com', '/index.html', port: 8080);
getHttpUrl('example.com', '/index.html', port: 8080, numRetries: 5);
getHttpUrl('example.com', '/index.html', numRetries: 5, port: 8080);
getHttpUrl('example.com', '/index.html', numRetries: 5);

我相信命名参数使调用站点更易于理解,尤其是当有布尔标志或上下文外的数字时。

检查是否提供了可选参数

不幸的是,您无法区分“未提供可选参数”和“已为可选参数提供默认值”的情况。

注意:您可以使用位置可选参数命名可选参数,但不能在同一函数或方法中同时使用。不允许出现以下情况。

thisFunctionWontWork(String foo, [String positonal], {String named}) {
  // will not work!
}