我已经使用widget.storage.readCounter()函数将值存储在initState()的Documents目录中。我想获取该值并存储在TextEditingController中作为初始值。但是我无法从initState()块中获取值。如何从initState()块中获取值?这是我的完整代码:
class _UserForm extends State<UserForm> {
TextEditingController uid;
static String userid;
@override
void initState() {
super.initState();
widget.storage.readCounter().then((int value) {
userid = value.toString();
/*setState(() => {
userid = value.toString(),
});*/
});
uid = TextEditingController(text: userid);
}
final _formKey = GlobalKey<FormState>();
//TextEditingController uid = TextEditingController(text: userid);
final TextEditingController myController = TextEditingController();
final TextEditingController myController2 = TextEditingController();
final TextEditingController myController3 = TextEditingController();
final TextEditingController myController4 = TextEditingController();
final TextEditingController myController5 = TextEditingController();
final TextEditingController myController6 = TextEditingController();
@override
void dispose() {
// Clean up the controller when the widget is disposed.
uid.dispose();
myController.dispose();
myController2.dispose();
myController3.dispose();
myController4.dispose();
myController5.dispose();
myController6.dispose();
super.dispose();
}
Future<SubmitData> _futureSubmitData;
@override
Widget build(BuildContext context) {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
content: Text('uid:' + uid.text),
);
},
);
return Form(
key: _formKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Column(
children: <Widget>[
/*Visibility(
visible: false,
child: TextFormField(
controller: uid,
),
),*/
TextFormField(
controller: myController,
keyboardType: TextInputType.numberWithOptions(decimal: true),
decoration:
InputDecoration(hintText: 'Sale amount as per party'),
validator: (value) {
if (value.isEmpty) {
return 'Please enter amount.';
}
return null;
},
),
TextFormField(
controller: myController2,
keyboardType: TextInputType.number,
decoration: InputDecoration(hintText: 'Item quantity'),
validator: (value) {
if (value.isEmpty) {
return 'Please enter quantity.';
}
return null;
},
),
TextFormField(
controller: myController3,
keyboardType: TextInputType.numberWithOptions(decimal: true),
decoration: InputDecoration(hintText: 'Rate'),
validator: (value) {
if (value.isEmpty) {
return 'Please enter rate.';
}
return null;
},
),
TextFormField(
controller: myController4,
decoration: InputDecoration(hintText: 'Broker name'),
validator: (value) {
if (value.isEmpty) {
return 'Please enter broker name.';
}
return null;
},
),
TextFormField(
controller: myController5,
decoration: InputDecoration(hintText: 'Party name'),
validator: (value) {
if (value.isEmpty) {
return 'Please enter party name.';
}
return null;
},
),
TextFormField(
controller: myController6,
keyboardType: TextInputType.numberWithOptions(decimal: true),
decoration: InputDecoration(
hintText: 'Amount receivable as per party'),
validator: (value) {
if (value.isEmpty) {
return 'Please enter amount.';
}
return null;
},
),
Container(
margin: EdgeInsets.only(top: 10),
child: RaisedButton(
color: Colors.purple[400],
padding: EdgeInsets.only(
left: 110, top: 10, right: 110, bottom: 10),
textColor: Colors.white,
onPressed: () {
if (_formKey.currentState.validate()) {
setState(() {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
content: Text('uid:' + uid.text),
);
},
);
/*_futureSubmitData = userData(
uid.text,
myController.text,
myController2.text,
myController3.text,
myController4.text,
myController5.text,
myController6.text);*/
});
Scaffold.of(context).removeCurrentSnackBar();
}
},
child: Text('Submit', style: TextStyle(fontSize: 18.0)),
),
),
],
),
(_futureSubmitData != null)
? FutureBuilder<SubmitData>(
future: _futureSubmitData,
builder: (context, snapshot) {
if (snapshot.hasData) {
if (snapshot.data.type == '1') {
/*showDialog(
context: context,
builder: (context) {
return AlertDialog(
content: Text('Data submitted successfully.'),
);
},
);*/
Scaffold.of(context)
..removeCurrentSnackBar()
..showSnackBar(SnackBar(
content: Text('Data submitted successfully.',
style:
TextStyle(color: Colors.green[100]))));
return Text('');
} else {
Scaffold.of(context)
..removeCurrentSnackBar()
..showSnackBar(SnackBar(
content: Text(
'Data not submitted. You have already submitted for today.',
style: TextStyle(color: Colors.red[100]))));
return Text('');
}
} else if (snapshot.hasError) {
return Text("${snapshot.error}");
}
return Center(child: CircularProgressIndicator());
},
)
: Text(''),
],
));
}
}
但是我在initState()中得到了userid的值。但是,当我在initState()块之后的 Widget build(BuildContext context)中的showDialog()中打印值时,它给出了空白值。我的问题是如何在 Widget build(BuildContext context)块中获取uid的值?
答案 0 :(得分:0)
我可能是错的( 编辑: 我错了。),但是我相信您的问题是“技术上”您没有分配变量的值 inside initState方法,但在回调中。
您可以做的是这样重写回调:
@override
void initState() {
super.initState();
widget.storage.readCounter().then((int value) {
setState( () => {
userid = value.toString();
});
});
}
答案 1 :(得分:0)
首先在状态类的initState之外初始化TextController和userid变量
TextEditingController uid;
String userid;
@override
void initState() {
super.initState();
widget.storage.readCounter().then((int value) {
userid = value.toString();
uid = TextEditingController(text: userid);
});
print(userid); // This is to make sure you're actually getting a value back. Check your console.
}
您现在应该可以通过TextEditingController访问“ userid”的值了。