Сортировка JSON в алфавитном порядке - Flutter

Я хотел бы иметь возможность вернуть мой profileList в мой ListView в алфавитном порядке.

У меня есть класс «Все люди», в котором есть виджет ListView, использующий json и создающий список людей.

Приведенный ниже код взят из моего класса All People, где я беру файл json.

class AllPeople extends StatefulWidget {
final String title;

AllPeople(this.title);

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

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
  title: Text("Listviews"),
),
);
}

class AllPeopleState extends State<AllPeople> {
 List data;
 List<Profile> profiles;

 Future<String> getData() async {
 var response = await http.get(
    Uri.encodeFull("http://test.mallcomm.co.uk/json_feeds/users.json"),
    headers: {"Accept": "application/json"});

  fetchPeople().then((List<Profile> p) {
    this.setState(() {
    data = json.decode(response.body);
    profiles = p;
  });
});

return "Success!";
}

@override
void initState() {
  this.getData();
}

 @override
 Widget build(BuildContext context) {
  return Scaffold(
  appBar: AppBar(
    title: Text('CMS Users'),
  ),
  body: ListView.builder(
      padding: EdgeInsets.only(top: 20.0, left: 4.0),
      itemExtent: 70.0,
      itemCount: data == null ? 0 : data.length,
      itemBuilder: (BuildContext context, int index) {
        return Card(
          elevation: 10.0,
          child: InkWell(
            onTap: () {
              Navigator.push(
                  context,
                  new MaterialPageRoute(
                    builder: (BuildContext context) =>
                        new PeopleDetails("Profile Page", profiles[index]),
                  ));
            },
            child: ListTile(
              leading: CircleAvatar(
                child: Text(profiles[index].getInitials()),
                backgroundColor: Colors.deepPurple,
                radius: 30.0,
              ),
              title: Text(
                  data[index]["firstname"] + "." + data[index]["lastname"]),
              subtitle: Text(
                  data[index]["email"] + "\n" + data[index]["phonenumber"]),
            ),
          ),
        );
      }),
  );
  }
 }

Future<List<Profile>> fetchPeople() async {
 try {
 http.Response response =
    await http.get('http://test.mallcomm.co.uk/json_feeds/users.json');

 List<dynamic> responseJson = json.decode(response.body);

 List<Profile> profileList =
    responseJson.map((d) => new Profile.fromJson(d)).toList();

profileList.sort((a, b) {
  return a.lastName.toLowerCase().compareTo(b.lastName.toLowerCase());
});

  return profileList;
} catch (e) {
print(e.toString());
}
return null;
}

Затем у меня есть класс «Профиль пользователя», в котором хранится мой профиль json.

class Profile {
 final String firstName;
 final String lastName;
 final String phoneNumber;
 final String userEmail;

bool verifiedValue = false;
bool approvedValue = false;
bool securityApprovedValue = false;
bool blockedValue = false;

Profile({this.firstName, this.lastName, this.phoneNumber, this.userEmail});

factory Profile.fromJson(Map<String, dynamic> json) {
  return new Profile(
  firstName: json["firstname"],
  lastName: json["lastname"],
  phoneNumber: json["phonenumber"],
  userEmail: json["email"],
  );
 }

Я пытался сделать что-то вроде

 profileList.sort((a,b) {
return a.lastName.toLowerCase().compareTo(b.lastName.toLowerCase());
 });

прямо перед тем, как я верну profileList, но это не сработало. Я пробовал смотреть на несколько разных примеров, но, честно говоря, я не слишком хорошо это понимаю.

Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
1
0
5 261
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предложенная вами функция сортировки, похоже, работает так, как вы ожидаете (но, конечно, сравнивает только фамилию - вы можете сравнить имя, если фамилии равны). Я немного привел в порядок этот рабочий пример:

import 'dart:convert';
import 'dart:async';

import 'package:http/http.dart' as http;

main() async {
  fetchPeople().then((list) {
    list.forEach(print);
  });
}

Future<List<Profile>> fetchPeople() async {
  try {
    http.Response response =
        await http.get('http://test.mallcomm.co.uk/json_feeds/users.json');

    List<dynamic> responseJson = json.decode(response.body);

    List<Profile> profileList =
        responseJson.map((d) => new Profile.fromJson(d)).toList();

    profileList.sort((a, b) {
      return a.lastName.toLowerCase().compareTo(b.lastName.toLowerCase());
    });

    return profileList;
  } catch (e) {
    print(e.toString());
  }
}

class Profile {
  final String firstName;
  final String lastName;
  final String phoneNumber;
  final String userEmail;

  bool verifiedValue = false;
  bool approvedValue = false;
  bool securityApprovedValue = false;
  bool blockedValue = false;

  Profile({this.firstName, this.lastName, this.phoneNumber, this.userEmail});

  factory Profile.fromJson(Map<String, dynamic> json) {
    return new Profile(
      firstName: json["firstname"],
      lastName: json["lastname"],
      phoneNumber: json["phonenumber"],
      userEmail: json["email"],
    );
  }

  @override
  String toString() {
    return 'Profile: $firstName $lastName';
  }
}

Вот пример State, который работает.

class _MyHomePageState extends State<MyHomePage> {
  List<Profile> profiles = [];

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

  void _refresh() {
    fetchPeople().then((list) {
      setState(() {
        profiles = list;
      });
    });
  }

  Future<List<Profile>> fetchPeople() async {
    try {
      http.Response response =
      await http.get('http://test.mallcomm.co.uk/json_feeds/users.json');

      List<dynamic> responseJson = json.decode(response.body);

      List<Profile> profileList =
      responseJson.map((d) => new Profile.fromJson(d)).toList();

      profileList.sort((a, b) {
        return a.lastName.toLowerCase().compareTo(b.lastName.toLowerCase());
      });

      return profileList;
    } catch (e) {
      print(e.toString());
      return [];
    }
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text(widget.title),
      ),
      body: new ListView.builder(
        itemBuilder: (context, i) => new Text('${profiles[i].firstName} ${profiles[i].lastName}'),
        itemCount: profiles.length,
      ),
    );
  }
}

Спасибо за быстрый ответ, я попытался применить решение, но оно все еще не работает. Я включил свой Widget Scaffold, чтобы показать, как я использую JSON, чтобы узнать, делаю ли я что-то неправильно.

Dan530c 28.06.2018 16:55

Просто чтобы упомянуть использование вашего кода в отдельном проекте, я вижу, что он работает с печатью, но я просто не уверен, как заставить его работать в моей ситуации.

Dan530c 28.06.2018 17:06

добавлен простой виджет для отображения отсортированного списка. Кстати, я думаю, что ваши List data и var response не нужны - удалите их, если это правильно.

Richard Heap 28.06.2018 17:32

Отличное спасибо за ваше время и помощь в этом. Теперь о забавной стилизации

Dan530c 28.06.2018 17:40

Другие вопросы по теме