我有一个包含6个字段的表格。我试图在按下按钮后将数据发送到服务器。但是按下按钮后出现错误: FormatException:输入的意外结束(在字符2)^ 。有一些数字字段和一些普通的文本字段。不明白为什么会发生此错误。请帮忙。提前致谢。这是我的飞镖代码:
Future<SubmitData> userData(
String uid,
String saleAmount,
String quantity,
String rate,
String brokerName,
String partyName,
String amountReceivable) async {
Map<String, dynamic> map = {
'uid': uid,
'saleAmount': saleAmount,
'quantity': quantity,
'rate': rate,
'brokerName': brokerName,
'partyName': partyName,
'amountReceivable': amountReceivable
};
final http.Response response = await http.post(
'my php page',
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
body: jsonEncode(map),
);
if (response.statusCode == 201 || response.statusCode == 200) {
return SubmitData.fromJson(json.decode(response.body));
} else {
throw Exception('Failed to submit.');
}
}
class SubmitData {
final String type;
SubmitData({this.type});
factory SubmitData.fromJson(Map<String, dynamic> json) {
return SubmitData(type: json['type']);
}
}
class UserForm extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return _UserForm();
}
}
class _UserForm extends State<UserForm> {
final _formKey = GlobalKey<FormState>();
final uid = TextEditingController();
final myController = TextEditingController();
final myController2 = TextEditingController();
final myController3 = TextEditingController();
final myController4 = TextEditingController();
final myController5 = TextEditingController();
final 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) {
return Form(
key: _formKey,
child: (_futureSubmitData == null)
? Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Visibility(
visible: false,
child: TextFormField(
controller: uid,
initialValue: '1',
),
),
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.all(10.0),
child: RaisedButton(
color: Colors.purple[400],
textColor: Colors.white,
onPressed: () {
if (_formKey.currentState.validate()) {
setState(() {
_futureSubmitData = userData(
uid.text,
myController.text,
myController2.text,
myController3.text,
myController4.text,
myController5.text,
myController6.text);
});
}
},
child: Text('Submit', style: TextStyle(fontSize: 18.0)),
),
),
],
)
: 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.'),
);
},
);
return Text('.');
} else {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
content: Text(
'Data not submitted. You have already submitted for today.'),
);
},
);
return Text('.');
}
} else if (snapshot.hasError) {
return Text("${snapshot.error}");
}
return Center(child: CircularProgressIndicator());
},
),
);
}
}
答案 0 :(得分:0)
为此找到了解决方案。该值未从
中检索Visibility(
visible: false,
child: TextFormField(
controller: uid,
initialValue: '1'
),
)
所以String uid的值为null,这就是发生错误的原因。
我必须删除initialValue:'1'并替换
final uid = TextEditingController();
使用
final uid = TextEditingController(text: "1");