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 
}
  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();
  }
}

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 分配它们。我的两分钱。