Dart 错误:在初始值设定项中只能访问静态成员这意味着什么?

Dart 错误:在初始值设定项中只能访问静态成员这意味着什么?,dart,flutter,Dart,Flutter,我有这样的东西。我很难理解这个错误。 为什么在这里访问filterController会在这里出现此错误,但是如果我将当前整个TextFormField创建(在注释A和B之间)移动到build方法中,它不会出现此错误?在build方法中移动整个TextFormField如何使filterController保持静态并解决此问题 class AppHomeState extends State<AppHome> with SingleTickerProviderStateMixin {

我有这样的东西。我很难理解这个错误。 为什么在这里访问
filterController
会在这里出现此错误,但是如果我将当前整个
TextFormField
创建(在注释A和B之间)移动到build方法中,它不会出现此错误?在build方法中移动整个
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(..),
        );
    }
}
类AppHomeState使用SingleTickerProviderStateMixin扩展状态
{
TabController\u TabController;
最终过滤器控制器=新文本编辑控制器(文本:“搜索”);
//----A
TextFormField email=新建TextFormField(
键盘类型:TextInputType.emailAddress,
控制器:filterController,------->错误:错误:在初始值设定项中只能访问静态成员
);
//----B
@凌驾
小部件构建(构建上下文)
{
归还新脚手架(
appBar:新的appBar(…),
);
}
}

如何解决此问题?

您可以将此变量转换为函数,并且可以在此函数参数中获取上下文

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(..),
        );
    }
}
范例

Widget myDialog (BuildContext context) {
  return new Scaffold(
    backgroundColor: Colors.white,
    body: new Center(
      child: new Column(
        children: <Widget>[
          new Text("Invalid Username/Password"),
          new Text("Please verify your login credentials"),
          new RaisedButton(
            child: new Text("Ok"),
            onPressed:() {
              Navigator.pop(context);//Error : Only static members can be accessed in initializers
            }
          ),
        ],
      ),
    )
  );
}

// Using if you are doing in a class
this.myDialog(context);

// Using if you are using a global function
myDialog(context);
Widget myDialog(构建上下文){
归还新脚手架(
背景颜色:Colors.white,
正文:新中心(
子:新列(
儿童:[
新文本(“无效用户名/密码”),
新文本(“请验证您的登录凭据”),
新升起的按钮(
子项:新文本(“确定”),
已按下:(){
Navigator.pop(context);//错误:在初始值设定项中只能访问静态成员
}
),
],
),
)
);
}
//如果你在课堂上做什么,请使用
这个.myDialog(上下文);
//使用全局函数时使用
myDialog(上下文);
但是,我认为您希望显示一条错误消息。因此,您可以通过对话框而不是页面来完成。它更有效,因为您可以使用按钮或消息指定对话框,并且可以在任何地方使用此错误对话框。让我们看一下显示错误消息的全局帮助函数

void showError(BuildContext context, String error) {
  showSnackBar(
    context,
    new Text(
      'Error',
      style: new TextStyle(color: Theme.of(context).errorColor),
    ),
    content: new SingleChildScrollView(
      child: new Text(error)
    ),
    actions: <Widget>[
      new FlatButton(
        child: new Text(
          'Ok',
          style: new TextStyle(
            color: Colors.white
          ),
        ),
        onPressed: () {
          Navigator.of(context).pop();
        },
        color: Theme.of(context).errorColor,
      ),
    ]
  );
}

// Using in everywhere
showError(context, 'Sample Error');
void-showError(BuildContext上下文,字符串错误){
showSnackBar(
上下文
新文本(
“错误”,
样式:新的文本样式(颜色:Theme.of(context.errorColor)),
),
内容:新建SingleChildScrollView(
子项:新文本(错误)
),
行动:[
新扁平按钮(
儿童:新文本(
“好的”,
样式:新文本样式(
颜色:颜色。白色
),
),
已按下:(){
Navigator.of(context.pop();
},
颜色:主题.of(上下文).errorColor,
),
]
);
}
//无处不在
淋浴ROR(上下文“样本错误”);
访问
this.filterController
this
如果不显式编写,则为隐式)

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

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,
        controller: filterController,
    );
  }

  TabController _tabController;
  final filterController = new TextEditingController(text: "Search");
  TextFormField email;
