приложения для флаттера не получают данные сразу из общих настроек при первом запуске - PullRequest
0 голосов
/ 12 февраля 2020

у меня есть поле с именем highScore, его данные сохраняются в общих настройках, и я хочу вернуть ie это данные и показывать в first_page, которые отображаются при первом запуске приложения, но при первом запуске просто говорит ноль, и мне нужно go до quiz_page и вернуться, чтобы получить данные, хотя я пытался загрузить данные из initState().

question_bank

    class QuestionBank {
  static final QuestionBank _questionBank = QuestionBank._internal();

  factory QuestionBank() {
    return _questionBank;
  }

  QuestionBank._internal();

  int _questionNumber = 0;
  int _score = 0;
  int highScore;

  incrementCounter() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    highScore = (prefs.getInt('counter') ?? 0) + 1;
    prefs.setInt('counter', highScore);
  }

  loadCounter() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    highScore = (prefs.getInt('counter') ?? 0);
  }
  int getScore() => _score;

  int getLength() => _questionList.length;
}

first_page

    class FirstPage extends StatefulWidget {
  @override
  _FirstPageState createState() => _FirstPageState();
}

class _FirstPageState extends State<FirstPage> {
  QuestionBank questionBank;

  @override
  void initState() {
    super.initState();
    questionBank = QuestionBank();
    questionBank.loadCounter();
  }

  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Scaffold(
        backgroundColor: Colors.white24,
        body: Padding(
          padding: const EdgeInsets.only(top: 40),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.start,
            children: <Widget>[
              Text(
                'High Score: ${questionBank.highScore}',
                style: titleStyle,
              ),
              SizedBox(
                height: 76,
              ),
              Padding(
                padding: const EdgeInsets.only(left: 8.0, right: 8.0),
                child: Image(
                  image: AssetImage(
                    'images/logoDesigne7crop.png',
                  ),
                ),
              ),
              SizedBox(
                height: 30,
              ),
              Container(
                height: 70,
                width: double.infinity,
                margin: EdgeInsets.all(10),
                child: ChoiceButton(
                    btnText: 'start the quiz',
                    tap: () {
                      Navigator.of(context).pushNamed(startQuizRoute);
                    }),
              ),
              Container(
                  height: 70,
                  margin: EdgeInsets.all(10),
                  width: double.infinity,
                  child: ChoiceButton(
                      btnText: 'search',
                      tap: () {
                        Navigator.of(context).pushNamed(searchRoute);
                      })),
            ],
          ),
        ),
      ),
    );
  }
}

quiz_page

   class QuizPage extends StatefulWidget {
  @override
  _QuizPageState createState() => _QuizPageState();
}

class _QuizPageState extends State<QuizPage>
    with SingleTickerProviderStateMixin {
  QuestionBank questionBank = QuestionBank();

  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Scaffold(
        body: Column(
          crossAxisAlignment: CrossAxisAlignment.stretch,
          mainAxisAlignment: MainAxisAlignment.start,
          children: <Widget>[
            Padding(
              padding: const EdgeInsets.only(top: 14, right: 8, left: 6),
              child: TopRow(questionBank: questionBank),
            ),
            Padding(
              padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 40),
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                crossAxisAlignment: CrossAxisAlignment.stretch,
                children: <Widget>[
                  Center(
                    child: Text(questionBank.getQuestionTitle(),
                        textAlign: TextAlign.center, style: titleStyle),
                  ),
                  Padding(
                    padding: const EdgeInsets.only(top: 30, bottom: 20),
                    child: Image.asset(
                      questionBank.getQuestionImage(),
                      height: 180,
                    ),
                  ),
                  SizedBox(
                    height: 76,
                    child: Padding(
                      padding: const EdgeInsets.symmetric(
                          horizontal: 12.0, vertical: 5),
                      child: ChoiceButton(
                        btnText: 'Fruit',
                        tap: () {
                          setState(() {
                            questionBank.bigCheck(1);
                          });
                        },
                      ),
                    ),
                  ),
                  SizedBox(
                    height: 76,
                    child: Padding(
                      padding: const EdgeInsets.symmetric(
                          horizontal: 12.0, vertical: 5),
                      child: ChoiceButton(
                        btnText: 'Vegetable',
                        tap: () {
                          setState(() {
                            questionBank.bigCheck(2);
                          });
                        },
                      ),
                    ),
                  ),
                  SizedBox(
                    height: 76,
                    child: Padding(
                      padding: const EdgeInsets.symmetric(
                          horizontal: 12.0, vertical: 5),
                      child: ChoiceButton(
                        btnText: 'Fungus',
                        tap: () {
                          setState(() {
                            questionBank.bigCheck(3);
                          });
                        },
                      ),
                    ),
                  ),
                  SizedBox(
                    height: 76,
                    child: Padding(
                      padding: const EdgeInsets.symmetric(
                          horizontal: 12.0, vertical: 5),
                      child: ChoiceButton(
                        btnText: 'Berry',
                        tap: () {
                          setState(() {
                            questionBank.bigCheck(4);
                          });
                        },
                      ),
                    ),
                  ),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}

class TopRow extends StatelessWidget {
  const TopRow({
    Key key,
    @required this.questionBank,
  }) : super(key: key);

  final QuestionBank questionBank;

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text(
          'High Score: ${questionBank.highScore}',
          style: TextStyle(fontSize: 25, color: Colors.white),
        ),
        SizedBox(
          height: 10,
        ),
        Row(
          children: <Widget>[
            Text(
              'Score: ${questionBank.getScore()}',
              style: TextStyle(fontSize: 25, color: Colors.white),
            ),
            SizedBox(
              width: 220,
            ),
            Icon(
              FontAwesome.heart,
              size: 26,
            ),
            Icon(
              Icons.audiotrack,
              size: 26,
            ),
          ],
        )
      ],
    );
  }
}

1 Ответ

0 голосов
/ 12 февраля 2020

questionBank.loadCounter(); - это задание syn c, означающее, что это займет время, и поток выполнит эту точку.

теперь у вас есть возможность, например, подождать и показать что-то до загрузки

для этого вы можете использовать FutureBuilder с future: questionBank.loadCounter()

Читать на https://api.flutter.dev/flutter/widgets/FutureBuilder-class.html

В соответствии с обсуждением в комментарии создайте класс

class AppConstant {
  static QuestionBank questionBank=QuestionBank();
}

Теперь перед вызовом выполните вызов loadCounter

void main() {
  await AppConstant.questionBank.loadCounter();
  runApp(MyApp());
}

Теперь вместо инициализации банка вопросов в состоянии. напрямую использовать AppConstant.questionBank

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...