Как сделать Future <int>обычным int, который можно использовать с массивами? - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь сохранить счетчик общих предпочтений, чтобы отслеживать массив в моем приложении. Ошибка, с которой я столкнулся, заключается в том, что я возвращаю значение Future и пытаюсь использовать его для определения индекса массива.

Вот код:

var titles = [];

  Future<int> getCounter() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    int currentCount = prefs.getInt('counter');
    print('Current Count: $currentCount');
    return currentCount;
  }

  getValue() async {
    final value = await getCounter();
    return value;
  }

  Widget _displayPage()
  {
    int index = getValue();

    titles[index] = 'text';
    return ListView.builder(
      itemCount: 1,
      itemBuilder: (BuildContext context, int index) {
        assert(context != null);
        return new ListTile(
          title: Text('Temp Text'),
          onTap: () async {
            //getCounter();
          }
        );
      }
      );
  }

Когда я пытаюсь построить на этой странице я получаю точную ошибку: «Type Future не является подтипом int»

Что я пробовал: 1. Как и в приведенном выше коде, я попытался сделать несколько функций, чтобы преобразовать его в обычный int 2. Я пробовал использовать возвращаемое значение getCounter () непосредственно в определении индекса массива, например:

titles[getCounter()] = 'text

1 Ответ

0 голосов
/ 05 мая 2020

Вы получаете сообщение об ошибке, потому что вы не используете FutureBuilder. Попробуйте использовать FutureBuilder. Вы можете решить эту проблему, заменив виджет displayPage() приведенным ниже кодом. Проверьте код ниже: он работает отлично.

 Widget _displayPage()
  {
    // use a future builder
    return FutureBuilder<int>(
      // assign a function to it (your getCounter method)
      future: getCounter(),
        builder: (context, snapshot) {
        if(snapshot.hasData){
          // print your integer value
          print(snapshot.data);
          return new ListTile(
              title: Text('Temp Text'),
              onTap: () {
              }
          );
        } else {
          return Text(snapshot.error.toString());
        }
        }
    );
  }

Надеюсь, это поможет.

...