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