繁体   English   中英

Flutter/Dart:如何按键排序?

[英]Flutter/Dart: How to sort list by key?

在将列表显示在 ListView.builder 中之前,我试图按项目的字母顺序对列表进行排序,但我没有任何运气这样做。 这是我的代码:

class GlossaryItem {
  String item;
  String definition;

  GlossaryItem({String i, String d}) {
    item = i;
    definition = d;
  }
}

class Glossary {
  int _glossaryNumber = 0;

  List<GlossaryItem> _glossaryBank = [
    GlossaryItem(
      i: 'item a',
      d: 'definition a',
    ),
    GlossaryItem(
      i: 'item d',
      d: 'definition d',
    ),
    GlossaryItem(
      i: 'item b',
      d: 'definition b',
    ),
    GlossaryItem(
      i: 'item c',
      d: 'definition c',
    ),
  ];

  _glossaryBank.sort((a, b) {
  int compare = a.item.compareTo(b.item);
  return compare;
  });

  int getCount() {
    return _glossaryBank.length;
  }

  String getSpecificItem(index) {
    return _glossaryBank[index].item;
  }

  String getSpecificDefinition(index) {
    return _glossaryBank[index].definition;
  }
}

我在_glossaryBank.sort()上收到错误消息,提示“构造函数的名称必须与封闭的 class 的名称匹配。” 我已经浏览了很多页面,但似乎无法使其正常工作。

编辑:我对其进行了以下更改,现在我在该页面上没有收到错误:

  void sort() {
  _glossaryBank.sort((a, b) {
    int compare = a.item.compareTo(b.item);
    return compare;
  });

但是,当尝试启动它时,我得到了其他错误。 这是我启动它的另一个页面:

import 'package:flutter/material.dart';
import '../dictionary/glossarylist.dart';

//Call glossary
var glossary = Glossary();
glossary.sort();

class GlossaryPage extends StatefulWidget {
  GlossaryPage({
    Key key,
  });

  @override
  _GlossaryPageState createState() => _GlossaryPageState();
}

class _GlossaryPageState extends State<GlossaryPage> {

  Widget printDefinitions() {
    return ListView.builder(
      itemCount: glossary.getCount(),
      itemBuilder: (BuildContext context, int index) {
        // return row
        return Padding(
          padding: const EdgeInsets.symmetric(vertical: 8.0),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.stretch,
            mainAxisAlignment: MainAxisAlignment.start,
            children: <Widget>[
              Text(
                glossary.getSpecificItem(index) + ':',
                style: TextStyle(
                  fontWeight: FontWeight.bold,
                ),
              ),
              Text(
                glossary.getSpecificDefinition(index),
                style: TextStyle(
                  fontStyle: FontStyle.italic,
                ),
              ),
            ],
          ),
        );
      },
      shrinkWrap: true,
      physics: ClampingScrollPhysics(),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      color: Colors.teal[300],
      child: SafeArea(
        child: Scaffold(
          appBar: [omitted code...]
          body: Padding(
            padding: const EdgeInsets.all(15.0),
            child: printDefinitions(),
          ),
        ),
      ),
    );
  }
}

问题是您在运行方法之外有 _glossaryBank。 您必须编写一些可以执行代码的东西。

class Glossary {
  int _glossaryNumber = 0;

  List<GlossaryItem> _glossaryBank = [
    GlossaryItem(
      i: 'item a',
      d: 'definition a',
    ),
    GlossaryItem(
      i: 'item d',
      d: 'definition d',
    ),
    GlossaryItem(
      i: 'item b',
      d: 'definition b',
    ),
    GlossaryItem(
      i: 'item c',
      d: 'definition c',
    ),
  ];

  void sort() {
    _glossaryBank.sort((a, b) {
      int compare = a.item.compareTo(b.item);
      return compare;
    });
  }
}

无论您在哪里启动 class,您都必须使用它

var glossary = Glossary();
glossary.sort();

我创建了一个关于它如何工作的小型 CodePen。 https://codepen.io/md-weber/pen/bGVjdap

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM