Search code examples
flutterdartflutter-hive

How to store a List in Hive (Flutter)?


I am trying to store and fetch a list using Hive in Flutter, however I get a range error.

    int steps = 0;
    List<int> stepCountList = List(7);
    var time = DateTime.now();

   // This is my method for a listener that updates when it detects a change,
    void _onData(int newValue) async {
    fetchSteps();
    steps = stepCountList[time.weekday] ?? 0;
    stepDivider += newValue;
    stepCountList.insert(time.weekday - 1, steps);
     moneyLottoBox.put('stepCountList', stepCountList);
  }

 void fetchSteps() {
    stepCountList = moneyLottoBox.get('stepCountList');
    if (stepCountList == null) {
      moneyLottoBox.put('stepCountList', <int>[7]);
      stepCountList = moneyLottoBox.get('stepCountList');
    }
  }
// I create my MoneyLotto box here,
var moneyLottoBox = Hive.box('moneyLottoBox');
Future<void> main async {
 moneyLottoBox = await Hive.openBox('box');
}

Today being Saturday for me, the value of time.weekday for me is 6, however it shows me the error when I try to print(stepCountList[6])

RangeError (index): Invalid value: Only valid value is 0: 6

Solution

  • You can't use insert() method on fixed length List, by fixed length I mean when you declare it this way List<int> stepCountList = List(7); Edited the code, now it should work

    void _onData(int newValue) async {
        fetchSteps();
        steps = stepCountList[time.weekday] ?? 0;
        stepDivider += newValue;
        //stepCountList.insert(time.weekday - 1, steps);this is not correct
        stepCountList[time.weekday -1] = steps; // this should be the approach
         moneyLottoBox.put('stepCountList', stepCountList);
      }
    
    
    void fetchSteps() {
        stepCountList = moneyLottoBox.get('stepCountList');
        if (stepCountList == null) {
         /* moneyLottoBox.put('stepCountList', <int>[7]); this statement is the 
    reason for your error because your are storing a growable list instead of fixed list in the hive */
    
    moneyLottoBox.put('stepCountList', List<int>(7));// try this instead 
    // or u can use this moneyLottoBox.put('stepCountList', stepCountList);
          stepCountList = moneyLottoBox.get('stepCountList');
        }
      }