在初始化器中无法访问实例成员“ params”

时间:2020-08-23 02:12:49

标签: flutter dart

class LevelUp extends GetxController {
  Map<String, String> params = Get.arguments;

  var myTest = params.[comLevel];
}

错误报告-“实例成员'params'无法在初始化程序中访问。”我是编程新手,可以直接从小部件中调用它。我检查了LevelUp地图,它具有内容。我尝试将参数值分配给myTest时发生错误。我将密钥放在引号中还是提供整数都没有关系。任何建议将不胜感激。

4 个答案:

答案 0 :(得分:7)

在初始化对象之前,您无法访问params。要修正示例,请将myTest初始化移到构造函数中。

此外,我认为您不应该在[comLevel]前加句点。

class LevelUp extends GetxController {
  Map<String, String> params = Get.arguments;
  String myTest;
  
  LevelUp() {
    myTest = params[comLevel];
  }
}

答案 1 :(得分:7)

尽管已针对 OP 的案例回答了此问题,但我想为在 StatefulWidget 情况下收到此错误的人提供解决方案。

考虑这样一种情况,您希望有一个可选择项目的列表来指示要显示的类别。在这种情况下,构造函数可能看起来像这样:

CategoryScrollView({
  this.categories,
  this.defaultSelection = 0,
});

final List<String> categories;
final int defaultSelection;

请注意,属性 defaultSelection 负责指定默认情况下应选择哪个类别。您可能还想跟踪初始化后选择的类别,因此我将创建 selectedCategory。我想将 selectedCategory 分配给 defaultSelection,以便默认选择生效。在 _CategoryScrollViewState 中,您不能执行以下操作:

class _CategoryScrollViewState extends State<CategoryScrollView> {

  int selectedCategory = widget.defaultSelection; // ERROR

  @override
  Widget build(BuildContext context) {
    ...
  }
}

行,int selectedCategory = widget.defaultSelection; 将不起作用,因为 defaultSelection 它尚未初始化(在其他答案中提到)。因此,引发了错误:

<块引用>

无法在初始化程序中访问实例成员“widget”。

解决办法是将selectedCategory赋值给defaultSelection inside initState 方法,对其进行初始化外部方法:

class _CategoryScrollView extends State<CategoryScrollView> {

  int selectedCategory;

  void initState() {
    selectedCategory = widget.defaultSelection;
    super.initState();
  }

答案 2 :(得分:1)

一个简单的例子,它展示了我们如何解决上述问题, 例子:创建一个类B的实例,并在它的参数中传入一个类A的实例

错误(初始化程序的编译时错误):

* def input = ' 46.8,16.600001 023,16.600035 -46.2000,16.60004 46,164 47.400044,-14.1 47.400043,13.8 47.400043,0 47.400024,-3.9  '
* def temp = input.trim().split(' ')
* match each temp == '#regex .*'

显示错误:无法在初始化程序中访问实例成员“_a”。


右:

  final A _a = A();
  final B _b = B(_a);

答案 3 :(得分:0)

在空安全之前:

在实例化类之前您无法访问实例成员(除非它们被声明为 static),因此以下代码有错误。

class Test {
  int foo = 0;
  int bar = foo; // Error
}

空值安全后:

Dart 2.12 带有 late 关键字,它可以帮助您进行延迟初始化,这意味着在使用字段 bar 之前,它将保持未初始化状态。

class Test {
  int foo = 0;
  late int bar = foo; // OK, no error
}