Donc, j'essaie de grouper le tri d'une liste par une méthode particulière d'une classe. Mon code stocke actuellement des "repas" avec Hive par ce format de classe :

https://pub.dev/packages/hive

import 'package:hive/hive.dart';

part 'meal.g.dart';

@HiveType(typeId: 1, adapterName: "MealAdapter")
class MealModel{
  @HiveField(0)
  int id;
  @HiveField(1)
  String mealName;
  @HiveField(2)
  int calories;
  @HiveField(3)
  int carbohydrates;
  @HiveField(4)
  int protein;
  @HiveField(5)
  int fats;
  @HiveField(6)
  String day;

  MealModel(this.id, this.mealName, this.calories, this.day, [this.carbohydrates, this.protein, this.fats]);
}

Le problème, c'est quand je n'ai aucune idée que je passerais des valeurs à chacun des paramètres d'un GroupedListView (https://pub .dev/packages/grouped_list) pour afficher les repas stockés :

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:hive/hive.dart';
import 'package:jaetrack/colors.dart';
import 'package:jaetrack/dbmodel/meal.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'package:grouped_list/grouped_list.dart';

class Meals extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return MealsState();
  }
}

class MealsState extends State<Meals> {
  Box<MealModel> mealBox = Hive.box<MealModel>('meals');
  MealModel previousMeal;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: mainPurp,
      body: SingleChildScrollView(
        child: Column(
          children: [
            ValueListenableBuilder(
                valueListenable: Hive.box<MealModel>('meals').listenable(),
                builder: (context, Box<MealModel> box, _) {
                  final mealList = box.values.toList().cast<MealModel>();
                  print(mealList);
                  return GroupedListView<dynamic, String>(
                    elements: mealList,
                    groupBy: (meal) => meal, // no idea how to sort by calories, name etc. of my MealModel class,
                    groupSeparatorBuilder: (String groupByValue) =>
                        Text(groupByValue), // date value
                    itemBuilder: (context, dynamic element) =>
                        Text(element['name']), // this is where I would put the meal names/calories etc.
                    itemComparator: (item1, item2) =>
                        item1['name'].compareTo(item2['name']), // sort by date is what I'm looking for but again I don't know how to access
                    useStickyGroupSeparators: true,
                    floatingHeader: true,
                    order: GroupedListOrder.ASC,
                  );
                })
          ],
        ),
      ),
    );
  }
}

Donc, si je n'ai toujours pas de sens, je convertis les valeurs de ma boîte de repas en ruche en tant qu'instances du MealModel ci-dessus. Donc, la liste serait comme [Instance of MealModel, Instance of MealModel, ...] J'ai juste besoin de savoir comment accéder aux valeurs à l'intérieur de l'instance du MealModel pour passer à la GroupedList.

0
frax 11 oct. 2020 à 06:44

1 réponse

Meilleure réponse

La bibliothèque package:grouped_list utilise dynamic dans tous ses exemples pour simplifier l'utilisation pour les personnes qui n'obtiennent pas de génériques. mais c'est trompeur dans votre cas, vous perdez la frappe forte.

Jeter à

return GroupedListView<MealModel, String>(

Au lieu de

return GroupedListView<dynamic, String>(

Alors toutes vos vars element, meal et item2 seront de MealModel et vous pouvez faire element.mealName et meal.calories pour regrouper par calories

Pour la question de tri, triez simplement mealList avant de la passer au GroupedListView

1
Benoit Jadinon 11 oct. 2020 à 08:37