Frederik
Frederik

Reputation: 13

Flutter Shared Preferences acces in other class

In the following class I have created a ListView of Strings which are stored sing shared preferences. Now I need to access the content of List<String> categoryList in another class. I do not know where to implement a get function to give other classes access to this List.

One Idea was to create a class for the List (But I dont want to mess up everything)

That is my Class with the List View

import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

class Categories extends StatefulWidget {
  @override
  _CategoriesState createState() => _CategoriesState();
}

class _CategoriesState extends State<Categories> {
  List<String> categoryList = List<String>();
  TextEditingController _textFieldController = TextEditingController();

  @override
  Widget build(BuildContext context) {
    _update();
    return Scaffold(
      appBar: AppBar(
        title: Text("Categories"),
      ),
      body: SafeArea(
        child: Container(
          color: Colors.white,
          child: getCategoriesListView(),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        child: Icon(Icons.add),
        onPressed: () {
          setState(() {
            _displayDialog(context);
          });
        },
      ),
    );
  }

  ListView getCategoriesListView() {
    return ListView.builder(
        itemCount: categoryList.length,
        itemBuilder: (context, int position) {
          return Card(
            color: Colors.white,
            elevation: 2.0,
            child: ListTile(
              title: Text(categoryList[position]),
              trailing: GestureDetector(
                child: Icon(
                  Icons.delete,
                  color: Colors.grey,
                ),
                onTap: () {
                  setState(() {
                    _delete(context, categoryList[position]);
                  });
                },
              ),
            ),
          );
        });
  }

  void _add(BuildContext context, String category) async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    categoryList.add(category);
    prefs.setStringList('Categories', categoryList);
  }

  void _delete(BuildContext context, String category) async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    categoryList.remove(category);
    prefs.setStringList('Categories', categoryList);
  }

  void _update() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    setState(() {
      categoryList = prefs.getStringList('Categories');
    });
  }

  void showSnackBar(BuildContext context, String message) async {
    final snackBar = SnackBar(content: Text(message));
    Scaffold.of(context).showSnackBar((snackBar));
  }

  _displayDialog(BuildContext context) async {
    _textFieldController.clear();
    return showDialog(
        context: context,
        builder: (context) {
          return AlertDialog(
            title: Text('Add new category'),
            content: TextField(
              controller: _textFieldController,
            ),
            actions: <Widget>[
              FlatButton(
                child: Text('ADD'),
                onPressed: () {
                  setState(() {
                    String name = _textFieldController.text;
                    _add(context, name);
                    Navigator.of(context).pop();
                  });
                },
              ),
              FlatButton(
                child: Text('CANCEL'),
                onPressed: () {
                  Navigator.of(context).pop();
                },
              ),
            ],
          );
        });
  }
}

Second Class

import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

class MonthlyOverview extends StatefulWidget {
  @override
  _MonthlyOverviewState createState() => _MonthlyOverviewState();
}

class _MonthlyOverviewState extends State<MonthlyOverview> {
  List<String> _categories = new List<String>();
  @override
  Widget build(BuildContext context) {
    _getCategory().then((value) {
      _categories = value;
    });
    print(_categories);
    return Scaffold(
      appBar: AppBar(),
      body: Container(
        color: Colors.white,
      ),
    );
  }

  _getCategory() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    List<String> categoryList = prefs.getStringList('Categories');
    return categoryList;
  }
}

Console output I/flutter (13417): []

Upvotes: 0

Views: 2483

Answers (1)

Pro
Pro

Reputation: 3003

@Frederik, have you tried implementing a get function in your second class and accessing the list? It could be something like this in your second class,

_getCategory() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    List<String> categoryList = prefs.getStringList('Categories');
    return categoryList;
  }

Call (depends on where you're calling it but this should give you an idea):

List<String> _categories = new List<String>();
_getCategory().then((value) {
 _categories = value;
});
//Your _categories has the value now , use it here.

Full code:

void main() {
  runApp(MaterialApp(
      home: new MyApp(),
      routes: <String, WidgetBuilder>{
        "/monthlyOverview" : (BuildContext context)=> new MonthlyOverview(),
        //add more routes here
      }
  ));
}

class MyApp extends StatefulWidget {
  @override
  MyAppState createState() => MyAppState();
}

class MyAppState extends State<MyApp> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
            appBar: AppBar(
              title: Text('Test'),
            ),
            body: Padding(
                  padding: EdgeInsets.all(20.0),
                  child: Center(
                    child: FlatButton(
                      child: Text('Next', style: TextStyle(fontSize: 18.0, fontWeight: FontWeight.bold),),
                      onPressed: () async {
                        List<String> categoryList = ['Item 1', 'Item 2', 'Item 3'];
                        SharedPreferences prefs = await SharedPreferences.getInstance();
                        prefs.setStringList('Categories', categoryList);
                        Navigator.of(context).pushNamed("/monthlyOverview");
                      },
                    )
                  )
                  ),
    );
  }

}

class MonthlyOverview extends StatefulWidget {
  @override
  _MonthlyOverviewState createState() => _MonthlyOverviewState();
}

class _MonthlyOverviewState extends State<MonthlyOverview> {
  List<String> _categories = new List<String>();

  @override
  void initState() {
    super.initState();

    _getCategory().then((value) {
      _categories = value;
      setState(() {});
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(),
        body: Center(
            child: Container(
              color: Colors.white,
              child: _categories.length > 0 ? Text(_categories[0] + '\n' + _categories[1] + '\n' + _categories[2], style: TextStyle(fontSize: 18.0, fontWeight: FontWeight.bold),) : Text(''),
            )
        ),
    );
  }

  _getCategory() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    List<String> categoryList = prefs.getStringList('Categories');
    return categoryList;
  }
}

demo

Hope this helps.

Upvotes: 1

Related Questions