加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

dart – 错误:在初始化程序中只能访问静态成员,这是什么意思?

发布时间:2020-12-14 14:57:52 所属栏目:百科 来源:网络整理
导读:我有类似的东西.我很难理解这个错误. 为什么在这里访问filterController会出现此错误?但是如果我在构建方法中移动当前的整个TextFormField创建(在注释A和B之间),它不会出现此错误?如何在构建方法中移动整个TextFormField使filterController成为静态然后解
我有类似的东西.我很难理解这个错误.
为什么在这里访问filterController会出现此错误?但是如果我在构建方法中移动当前的整个TextFormField创建(在注释A和B之间),它不会出现此错误?如何在构建方法中移动整个TextFormField使filterController成为静态然后解决此问题?

class AppHomeState extends State<AppHome> with SingleTickerProviderStateMixin
{

    TabController _tabController;
    final filterController = new TextEditingController(text: "Search");
        //----A
        TextFormField email = new TextFormField(
        keyboardType: TextInputType.emailAddress,controller: filterController,------>ERROR : Error: Only static members can be accessed in initializers
        );
       //----B

  @override
    Widget build(BuildContext context)
    {
        return new Scaffold(
                appBar: new AppBar(..),);
    }
}

我该如何解决这个问题?

解决方法

class AppHomeState extends State<AppHome> with SingleTickerProviderStateMixin {

    TabController _tabController;
    final filterController = new TextEditingController(text: "Search");
    TextFormField email = ...

…是一个初始化程序,此时无法访问它.
初始化器在构造函数之前执行,但只有在完成对超级构造函数(在您的示例中隐式)的调用之后才允许访问它.
因此,只有在构造函数体(或更高版本)中才允许访问它.

这就是您收到错误消息的原因:

controller: filterController,

访问this.filterController(如果你不明确地写它,这是隐式的).

要解决您的问题(假设电子邮件需要最终),您可以使用工厂构造函数和构造函数初始化列表:

class AppHomeState extends State<AppHome> with SingleTickerProviderStateMixin {
  factory SingleTickerProviderStateMixin() => 
      new SingleTickerProviderStateMixin._(new TextEditingController(text: "Search"));

  SingleTickerProviderStateMixin._(TextEditingController textEditingController) : 
      this.filterController = textEditingController,this.email = new TextFormField(
        keyboardType: TextInputType.emailAddress,controller: textEditingController);

  TabController _tabController;
  final filterController;
  final TextFormField email;

或者当电子邮件字段不需要是最终电子邮件时,可以在构造函数初始化列表中初始化:

class AppHomeState extends State<AppHome> with SingleTickerProviderStateMixin {

  SingleTickerProviderStateMixin() {
    email = new TextFormField(
        keyboardType: TextInputType.emailAddress,);
  }

  TabController _tabController;
  final filterController = new TextEditingController(text: "Search");
  TextFormField email;

但是在Flutter小部件中,initState通常用于此

class AppHomeState extends State<AppHome> with SingleTickerProviderStateMixin {

  @override
  void initState() {
    super.initState();
    email = new TextFormField(
        keyboardType: TextInputType.emailAddress,);
  }

  TabController _tabController;
  final filterController = new TextEditingController(text: "Search");
  TextFormField email;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读