Updating information within a list of objects with Flutter Hive

Viewed 709

I am working with Hive for the first time to save data within flutter and am halfway there...

I have a list of weeks that I am saving within a box, and I am able to save those weeks successfully with:

  void addWeek({
    required double budget,
  }) {
    Week newWeek = Week(
      budget: budget,
    );

    listOfWeeks.add(newWeek);
    box.add(newWeek);
    notifyListeners();
  }

When I close the app and restart it I then can load all those saved weeks within the class constructor with:

@HiveType(typeId: 1)
class WeekList extends ChangeNotifier {
  WeekList() {
    int boxLength = box.length;
    for (var i = 0; i < boxLength; i++) {
      listOfWeeks.add(box.get(i));
    }
  }

What I am struggling with wrapping my head around is how to access the data and update the data within my list of weeks. The listOfWeeks holds a bunch of objects type Week which looks like this:

@HiveType(typeId: 2)
class Week extends ChangeNotifier {
  // Constructor
  Week({
    this.budget = 0.0,
  });

  //budget
  @HiveField(0)
  double budget = 0.0;
  @HiveField(1)
  String dailySpend = '\$71.43 per day';

  @HiveField(2)
  double totalSpent = 0.0;
  @HiveField(3)
  double percentLeftInBudget = 0.0;

  //Spent days of the week
  @HiveField(4)
  double sunday = 0.0;
  @HiveField(5)
  double monday = 0.0;
  @HiveField(6)
  double tuesday = 0.0;
  @HiveField(7)
  double wednesday = 0.0;
  @HiveField(8)
  double thursday = 0.0;
  @HiveField(9)
  double friday = 0.0;
  @HiveField(10)
  double saturday = 0.0;

I figure in all the update functions for all the values I need to use a box.put() but I can't seem to wrap my head around the syntax for this. WOuld it be something like:

  //updateBudget
  void updateBudget({required double newBudget, required int index}) {
    listOfWeeks[index].budget = newBudget;
    box.put(index,listOfWeeks[index].budget);
    notifyListeners();
  }

but then if I moved to the next update function for updating let's say the value of saturday I just cant use box.put(index,listOfWeeks[index].saturday);

I tried box.put(listOfWeeks[index]).budget to access the specific value but that doesn't seem to work. Any help would be greatly appreciated, thanks!

1 Answers

After writing this detailed question, It got me to slow down and think through this problem and I figured out my answer.

At the line box.add(newWeek);

I am adding a Week object to the box. So essentially the box is a list of weeks.

After thinking on this I realized I don't necessarily have to access monday in a specific week in the box. I can just update that value in my week, and then in the box just overwrite that entire week using:

box.putAt(index, week);

Hopefully this helps someone else in the future when trying to use hive for the first time!

Related