Error while trying to save shared preferences with provider - flutter

0

I had a custom class called Trans (short for transaction) that stores a bool and a double and displays them in a Row, I stored Trans in a List transactions and displayed it in page page_2 using ListView (originally Trans was inside page_2) and saved transactions using shared preferences, but then I moved my Trans class and List Transactions to a new file and made it a provider to be able to access Trans and transactions and add new Trans to the list in multiple places , I also moved Saving and Loading to the new Trans page and they stopped working and I get an error :

[ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: dependOnInheritedWidgetOfExactType<_InheritedProviderScope<Trans>>() or dependOnInheritedElement() was called before _pg2.initState() completed.
E/flutter ( 9102): When an inherited widget changes, for example if the value of Theme.of() changes, its dependent widgets are rebuilt. If the dependent widget's reference to the inherited widget is in a constructor or an initState() method, then the rebuilt dependent widget will not reflect the changes in the inherited widget.
E/flutter ( 9102): Typically references to inherited widgets should occur in widget build() methods. Alternatively, initialization based on inherited widgets can be placed in the didChangeDependencies method, which is called after initState and whenever the dependencies change thereafter.

below is the entire source code for Trans and page_2 without widget build : Trans:

class Trans extends StatelessWidget with ChangeNotifier {
  SharedPreferences sharedPreferences;
  final BackColor = const Color(0xff141414); // color for buttons
  final text_color = const Color(0xffFFFFFF);
  List <Trans> transactions = [
  ];




  bool send;
  Color color;
  double amount;
  Trans({Key key, this.send, this.amount}) : super(key: key);


  Trans.fromMap(Map map)
      : this.send = map['send'],
        this.amount = map['amount'];
  Map toMap() {
    return {
      'send': this.send,
      'amount': this.amount,
    };
  }



  @override


  Widget build(BuildContext context) {...}


  addTrans(){
    transactions.add(Trans(send: this.send, amount: this.amount,));
    notifyListeners();
  }

  void saveData() {

    List<String> stringList = transactions.map(
            (item) => json.encode(item.toMap()
        )).toList();
    sharedPreferences.setStringList('list', stringList);
    notifyListeners();
  }

  void loadData() {
    List<String> listString = sharedPreferences.getStringList('list');
    if(listString != null){
      transactions = listString.map(
              (item) => Trans.fromMap(json.decode(item))
      ).toList();
      notifyListeners();
    }
  }
  void clearData() async{
    transactions.clear();
    saveData();
  }
 }

page_2 :


class pg2 extends StatefulWidget with ChangeNotifier {


  @override



  _pg2 createState() => _pg2();

}

class _pg2 extends State<pg2> with ChangeNotifier {



  @override
  void initState() {
    initSharedPreferences();
    super.initState();
  }
  initSharedPreferences() async{
    final trans = Provider.of<Trans>(context, listen: true);
    trans.sharedPreferences = await SharedPreferences.getInstance();
    trans.loadData();

  }




  @override

  final BackColor = const Color(0xff141414); // color for buttons
  final text_color = const Color(0xffFFFFFF);



  Widget build(BuildContext context) {

  //only important thing here is a RaisedButton that adds new Trans to the list using addTrans()

  RaisedButton(
    onPressed: () {
      if (_formKey.currentState.validate()){
      setState(() {
       trans.addTrans();
       trans.saveData();
         });
        }
       },
       child: const Text("Add Transaction"),
      ),
  }
  


}

flutter
dart
flutter-provider
flutter-sharedpreference
asked on Stack Overflow Jan 3, 2021 by anan saadi

1 Answer

0

Remove with ChangeNotifier on class pg2. ChangeNotifier on _pg2 is sufficient

answered on Stack Overflow Jan 3, 2021 by dm_tr

User contributions licensed under CC BY-SA 3.0