颤振:文本编辑控制器 只有静态成员可以在初始值设定项错误中访问



我正在将数据从listmosque.dart传递到update_screen.dart以更新数据。 任何它都可以工作,但我想设置文本编辑控制器的默认值。

TextEditingController _txtnrp = TextEditingController(text: "${widget.nrpUpdate}"); <- this error

我收到消息Only static members can be accessed in initializers.${widget.nrpUpdate}如何解决这个问题?

这是我的update_screen.dart。

import 'package:flutter/material.dart';
class UpdateScreen extends StatefulWidget {
final String idUpdate;
final String nrpUpdate;
final String namaUpdate;
final String emailUpdate;
final String jurusanUpdate;
UpdateScreen(
{this.idUpdate,
this.nrpUpdate,
this.namaUpdate,
this.emailUpdate,
this.jurusanUpdate});
@override
_UpdateScreenState createState() => _UpdateScreenState();
}
class _UpdateScreenState extends State<UpdateScreen> {

TextEditingController _txtnrp = TextEditingController(text: "${widget.nrpUpdate}"); <- In this line error
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
leading: IconButton(
icon: Icon(Icons.arrow_left),
onPressed: () => Navigator.pop(context, false),
),
centerTitle: true,
title: Text('Update ${widget.namaUpdate}'),
),
body: Container(
child: Center(
child: SingleChildScrollView(
padding: EdgeInsets.all(20),
scrollDirection: Axis.vertical,
child: Column(
children: <Widget>[
TextField(

controller: _txtnrp,
keyboardType: TextInputType.number,
decoration: InputDecoration(hintText: "NRP"),
textAlign: TextAlign.center,
),
],
),
),
),
),
);
}
}

如何解决这个问题? 谢谢

将其移动到initState内:

class _UpdateScreenState extends State<UpdateScreen> {
TextEditingController _txtnrp;
@override
void initState() {
_txtnrp = TextEditingController(text: "${widget.nrpUpdate}");
super.initState();
}

安德烈的回答是正确的,但只是想补充一些细节:

问题确实在于您尝试在初始化之前访问State.widget,并且建议通过State.widget访问这些参数(而不是通过 State 构造函数传递(。

build()方法总是在状态更改时调用,因此将控制器设置为${widget.nrpUpdate}实际上会使文本字段在每次发生状态更改时行为异常(重置它(。因此,这是您应该在initState()中设置此值的另一个原因。例如,每次单击按钮时都会清除文本字段,即使不需要:

class _UpdateScreenState extends State<UpdateScreen> {
TextEditingController _txtnrp;
int _count = 1;
Widget GetColumn(someText) {
print(someText);
return 
}
@override
void initState() {
_txtnrp = TextEditingController(text: "${widget.nrpUpdate}");
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
leading: IconButton(
icon: Icon(Icons.arrow_left),
onPressed: () => Navigator.pop(context, false),
),
centerTitle: true,
title: Text('Update ${widget.namaUpdate}'),
),
body: Container(
child: Center(
child: SingleChildScrollView(
padding: EdgeInsets.all(20),
scrollDirection: Axis.vertical,
child: Column(
children: <Widget>[
TextField(
controller: TextEditingController(text: someText),
keyboardType: TextInputType.number,
decoration: InputDecoration(hintText: "NRP"),
textAlign: TextAlign.center,
),
FlatButton(
child: Text("Click"),
onPressed: () => setState(() {_count += 1;})
),
],
),
),
),
),
);
}
}

除此之外,您可能希望在代码变大时组织代码,将其分解为函数和变量。这样做时,您可能会遇到类似的"仅静态对象"错误。避免这种情况的一种方法是:

class _UpdateScreenState extends State<UpdateScreen> {
TextEditingController _txtnrp;
Widget getColumn(someText)
return Column(
children: <Widget>[
TextField(           
controller: _txtnrp,
keyboardType: TextInputType.number,
decoration: InputDecoration(hintText: "NRP"),
textAlign: TextAlign.center,
),
],
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: ...,
body: Container(
child: Center(
child: SingleChildScrollView(
padding: EdgeInsets.all(20),
scrollDirection: Axis.vertical,
child: GetColumn("${widget.nrpUpdate}").                 
),
),
),
),
);
@override
void initState() {
_txtnrp = TextEditingController(text: "${widget.nrpUpdate}");
super.initState();
}

最新更新