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,但我仍然会收到错误消息";必须初始化不可为null的实例字段"_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 
}

最终属性通过命名构造函数参数或在声明中分配,而不是在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) {
// ... 
}
}

或者根本不将它们设置为最终值,然后可以通过initState分配它们。我的2美分。

  1. pickUp, dropOff变量类型为LatLng?,然后尝试将另一个变量类型分配为LatLng
  2. 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();
}
}

最新更新