如何在dropdownbottom上应用过滤器

时间:2019-06-14 19:02:26

标签: flutter

我有以下代码填充了一个DropdownButton,但是我在编辑时无法过滤内容。

我需要帮助,因为我无法理解错误以及如何更正问题以制造过滤器。

我尝试了几种过滤器,但均未成功。下面应用的过滤器具有以下错误:

  

断言失败:609行pos 15:'item == null || items.isEmpty ||
  值== null || items.where(((DropdownMenuItem item)=>
  item.value == value).length == 1':不正确。

此错误来自以下过滤器:

if (widget.filialID != 0) {
  _select = FilialModel(key: widget.filialID);
}

我找不到解决问题的方法。请帮忙。谢谢。

import 'package:flutter/material.dart';
import 'package:onex_qa/data/database.dart';
import 'package:onex_qa/models/filial_model.dart';

class DropFilialDb extends StatefulWidget {
  int filialID;
  DropFilialDb({Key key, this.filialID}) : super(key: key);
  @override
  _DropFilialDbState createState() => _DropFilialDbState();
}

class _DropFilialDbState extends State<DropFilialDb> {
  final String _tipo = 'Filial';
  FilialModel _select;
  final _listDb = DatabaseDb().getAllFilialList();

  @override
  void initState() {
    super.initState();

    if (widget.filialID != 0) {
      _select = FilialModel(key: widget.filialID);
    }
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      padding: EdgeInsets.fromLTRB(4, 0, 2, 0),
      child: Theme(
        data: Theme.of(context).copyWith(
          canvasColor: Theme.of(context).dialogBackgroundColor,
        ),
        child: FutureBuilder<List<FilialModel>>(
          future: _listDb,
          builder: (BuildContext context,
              AsyncSnapshot<List<FilialModel>> snapshot) {
            if (!snapshot.hasData) return CircularProgressIndicator();
            return DropdownButton<FilialModel>(
              items: snapshot.data.map((FilialModel value) {
                return new DropdownMenuItem<FilialModel>(
                  value: value,
                  child: new Text(value.filial),
                );
              }).toList(),
              style: TextStyle(color: Theme.of(context).primaryColorDark),
              elevation: 3,
              isExpanded: true,
              hint: Text("Selecione ${_tipo}",
                  style: TextStyle(
                      color: Theme.of(context).primaryColorDark, fontSize: 17)),
              value: _select == null ? null : _select,
              onChanged: (FilialModel value) {
                if (value == null) {
                  _select = null;
                } else {
                  setState(() {
                    _select = value;
                    widget.filialID = _select.key;
                  });
                }
              },
            );
          },
        ),
      ),
    );
  }
}

1 个答案:

答案 0 :(得分:0)

我的逻辑假设是FilialModel没有定义相等运算符,因此比较两个模型总是返回false。即使它们 是相同的型号。

尝试在FilialModel类中定义相等运算符。这可能会修复引发错误的断言的items.where部分。

例如

class FilialModel /* extends ... */ {
  // ...,

  // Compares `key` property of current object (this) and the other object (obj)
  bool operator ==(obj) => obj is FilialModel && obj.key == this.key;

  @override
  int get hashCode => key.hashCode; // This has to be overridden too. You might want to define more complex logic here.
}

让我知道这是否有帮助。