"TextEditingController titleController;" 和 "titleController = TextEditingController();" 有什么区别?

What is the difference between "TextEditingController titleController;" and "titleController = TextEditingController();"?

很抱歉,如果这是一个非常简单的问题,但对我来说仍然是一个基本问题,要了解这两行代码之间的区别是什么?:

TextEditingController titleController;

titleController = TextEditingController();

为了更清晰,我的意思是代码第一行中的 titleController 与第二行中的 titleController 之间有什么区别?

我们什么时候应该使用第一个,什么时候使用第二个?


第一个例子没有初始化,第二个例子是。对我来说,没有任何情况我会在不初始化的情况下声明 TextEditingController 。尽管您可以将空控制器传递给 TextFormField 而不会出错,但是一旦您尝试对其执行任何操作(例如添加侦听器),您就会收到“调用空值”错误.

您最好直接初始化它,然后它就可以立即运行了。

final titleController = TextEditingController();

两条线必须一起使用。让我们看看每一行代表什么:

“第一行”:

TextEditingController titleController;

只是声明了一个TextEditingController类型的变量,叫做titleController。它还没有被赋予一个值,虽然它没有收到一个值,但它的值将被认为是 null.

还有其他声明变量的方法(如声明为 dynamic,或使用 varfinalconst 等),您可以阅读Dart's Language tour 中的更多内容。我不会在这里解释它们,因为它与问题没有太大关系。

“二线”:

titleController = TextEditingController();

正在为 titleController 声明的变量赋值。给定的值是:TextEditingController(),表示来自这个 class 的对象的新实例。 如果不先执行另一行,则不能执行此行。 否则编译器将不知道名称 titleController 代表什么。

(此外,这很有意义,对吧?首先你有一个特定类型的变量,然后你给这个变量一个相同类型的值。)

所以你通常两者都做。首先声明变量,然后给它赋值。可能是因为所有关键字都与“TextEditingController”相关,所以有点混淆。这是字符串 class:

的等效示例
String a; // the first line
a = "Your String"; // the second line

这是等效的,可以在一行中完成:

String a = "Your String";
// Or, in your case:
TextEditingController titleController = TextEditingController();

这样你既可以声明变量又可以给它一个初始值。