Динамическая DropdownButton, когда значение изменения пользовательского интерфейса не рендерит - PullRequest
0 голосов
/ 26 июня 2019

$ флаттер доктор

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 для получения выбранного значения, значение уже было изменено, но пользовательский интерфейс не отображался. когда я выбрал «很好» или что-то еще, пользовательский интерфейс не отображался, Кто-то, кто сталкивается с той же проблемой, пожалуйста, помогите мне. Заранее спасибо!

модель данных

[{
   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)
                  ],
                ),
        ));
  }
}

интерфейс

пользовательский интерфейс

пользовательский интерфейс

StatelessScaffold

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