【问题标题】:Flutter/Dart: How to sort list by key?Flutter/Dart:如何按键排序?
【发布时间】:2020-08-28 18:03:37
【问题描述】:

我试图在 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() 上收到错误消息,提示“构造函数的名称必须与封闭类的名称匹配。”我浏览了很多页面,但似乎无法正常工作。

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

  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(),
          ),
        ),
      ),
    );
  }
}

【问题讨论】:

  • 您在类的主体中添加了对排序方法的调用,但没有封闭方法。这是不允许的,编译器发现您必须尝试定义命名构造函数 (dart.dev/guides/language/language-tour#named-constructors),因此给了您无用的错误消息:The name of the constructor must match the name of the enclosing class.

标签: list sorting listview flutter dart


【解决方案1】:

问题是您在运行方法之外有 _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;
    });
  }
}

无论你在哪里开始上课,你都必须使用它

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

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

【讨论】:

  • 谢谢,但我现在在 glossary.sort(); 上开始上课时遇到了同样的错误。
  • 如果我在我的 listview.builder 所在类之外的页面顶部调用它,它会显示 Functions must have an explicit list of parameters. Expected a method, getter, setter or operator declaration. The name glossary is already defined. A function body must be provided. 如果我在同一个内部启动它类作为我的 listview.builder,它告诉我 The name of the constructor must match the name of the enclosing class.
  • 我创建了一个小的 CodePen,也许它有助于使其更清晰:codepen.io/md-weber/pen/bGVjdap
  • 好的,我现在知道了。它运行良好。我只需要在构建部分启动它。说得通。非常感谢!
猜你喜欢
  • 2022-12-07
  • 2021-06-03
  • 1970-01-01
  • 1970-01-01
  • 2019-10-20
  • 1970-01-01
  • 2020-02-10
  • 2022-01-22
  • 2020-03-08
相关资源
最近更新 更多