但是在flatterwidgets中,通常使用
initState

class AppHomeState extends State<AppHome> with SingleTickerProviderStateMixin {

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

  TabController _tabController;
  final filterController = new TextEditingController(text: "Search");
  TextFormField email; 
类AppHomeState使用SingleTickerProviderStateMixin扩展状态{
@凌驾
void initState(){
super.initState();
email=newtextformfield(
键盘类型:TextInputType.emailAddress,
控制器:过滤器控制器,
);
}
TabController\u TabController;
最终过滤器控制器=新文本编辑控制器(文本:“搜索”);
TextFormField电子邮件;

您可以将其作为一种方法:

Widget getEmailController(){
return new TextFormField(
        keyboardType: TextInputType.emailAddress,
        controller: filterController,
        );
}
并在UI中使用它:

body: Container(
child: getEmailController();
)

我也遇到了同样的问题,我可以通过将需要的值添加到控制器的文本中来设置TextFormField的初始值来解决这个问题,例如:

_carPlateController.text = _initValues['carPlate'];


我希望这能有所帮助!因为这是一个使用控制器时非常简单的解决方案。

您可以这样做:首先声明,然后在didChangeDependencies()方法中初始化,如下所示

声明了您的变量

List<Tab> tabsList = [];
完整代码示例

class _MyClassState extends State<MyClass>
    with TickerProviderStateMixin<MyClass> {

  TabController tabController;
  List<Tab> tabsList = [];

  @override
  void didChangeDependencies() {
    tabsList = [
      Tab(text: getTranslated(context, "tab_1")),
      Tab(text: getTranslated(context, "tab_2")),
      Tab(text: getTranslated(context, "tab_3"))
    ];
    tabController =
        TabController(length: tabsList.length, vsync: this, initialIndex: 0);

    super.didChangeDependencies();
  }
}
class\u MyClassState扩展状态
使用TickerProviderStateMixin{
TabController TabController;
列表选项卡列表=[];
@凌驾
void didChangeDependencies(){
选项卡列表=[
制表符(文本:getTranslated(上下文,“制表符1”),
制表符(文本:getTranslated(上下文,“制表符2”),
制表符(文本:getTranslated(上下文,“制表符3”))
];
选项卡控制器=
TabController(长度:tabsList.length,vsync:this,initialIndex:0);
super.didChangeDependencies();
}
}

我认为我们需要更多的上下文(哈哈)来正确回答这个问题。重要的部分是您在哪里定义了这段代码。根据您描述的错误(
错误:只有静态成员可以在初始值设定项中访问
),它在类的构造函数中。在Flatter中,你不应该真正在构造函数中构建任何东西。因此,如果你可以发布整个类,那肯定会帮助我们帮助你!很高兴他的答案有帮助,但我认为这不是一个特别正确的答案,因为它没有解决问题的原因,也没有引导你远离makin如果你简单地用函数调用来替换变量,我希望你得到同样的错误。如果他被编辑,建议你调用他在构建函数中定义的函数,而不是在构造函数中显示的,你会做的,那么我会认为它是一个更正确的答案。ly@rmtmckenzie看了这些之后,看起来这不是我想要的,因为它不能解决问题。好的。请编辑你的问题,将整个班级都包括在内。这样我或其他人就可以更好地帮助你了。@Anilcan我认为这对解决他问题的根本原因没有帮助(这可能是他在他的cla的构造函数中做的
List<Tab> tabsList = [];
 tabsList = [
    Tab(text: getTranslated(context, "tab_1")),
    Tab(text: getTranslated(context, "tab_2")),
    Tab(text: getTranslated(context, "tab_3"))
 ];
class _MyClassState extends State<MyClass>
    with TickerProviderStateMixin<MyClass> {

  TabController tabController;
  List<Tab> tabsList = [];

  @override
  void didChangeDependencies() {
    tabsList = [
      Tab(text: getTranslated(context, "tab_1")),
      Tab(text: getTranslated(context, "tab_2")),
      Tab(text: getTranslated(context, "tab_3"))
    ];
    tabController =
        TabController(length: tabsList.length, vsync: this, initialIndex: 0);

    super.didChangeDependencies();
  }
}