initState() 中的变量未初始化
Variables in initState() not initialized
class RoutePage extends StatefulWidget {
final LatLng? pickUp;
final LatLng? dropOff;
RoutePage({required this.pickUp, required this.dropOff});
@override
_RoutePage createState() => _RoutePage();
}
class _RoutePage extends State<RoutePage> {
Set<Marker> _markers = {};
LatLng _origin;
LatLng _destination;
void initState() {
super.initState();
final _origin = widget.pickUp;
final _destination = widget.dropOff;
}
@override
Widget build(BuildContext context) {
...
}
在我的代码中,尽管我已经在 initState() 中初始化了 _origin 和 _destination,但我仍然收到错误消息“必须初始化不可为空的实例字段‘_origin’。”添加晚了也不行。。。我也试过添加setState,但是还是不行。
这些变量未初始化,因为您正在 initState()
函数中重新创建它们:
void initState() {
super.initState();
final _origin = widget.pickUp; // <-- Recreating _origin here
final _destination = widget.dropOff; // <-- Recreating _destination here
}
在 Dart 中允许有同名的变量,因为在函数内部你有不同的作用域。因此,您在这里不会出错,但由于您使用的是 final
关键字,因此您正在重新创建这些变量。要解决此问题,请不要在 initState()
函数中使用 final:
void initState() {
super.initState();
_origin = widget.pickUp; // <-- Assigning a value to _origin here
_destination = widget.dropOff; // <-- Assigning a value to _destination here
}
pickUp, dropOff
变量类型为 LatLng?
那么您正尝试将其分配给另一个变量类型 LatLng
- 在
initState
中,您又在创建变量。
更新代码(以上内容在下面的代码中更新):
class RoutePage extends StatefulWidget {
final LatLng? pickUp;
final LatLng? dropOff;
RoutePage({required this.pickUp, required this.dropOff});
@override
_RoutePage createState() => _RoutePage();
}
class _RoutePage extends State<RoutePage> {
Set<Marker> _markers = {};
LatLng? _origin;
LatLng? _destination;
@override
void initState() {
super.initState();
_origin = widget.pickUp;
_destination = widget.dropOff;
}
@override
Widget build(BuildContext context) {
return Container();
}
}
final 属性通过命名构造函数参数或在声明时分配,而不是在 initState 方法中分配。
您可以像这样通过命名的构造函数参数初始化它们:
class RoutePage extends StatefulWidget {
final LatLng? pickUp;
final LatLng? dropOff;
RoutePage({required this.pickUp, required this.dropOff});
@override
_RoutePage createState() => _RoutePage(origin: pickUp, destination: dropOff);
}
class _RoutePage extends State<RoutePage> {
Set<Marker> _markers = {};
final LatLng? origin;
final LatLng? destination;
_RoutePage({ this.origin, this.destination });
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
// ...
}
}
或者根本不将它们设置为 final,然后您可以通过 initState 分配它们。我的两分钱。
class RoutePage extends StatefulWidget {
final LatLng? pickUp;
final LatLng? dropOff;
RoutePage({required this.pickUp, required this.dropOff});
@override
_RoutePage createState() => _RoutePage();
}
class _RoutePage extends State<RoutePage> {
Set<Marker> _markers = {};
LatLng _origin;
LatLng _destination;
void initState() {
super.initState();
final _origin = widget.pickUp;
final _destination = widget.dropOff;
}
@override
Widget build(BuildContext context) {
...
}
在我的代码中,尽管我已经在 initState() 中初始化了 _origin 和 _destination,但我仍然收到错误消息“必须初始化不可为空的实例字段‘_origin’。”添加晚了也不行。。。我也试过添加setState,但是还是不行。
这些变量未初始化,因为您正在 initState()
函数中重新创建它们:
void initState() {
super.initState();
final _origin = widget.pickUp; // <-- Recreating _origin here
final _destination = widget.dropOff; // <-- Recreating _destination here
}
在 Dart 中允许有同名的变量,因为在函数内部你有不同的作用域。因此,您在这里不会出错,但由于您使用的是 final
关键字,因此您正在重新创建这些变量。要解决此问题,请不要在 initState()
函数中使用 final:
void initState() {
super.initState();
_origin = widget.pickUp; // <-- Assigning a value to _origin here
_destination = widget.dropOff; // <-- Assigning a value to _destination here
}
pickUp, dropOff
变量类型为LatLng?
那么您正尝试将其分配给另一个变量类型LatLng
- 在
initState
中,您又在创建变量。
更新代码(以上内容在下面的代码中更新):
class RoutePage extends StatefulWidget {
final LatLng? pickUp;
final LatLng? dropOff;
RoutePage({required this.pickUp, required this.dropOff});
@override
_RoutePage createState() => _RoutePage();
}
class _RoutePage extends State<RoutePage> {
Set<Marker> _markers = {};
LatLng? _origin;
LatLng? _destination;
@override
void initState() {
super.initState();
_origin = widget.pickUp;
_destination = widget.dropOff;
}
@override
Widget build(BuildContext context) {
return Container();
}
}
final 属性通过命名构造函数参数或在声明时分配,而不是在 initState 方法中分配。
您可以像这样通过命名的构造函数参数初始化它们:
class RoutePage extends StatefulWidget {
final LatLng? pickUp;
final LatLng? dropOff;
RoutePage({required this.pickUp, required this.dropOff});
@override
_RoutePage createState() => _RoutePage(origin: pickUp, destination: dropOff);
}
class _RoutePage extends State<RoutePage> {
Set<Marker> _markers = {};
final LatLng? origin;
final LatLng? destination;
_RoutePage({ this.origin, this.destination });
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
// ...
}
}
或者根本不将它们设置为 final,然后您可以通过 initState 分配它们。我的两分钱。