Флаттер: Как я могу обеспечить правильную инициализацию переменной из асинхронной функции? - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть этот фрагмент кода Флаттера.

class SongItem extends StatelessWidget {
  final String _songName;
  final String _songNumber;

  // This need to be initialized in the readJSONFile() function.
  String _songLyrics;

  SongItem(
    this._songNumber,
    this._songName
    );

  void readJSONFile(String songName) async {
    String song = await rootBundle.loadString(songName);
    _songLyrics = song;
  }

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () {
        // The async function called here.
        readJSONFile(_songName);

        Navigator.push( /* some code here */ );
      },

      child: Container( /* some code here */ ),
    );
  }
}

При запуске этого кода _songLyrics становится нулевым. Я знаю, что это связано с тем, что readJSONFile () является асинхронным. В этом случае, как я могу заставить вызов функции readJSONFile () ждать, пока _songLyrics не будет инициализирован?

1 Ответ

1 голос
/ 28 апреля 2020

Используйте asyn c и ждите в функции onTap.

Код будет выглядеть следующим образом.

onTap: ()async {
        // The async function called here.
        await readJSONFile(_songName);

        Navigator.push( /* some code here */ );
      },
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...