如何使用flutter_bloc对从JSON接收的模型数据进行排序?

jhkqcmku  于 2023-05-01  发布在  Flutter
关注(0)|答案(2)|浏览(93)

我有一个模型:

import 'dart:convert';

Forecast forecastFromJson(String str) => Forecast.fromJson(json.decode(str));

String forecastToJson(Forecast data) => json.encode(data.toJson());

class Forecast {
  List<ListElement> list;

  Forecast({
    required this.list,
  });

  factory Forecast.fromJson(Map<String, dynamic> json) => Forecast(
    list: List<ListElement>.from(json["list"].map((x) => ListElement.fromJson(x))),
  );

  Map<String, dynamic> toJson() => {
    "list": List<dynamic>.from(list.map((x) => x.toJson())),
  };
}

class ListElement {
  int dt;
  Main main;
  DateTime dtTxt;

  ListElement({
    required this.dt,
    required this.main,
    required this.dtTxt,
  });

  factory ListElement.fromJson(Map<String, dynamic> json) => ListElement(
    dt: json["dt"],
    main: Main.fromJson(json["main"]),
    dtTxt: DateTime.parse(json["dt_txt"]),
  );

  Map<String, dynamic> toJson() => {
    "dt": dt,
    "main": main.toJson(),
    "dt_txt": dtTxt.toIso8601String(),
  };
}

class Main {
  double temp;
  int humidity;

  Main({
    required this.temp,
    required this.humidity,
  });

  factory Main.fromJson(Map<String, dynamic> json) => Main(
    temp: json["temp"]?.toDouble(),
    humidity: json["humidity"],
  );

  Map<String, dynamic> toJson() => {
    "temp": temp,
    "humidity": humidity,
  };
}

有一部分代码输出了一个列表:

return  ListView.separated(
                  padding: const EdgeInsets.all(8),
                  itemCount: state.forecast.list.length,
                  separatorBuilder: (BuildContext context, int index) => Divider(),
                  itemBuilder: (BuildContext context, int index) {
                    return ListTile(
                        title: Text("${state.forecast.list[index].main.temp}", style:TextStyle(fontSize: 22)),
                        subtitle: Text("${state.forecast.list[index].dtTxt}")
                    );
                  }
              );

一切都很好。但我需要确保列表的第一个元素是温度最低的元素。
也就是说,默认情况下,列表项按日期排序。我需要它们按温度分类。而且我不需要一个按钮来排序。我需要用户看到一个按温度排序的列表。

**编辑1.**这是与此状态相关的代码。

class ForecastLoadSuccess extends WeatherState {
  final Forecast forecast;

  ForecastLoadSuccess({required this.forecast});
}

**编辑2.**这是块代码。

on<ForecastRequest>((event, emit) async {
    emit(WeatherLoadInProgress());
    try {
      final forecastResponse =
      await _forecastRepository.getForecast(event.cityName);
      emit(ForecastLoadSuccess(forecast: forecastResponse));
    } catch (e) {
      print(e);
      emit(WeatherLoadFailure(error: e.toString()));
    }
  }
  );
lvjbypge

lvjbypge1#

更改此:

factory Forecast.fromJson(Map<String, dynamic> json) => Forecast(
    list: List<ListElement>.from(json["list"].map((x) => ListElement.fromJson(x))),
  );

收件人:

factory Forecast.fromJson(Map<String, dynamic> json) => Forecast(
    list: List<ListElement>.from(json["list"].map((x) => ListElement.fromJson(x)))..sort((a, b) => a.main.temp.compareTo(b.main.temp)),
  );

请注意,您可能希望在分配状态时进行排序,而不是在fromJson方法中进行排序(如果数据来自不同的源会发生什么?您将不得不复制代码),但您没有公开这部分代码。

编辑

通过查看您的代码,您可以执行以下操作:

final forecastResponse = await _forecastRepository.getForecast(event.cityName);
forecastResponse.list.sort((a, b) => a.main.temp.compareTo(b.main.temp));
emit(...)
sshcrbum

sshcrbum2#

你可以这样使用它,它将适用于所有的场景

factory Forecast.fromJson(Map<String, dynamic> json) {
   final list = List<ListElement>.from(json["list"].map((x) => ListElement.fromJson(x)));
   list.sort((a,b)=> a.main.temp-b.main.temp);
   return Forecast(list: list);
}

或者,如果您想为某个特定的状态执行此操作,则将该列表传递给该状态,并在该状态类中对其进行排序,例如

class SomeState extends MainState {
  final List<ListElement> listOfElement;
  SomeState(this.listOfElement){
    listOfElement.sort((a,b)=> a.main.temp-b.main.temp);
  }
}

相关问题