Flutter下拉菜单无法使用提供商更改文本

时间:2020-03-26 13:59:05

标签: flutter dart

我有代表当前所选项目的此类:

class DropdownText with ChangeNotifier {

  String _text = "";

  String get text => _text;

  void setText(String value) {
    _text = value;
    notifyListeners();
  }

}

这是我用来尝试显示下拉按钮的代码:

class DropDown extends StatelessWidget {

  final List<DropdownMenuItem<String>> menu = [
    DropdownMenuItem<String>(
      value: "A",
      child: Text("A"),
    ),
    DropdownMenuItem<String>(
      value: "B",
      child: Text("B"),
    )
  ];

   DropDown();

  @override
  Widget build(BuildContext context) {
    return FormField<String>(
      builder: (FormFieldState<String> formState) {
        return Consumer<DropdownText>(
          builder: (context, dropdown, _) {
            return InputDecorator(
              decoration: InputDecoration(
                  border: OutlineInputBorder(
                    borderRadius: BorderRadius.circular(10)
                  ),
                prefixIcon: const Icon(Icons.fastfood),
              ),
              child: DropdownButtonFormField<String>(
                items: menu,
                onChanged: (value) {
                  dropdown.setText(value);
                },
                value: dropdown.text,
              ),
            );
          },
        );
      },
    );
  }

}

我得到的错误是

断言失败:第1411行第15行:'item == null || items.isEmpty || 值== null || I /颤振(7719):
items.where(((DropdownMenuItem item){I / flutter(7719):
返回item.value == value; I /颤振(7719):} .length == 1'

但是我在哪里失败?我明确地将每个泛型类型。可能是提供程序包中的Consumer<T>问题吗?

我还没有在下拉菜单中看到重复项和空项目。

2 个答案:

答案 0 :(得分:1)

阅读错误的这一部分

 items.where((DropdownMenuItem<T> item) {return item.value == value;}).length == 1'

您会注意到,如果长度为0,则仍会标记错误

基本上,下拉列表的初始值必须为一个DropDownItem。而且因为您的初始值为“”,并且没有以“”作为其值的DropDownItem,所以它将不起作用

 String _text = "";

解决方案

在DropDownText中将 _text 的初始值设置为项目的第一个值(DropDownItems)

class DropdownText with ChangeNotifier {

  String _text = "A";

  String get text => _text;

  void setText(String value) {
    _text = value;
    notifyListeners();
  }

}

答案 1 :(得分:0)

如果分配的当前值不是来自值列表,我们可能会得到此类型错误,以修复交叉检查当前值,如果它不同,分配默认空值将保存中断代码,

例如:currentValue: (apiDataValue.value?.isEmpty??true)?null:apiDataValue.value,