【问题标题】:The instance member 'params' can't be accessed in an initializer无法在初始化程序中访问实例成员“params”
【发布时间】:2020-12-12 00:22:45
【问题描述】:
class LevelUp extends GetxController {
  Map<String, String> params = Get.arguments;

  var myTest = params.[comLevel];
}

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

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

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

    另外,我认为您不应该在[comLevel] 之前有句号。

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

    【讨论】:

    • 在将初始化移动到构造函数时,我在无状态小部件中收到可变性警告。
    【解决方案2】:

    虽然对于 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 方法,初始化它outside 方法:

    class _CategoryScrollView extends State<CategoryScrollView> {
    
      int selectedCategory;
    
      void initState() {
        selectedCategory = widget.defaultSelection;
        super.initState();
      }
    

    【讨论】:

      【解决方案3】:

      在零安全之前:

      在类被实例化之前你不能访问实例成员(除非他们被声明为static),因此下面的代码有错误。

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

      Null 安全之后:

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

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

      【讨论】:

      • 在延迟初始化中添加 late 关键字对我有帮助。感谢您的洞察力。
      【解决方案4】:

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

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

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

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


      右:

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

      【讨论】:

        【解决方案5】:

        随身携带

        var myTest = params.[comLevel];
        

        进入 Widget build{} 下方。

        【讨论】:

          猜你喜欢
          • 2022-11-13
          • 2021-01-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-16
          • 2022-01-15
          相关资源
          最近更新 更多