Flutter Provider initialize default state?

Issue

I have a Provider that I was creating with:

ChangeNotifierProvider<WeekList>(create: (context) => WeekList()

But I wanted to initialize the list with adding one week to it at the start. I was pretty stumbed until I read this Stack Overflow article: Flutter/provider- initializing a state with a constructor

But then when I tried it myself with:

    ChangeNotifierProvider<WeekList>(create: (context) => WeekList().addWeek(budget: 300.00)),

I got this error:

The return type ‘void’ isn’t a ‘WeekList’, as required by the
closure’s context.dartreturn_of_invalid_type_from_closure

Since its a void I tried removing the type like this:

    ChangeNotifierProvider(create: (context) => WeekList().addWeek(budget: 300.00)),

But that also did not work.

My WeekList class is:

class WeekList extends ChangeNotifier {
  List<Week> listOfWeeks = [];

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

Solution

In create you need to return a WeekList.
The function addWeek has a type of void not WeekList.
You can change that function to return WeekList that will then create the ChangeNotifierProvider with the listOfWeeks containing the newWeek because now the listOfWeeks will be returned.

class WeekList extends ChangeNotifier {
  List<Week> listOfWeeks = [];

  WeekList createWeekList({
    required double budget,
  }) {
    Week newWeek = Week(
      budget: budget,
    );
    listOfWeeks.add(newWeek);
    return listOfWeeks; 
  }
}

An other option is to initialise the listOfWeeks with a Week and then not use addWeek in create

ChangeNotifierProvider<WeekList>(create: (context) => WeekList())

...

class WeekList extends ChangeNotifier {
  List<Week> listOfWeeks = [Week(budget: budget: 300.00)];

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

And another option if you need specify the budget amount would be to initials WeekList with a budget amount.

ChangeNotifierProvider<WeekList>(create: (context) => WeekList(budget: 300.00))

...

class WeekList extends ChangeNotifier {
  final double budget;
  const WeekList({required this.budget}){
    listOfWeeks = [Week(budget: budget: budget)]
  }
  Late final List<Week> listOfWeeks;

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

Then there is one more option i can think of and that is to use the cascade notation.
https://dart.dev/guides/language/language-tour#cascade-notation
Which would look like this.

 ChangeNotifierProvider<WeekList>(create: (context) => WeekList()..addWeek(budget: 300.00)),

Answered By – Shannon

Answer Checked By – Robin (FlutterFixes Admin)

Leave a Reply

Your email address will not be published.