Дротик: ошибка: сеттер не найден (при определении конструктора класса) - PullRequest
0 голосов
/ 11 июля 2019

Я получаю следующую ошибку с этим очень простым конструктором:

class MyHomePage extends StatefulWidget {
  MyHomePage(String title, String lang, {Key key}) {
    this.title = title;
    this.lang = lang.substring(0,2).toLowerCase();
    super(key: key);
  }


  final String title;
  final String lang;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

Сообщение об ошибке:

Compiler message:                                                       
lib/main.dart:34:10: Error: Setter not found: 'title'.                  
    this.title = title;                                                 
         ^^^^^                                                          
lib/main.dart:35:10: Error: Setter not found: 'lang'.                   
    this.lang = lang.substring(0,2).toLowerCase();                      
         ^^^^                                                           
lib/main.dart:36:5: Error: Can't use 'super' as an expression.          
To delegate a constructor to a super constructor, put the super call as an initializer.
    super(key: key);                                                    
    ^                                                                   
lib/main.dart:34:10: Error: The setter 'title' isn't defined for the class 'MyHomePage

Почему это? Я не понимаю, что это значит. Есть ли исчерпывающее объяснение того, как определять конструкторы в дротике? Я не смог найти его на сайте dart.dev.

Edit: После редактирования кода следующее:

class MyHomePage extends StatefulWidget {
  MyHomePage(String title, String lang, {Key key}) {
    title = title;
    lang = lang.substring(0,2).toLowerCase();
    super(key: key);
  }

  final String title;
  final String lang;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

У меня есть следующие жалобы от компилятора:

Compiler message:                                                       
lib/main.dart:36:5: Error: Can't use 'super' as an expression.          
To delegate a constructor to a super constructor, put the super call as an initializer.
    super(key: key);                                                    
    ^                                                                   
lib/main.dart:39:16: Error: Final field 'title' is not initialized.     
Try to initialize the field in the declaration or in every constructor. 
  final String title;                                                   
               ^^^^^                                                    
lib/main.dart:40:16: Error: Final field 'lang' is not initialized.      
Try to initialize the field in the declaration or in every constructor. 
  final String lang;     

1 Ответ

0 голосов
/ 11 июля 2019

Существует специальный синтаксис для инициализации final переменных в конструкторе, ответ здесь:

https://stackoverflow.com/a/42864979/64435

Используя этот синтаксис, рабочий код:

class MyHomePage extends StatefulWidget {
  MyHomePage(String title, String lang, {Key key})
      : this.title = title,
        this.lang = lang.substring(0, 2).toLowerCase(),
        super(key: key);

  final String title;
  final String lang;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}
...