无法在初始值设定项中访问实例成员"params"


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

错误报告--";无法在初始值设定项中访问实例成员"params">

我是编程新手,这是从小部件直接调用的。我检查了LevelUp地图,里面有内容。当我试图将param值分配给myTest时,会发生错误。不管我是把键放在引号里还是提供一个整数。

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

此外,我认为你不应该在[comLevel]之前有月经。

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

LevelUp() {
myTest = params[comLevel];
}
}

空安全更新:

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

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

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

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

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

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

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


右侧:

final A _a = A();
late final B _b;
AppointmentRepository() {
_b = B(_a);
}

#100%工作解决方案:Juts放置变量myTest = params.[comLevel];在您的Build方法下面。

例如。

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

Widget build(BuildContext context) {
var myTest = params.[comLevel];
}
}

对我来说,发生这种情况是因为我试图访问一个类实例(比方说a类(的属性,并使用该属性初始化另一个类(B类(,该属性是整数,已定义

然而,由于我没有从";A类";我可以访问那些属于它的财产!我试图在";构建";方法,使得一个对象是";创建/建造";它成功了!

不能使用实例成员作为类中变量的初始化。如果可以使成员为静态,这是解决问题的最简单、最安全的方法。它也在Dart文档中介绍:链接

解决方案:

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

我也得到了类似的错误。我找到了如下的解决方案。

我的第一个代码:

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

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

另一个解决方案是使您的变量成为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的GetX状态管理教程https://www.youtube.com/watch?v=ZnevdXDH25Q&ab_channel=CodeX

只携带

var myTest = params.[comLevel];

进入下面的Widget内部版本{}。

像这样:

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

Widget build(BuildContext context) {
var myTest = params.[comLevel];
}
}

最新更新