【问题标题】:Sort List if Dropdown entry is changed如果更改了下拉条目,则排序列表
【发布时间】:2023-03-26 16:46:02
【问题描述】:

我正在尝试设置一个新的排序下拉按钮,该按钮会更改从数据库中获取的条目的排序顺序。

我可以在页面加载时对列表进行排序,但我无法使用下拉选项更改排序顺序。

代码没有错误。

任何建议我需要更改以使此代码正常工作?

class NewList extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => new _State();
}

class _State extends State<NewList> {
  static dates;
  List<Entry> _entryList = [];
  List<Entry> _sort = [];
  StreamController<int> _postsController;
  
  List<Option> options = [];
  Option _selectedOption;

  void _select(Option option) {
    setState(() {
      _selectedOption = option;
    });

    if (_selectedOption.title =='Oldest first') {
            _sort.sort((a, b) {
                return b.id.compareTo(a.id);
            });
    } else if (_selectedOption.title =='Newest first') {
            _sort.sort((a, b) {
                return a.id.compareTo(b.id);
            });
    } 
  }

  @override
  void initState() {
    _postsController = new StreamController();
    fetchReport();
    super.initState();
  }

  fetchReport() {
     fecthEntries(dates.id.toString(), dates.from, dates.to)
         .then((value) => {
              _entryList.addAll(value),
              _postsController.add(1),
              setState(() {})
           });        
  }

  @override
  Widget build(BuildContext context) {
    dates = ModalRoute.of(context).settings.arguments;
    
    options = <Option>[
      Option(
          title: 'Oldest first',
      Option(
          title: 'Newest first',
    ];
    _selectedOption = options[0];

    return Scaffold(
      appBar: AppBar(
        title: Text('Title'),
        actions: <Widget>[
          PopupMenuButton<Option>(
            onSelected: _select,
            icon: Icon(Icons.sort),
            itemBuilder: (BuildContext context) {
              return options.map((Option option) {
                return PopupMenuItem<Option>(
                  value: option,
                  child: Text(option.title),
                );
              }).toList();
            },
          ),
        ],
      ),
      body: StreamBuilder<int>(
          stream: _postsController.stream,
          builder: (BuildContext context, AsyncSnapshot<int> result) {
            if (result.hasData) {
              return showAll();
            } 
          }),
    );
  }

  Widget showAll() {
    //This is where I can sort the list onload and setup the default sort
    _entryList.sort((a, b) {
        return b.id.compareTo(a.id);
    });
    return ListView.builder(
      itemCount: _entryList.length,
      itemBuilder: (context, index) {
        final entry = _entryList[index];
        return reportRow(entry, context);
      },
    );
  }

}

class Option {
  const Option({this.title});
  final String title;
}

【问题讨论】:

    标签: android flutter sorting dart


    【解决方案1】:

    我也会尝试使用 setState() 来包装排序逻辑。你试过吗?

    【讨论】:

    • 这样的? - setState(() { _sort.sort((a, b) { return b.id.compareTo(a.id); }); }); 不幸的是,它不起作用......
    • 在您的 _select 方法中,您已经拥有 setState(){}。将整个方法内容包装在这个 setState 方法中。
    • 另一个猜测...在您始终设置的构建方法中:_selectedOption = options[0];这样,DropDown 值就无法更改。将声明移到构建方法之外。
    • 不,不是这样。我想我应该在选择下拉列表后重新加载列表?
    猜你喜欢
    • 2017-04-17
    • 2016-06-01
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多