flutter 无法在初始值设定项中访问示例成员“params”

ryevplcw  于 2023-01-14  发布在  Flutter
关注(0)|答案(9)|浏览(165)
class LevelUp extends GetxController {
  Map<String, String> params = Get.arguments;

  var myTest = params.[comLevel];
}

错误报告--“示例成员'params'不能在初始化器中访问。”我是编程新手,这是直接从一个小部件调用的。我检查了LevelUpMap,它有内容。错误发生在我试图将param值赋给myTest的地方。如果我将键放在引号中或提供一个整数,这并不重要。任何建议都将非常感谢。

hpcdzsge

hpcdzsge1#

初始化对象之前无法访问params。若要修复您的示例,请将myTest初始化移到构造函数中。
另外,我不认为你应该在[comLevel]之前有一个时期。

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

vu8f3i0k2#

空安全性更新:

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

class Test {
  int foo = 0;
  late int bar = foo; // No error
}
b0zn9rqh

b0zn9rqh3#

虽然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赋值给initState方法***内部的defaultSelection,并在方法***外部初始化它:

class _CategoryScrollView extends State<CategoryScrollView> {

  int selectedCategory;

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

roqulrg34#

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

WRONG(初始值设定项的编译时错误):

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

显示错误:无法在初始值设定项中访问示例成员“_a”。

右:

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

  AppointmentRepository() {
    _b = B(_a);
  }
btqmn9zl

btqmn9zl5#

100%工作溶液:将var myTest = params.[comLevel];放在构建方法下面。

例如

class LevelUp extends GetxController {
   Map<String, String> params = Get.arguments;
    
   Widget build(BuildContext context) {
  var myTest = params.[comLevel];
}
}
ou6hu8tu

ou6hu8tu6#

对我来说,它发生了,因为我试图访问一个类示例的属性(假设类A),并使用此属性初始化另一个类(类B),该属性是整数,并已定义
然而,由于我没有从“类A”对象,我可以访问这些属性属于它!我试图在“构建”方法中使用此属性,使对象“创建/构建”,它的工作!

p3rjfoxz

p3rjfoxz7#

我也得到了类似的错误。我找到了解决办法如下。
我的第一个代码:

final BuildContext mycontext = GlobalContextClass.navigatorKey.currentContext;
final PsValueHolder psValueHolder = Provider.of<PsValueHolder>(mycontext, listen: false);

接下来是修复错误的代码:

final PsValueHolder psValueHolder = Provider.of<PsValueHolder>(GlobalContextClass.navigatorKey.currentContext, listen: false);

我没有在一行中定义2个变量,而是将第一个变量直接放在第二个变量的位置。

vbkedwbf

vbkedwbf8#

另一个解决方案是将变量设为GetX参数。

int count_myProducts = cartItems.length; //The instance member 'cartItems' can't be accessed in an initializer. (Documentation)

  int get count_myProducts => cartItems.length;

请在27:34观看此视频使用Flutter https://www.youtube.com/watch?v=ZnevdXDH25Q&ab_channel=CodeX的GetX状态管理教程

zlwx9yxi

zlwx9yxi9#

只是携带

var myTest = params.[comLevel];

到下面的小部件内部版本{}中。
像这样:

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

相关问题