Flutter / Dart:处理ListView.builder中的Dropdown更改,Dropdown按钮未更新,

时间:2018-12-06 04:43:04

标签: listview dart flutter dropdownbutton

我猜想我缺少一些简单的东西,但是我已经尝试了所有可能的解决方案已有好几天了。我们如何处理listview.builder中的下拉选择?是否可以将下拉按钮值存储在List-String-中?

我正在基于XML模板创建动态表单,并且具有下拉菜单,复选框,输入等。编辑:我不知道然后需要什么小组件,直到页面加载时解析XML。 。因此,尝试将动态创建的小部件列表传递给Listview.builder。

以下代码是无法更新的基本示例。

在这里感谢任何建议。

myList = ["a00", "b000", "c0"]

"a00" in myList
# True

"a" in myList
# False

3 个答案:

答案 0 :(得分:0)

遵循代码的效果很好。因为SetSate再次调用Build方法,并且DropdownButton再次被绘制。在您的代码中,DropdownButton放在_widgets [0]值上,并且该值在整个代码周期内保持静态。即使在调用SetState之后,它也会保持不变-因为SetState不会更新_widgets [0]值-它只会再次调用Build Method。

@override
  Widget build(BuildContext context) {
    return new Scaffold(
        body: new ListView.builder(
      itemCount: _widgets.length,
      itemBuilder: (context, index) {
        return DropdownButton<String>(
          value: _listValues[0],
          items: _items,
          onChanged: (newValue) {
            setState(() {
              _listValues[0] = newValue;
            });
          },
        );
      },
    ));
  }

答案 1 :(得分:0)

我最终用statefulbuilder封装了每个下拉窗口小部件(在List<Widget>中),因此当从每个窗口小部件调用setstate时,仅该窗口小部件被更新,但是如果需要,仍然可以遍历整个树。这样,就可以按照anmol.majhail注释从构建中调用setState。

import 'package:flutter/material.dart';

class FormEG extends StatefulWidget {
  @override
  _FormEGState createState() => new _FormEGState();
}

class _FormEGState extends State<FormEG> {
  List<String> _listValues;
  List<DropdownMenuItem<String>> _items;
  List<Widget> _widgets;

  @override
  void initState() {
    _listValues = new List<String>();
    setDefaults();
    setWidgets();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    print("built");
    return new Scaffold(
        body: new ListView.builder(
          itemCount: _widgets.length,
          itemBuilder: (context, index) {
        return _widgets[index];
      },
    ));
  }

  void setDefaults() {
    _listValues.add("b");
  }

  void setWidgets() {
    setMenuItems();
    _widgets = new List<Widget>();
    _widgets.add(
      new StatefulBuilder(
        builder: (BuildContext context, StateSetter setState) {
          return new DropdownButton<String>(
            value: _listValues[0],
            items: _items,
            onChanged: (String newValue) {
              setState(() {
                _listValues[0] = newValue;
              });
            },
          );
        },
      ),
    );
  }

  void setMenuItems() {
    _items = new List<DropdownMenuItem<String>>();
    _items.add(new DropdownMenuItem(child: Text("a"), value: "a"));
    _items.add(new DropdownMenuItem(child: Text("b"), value: "b"));
    _items.add(new DropdownMenuItem(child: Text("c"), value: "c"));
    _items.add(new DropdownMenuItem(child: Text("d"), value: "d"));
  }
}

答案 2 :(得分:0)

您可以尝试仅使用列表并动态更新列表,然后再更新setState。

ListView(
                  shrinkWrap: true,
                  scrollDirection: Axis.vertical,
                  children: dropDownList),
            ),

然后根据触发器/事件对其进行更新。

 _buildDropDownList() {
     if (dropDownEnabled) {
       setState (() {
         dropDownList.addAll([1,2,,4,5])
       });
       } else {
        setState (() {
         dropDownList = [];
      });   
    }