$扑医生
flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[√] Flutter (Channel stable, v1.5.4-hotfix.2, on Microsoft Windows [Version 6.1.7601], locale zh-CN)
[√] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
[!] Android Studio (not installed)
[√] VS Code (version 1.33.1)
[√] Connected device (1 available)
! Doctor found issues in 1 category.
使用动态数据渲染DropdownButton小部件时遇到一些麻烦,关键代码是
DropdownButton<int>(
isDense: true,
hint: Text('评分'),
value: rule[ls[n]['Id']],
onChanged: (val) {
setState(() {
rule[ls[n]['Id']] = val;
});
}
)
在那里,我使用了一个地图结构Map<String, int> rule
来接收所选的值,该值已经更改,但是未呈现ui。当我选择“很好”或其他方式时,未呈现UI,
遇到同样麻烦的人,请帮帮我。预先感谢!
[{
Name: 纪律规范,
Rule: [
{Id: 1, Name: 出勤情况, WonderfulVal: 15, FineVal: 13, BetterVal: 10, AvgVal: 8, BadVal: 6},
{Id: 2, Name: 工作积极性、主动意识, WonderfulVal: 5, FineVal: 4, BetterVal: 3, AvgVal: 2, BadVal: 1},
{Id: 3, Name: “6S”执行到位情况, WonderfulVal: 5, FineVal: 4, BetterVal: 3, AvgVal: 2, BadVal: 1},
{Id: 4, Name: 劳动纪律遵守情况, WonderfulVal: 5, FineVal: 4, BetterVal: 3, AvgVal: 2, BadVal: 1}
]
}]
我更改了onChanged事件回调按钮,该按钮无效:
onChanged: (val) {
rule[ls[n]['Id']] = val;
final r = rule;
setState(() {
rule = r;
});
}
整个代码如下:
class _MarkState extends State<MarkPage> {
GlobalKey<FormState> _formKey = GlobalKey<FormState>();
List<Widget> _dataList;
List<DropdownMenuItem> _stu;
String _stuId;
Map<String, int> rule = {};
void _onSubmit() {
final form = _formKey.currentState;
if (form.validate()) {
form.save();
ajax.post("admin/d", {'StuId': _stuId, 'Rule': rule}).then((res) {
if (res) {
Navigator.pop(context);
}
});
}
}
_getStu() async {
List data = await ajax.get('xxx/xxx');
if (data != null) {
List<DropdownMenuItem> menu = <DropdownMenuItem>[];
for (var i = 0, len = data.length; i < len; i++) {
menu.add(DropdownMenuItem(
child: Text(data[i]['Name']), value: data[i]["Id"]));
}
setState(() {
_stu = menu;
});
}
}
_getDataList() async {
List data = await ajax.get('xxx/xxxx');
if (data != null) {
List<Widget> wg = <Widget>[];
for (var i = 0, len = data.length; i < len; i++) {
List ls = data[i]['Rule'] as List;
wg.add(Container(
padding: EdgeInsets.only(top: 15, bottom: 10),
margin: EdgeInsets.only(bottom: 5),
decoration: BoxDecoration(
border: Border.all(color: Colors.grey, width: 0.3),
borderRadius: BorderRadius.vertical(
top: Radius.elliptical(5, 5), bottom: Radius.elliptical(5, 5)),
),
child: Column(children: <Widget>[
Text(data[i]['Name']),
Divider(),
Container(
height: 300,
child: ListView.separated(
padding: EdgeInsets.zero,
shrinkWrap: true,
itemCount: ls.length,
separatorBuilder: (context, index) {
return Divider();
},
itemBuilder: (context, n) {
return ListTile(
dense: true,
title: Text(ls[n]['Name']),
trailing: DropdownButton<int>(
isDense: true,
hint: Text('评分'),
value: rule[ls[n]['Id']],
onChanged: (val) {
setState(() {
rule[ls[n]['Id']] = val;
});
},
items: [
DropdownMenuItem<int>(
value: ls[n]['WonderfulVal'],
child: const Text('很好'),
),
DropdownMenuItem<int>(
value: ls[n]['FineVal'],
child: const Text('好'),
),
DropdownMenuItem<int>(
value: ls[n]['BetterVal'],
child: const Text('较好'),
),
DropdownMenuItem<int>(
value: ls[n]['AvgVal'],
child: const Text('一般'),
),
DropdownMenuItem<int>(
value: ls[n]['BadVal'],
child: const Text('差'),
)
],
));
}),
)
]),
));
}
setState(() {
_dataList = wg;
});
}
}
@override
void initState() {
super.initState();
_getStu();
_getDataList();
}
@override
Widget build(BuildContext context) {
print('--------------${rule}');
return StatelessScaffold(
"考评",
Alignment.topCenter,
SingleChildScrollView(
padding: const EdgeInsets.all(8.0),
child: _dataList == null
? CircularProgressIndicator(strokeWidth: 1.0)
: Column(
children: <Widget>[
DropdownButton(
items: _stu,
hint: Text('选择学徒'),
value: _stuId,
onChanged: (T) {
setState(() {
_stuId = T;
});
},
iconDisabledColor: Colors.grey,
),
...(_dataList ?? []),
Base.FullSizeButton(context, "提交", _onSubmit)
],
),
));
}
}
class StatelessScaffold extends StatelessWidget {
final _name;
final AlignmentGeometry _align;
final Widget _widget;
const StatelessScaffold(this._name, this._align, this._widget);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: Base.getHeader(context, this._name, true),
resizeToAvoidBottomPadding: false,
body: Container(
alignment: this._align,
child: this._widget));
}
}