Search code examples
fluttersharedpreferencesprovider

Flutter : Class 'Future<List<String>>' has no instance getter 'length'


I have a List of String saved on SharedPreference in Flutter app, I want to call it inside Provider and using it in a widget. Provider :

get myTeam => getMyTeam();
  Future<List<String>> getMyTeam() async {
    Future<SharedPreferences> _prefs = SharedPreferences.getInstance();
    final SharedPreferences prefs = await _prefs;
    return prefs.getStringList('team');
  }

I used it in future builder :

Widget build(BuildContext context) {
    return Consumer<GeneralProvider>(
        builder: (context, generalProvider, child) {
      var items = generalProvider.myTeam;
      return FutureBuilder(
          future: items,
          builder: (context, snapshot) {
            if (snapshot.hasData) {
              return ListView.builder(
                  itemCount: items.length,
                  itemBuilder: (context, index) {
                    return ListTile(
                      title: Text('${items[index].club}'),
                    );
                  });
            } else {
              return Text('bad');
            }
          });
    });
  }

I get error : Class 'Future<List<String>>' has no instance getter 'length'

I tied with many solutions in questions here like : Class 'Future<dynamic>' has no instance getter 'length'

but it wasn't solved


Solution

  • Change itemCount: items.length into itemCount: snapshot.length,

    And Future builder to FutureBuilder<List<String>(...etc).

    Will look like this in the end:

    Widget build(BuildContext context) {
        return Consumer<GeneralProvider>(
            builder: (context, generalProvider, child) {
          var items = generalProvider.myTeam;
          return FutureBuilder<List<String>>(
              future: items,
              builder: (context, snapshot) {
                if (snapshot.hasData) {
                  return ListView.builder(
                      itemCount: snapshot.length,
                      itemBuilder: (context, index) {
                        return ListTile(
                         // title: Text('${items[index].club}'),//This will likely throw an error also, because items is a List<String>, there is no method called "club" for Lists. 
                        //Replace it with this to validate:
                        title: Text(snapshot[index]),//This 
       
                        );
                      });
                } else {
                  return Text('bad');
                }
              });
        });
      }