Экран Spla sh - AnimationController не запустится, пока не будет выполнен асинхронный вызов c на initState - PullRequest
0 голосов
/ 28 января 2020

Я пытаюсь сделать экран spla sh для своего приложения Flutter. Я хочу, чтобы мой lo go вращался, проверяя, вошел ли пользователь в систему аутентификации firebase, а затем переходил к соответствующим представлениям в зависимости от возвращаемого значения.

Проблема в том, что мое приложение раньше не работало должным образом мой асин c вызов (я вижу свой backGround, но не AnimatedBuilder).

Я попытался запустить мой CheckUser() с помощью пакета after_layout или с помощью этой функции:

WidgetsBinding.instance.addPostFrameCallback((_) => yourFunction(context));

, но всегда ждет, пока функция CheckUser() завершит работу sh, поэтому я не вижу анимацию, поскольку она переходит непосредственно к другим моим представлениям.

Вот мой код, если вы хотите проверить это:

import 'dart:io';

import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:skull_mobile/connexion/login.dart';
import 'accueil.dart';

class SplashPage extends StatefulWidget {
  SplashPage({Key key}) : super(key: key);

  @override
  _SplashPage createState() => _SplashPage();
}

class _SplashPage extends State<SplashPage>
    with SingleTickerProviderStateMixin {

  AnimationController animationController;

  @override
  void initState() {
    super.initState();
    animationController = new AnimationController(
      vsync: this,
      duration: new Duration(seconds: 5),
    );
    animationController.repeat();
    checkUser();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.grey[800],
      body: Center(
        child: Container(
          child: new AnimatedBuilder(
            animation: animationController,
            child: new Container(
              height: 150.0,
              width: 150.0,
              child: new Image.asset('assets/skull.png'),
            ),
            builder: (BuildContext context, Widget _widget) {
              return new Transform.rotate(
                angle: animationController.value * 6.3,
                child: _widget,
              );
            },
          ),
        ),
      ),
    );
  }

  void checkUser() async {
    FirebaseAuth.instance.currentUser().then((currentUser) => {
          if (currentUser == null)
            {Navigator.pushNamed(context, LoginPage.routeName)}
          else
            {Navigator.pushNamed(context, AccueilPage.routeName)}
        });
  }
}

1 Ответ

0 голосов
/ 28 января 2020

Следуя моему комментарию, я делюсь здесь фрагментом своего собственного кода и того, как я обрабатываю экран spla sh, здесь называемый «WaitingScreen», состояние соединения устройства, а затем отправляю пользователя на разные страницы с разными свойствами. в зависимости от результатов:

@override
Widget build(BuildContext context) {
  switch (authStatus) {
    case AuthStatus.notDetermined:
      if(_connectionStatus == ConnectionStatus.connected){
        return _buildWaitingScreen();
      }else{
        return _buildNoConnectionScreen();
      }
      break;
    case AuthStatus.notSignedIn:
      return LoginPage(
        onSignedIn: _signedIn,
        setThemePreference: widget.setThemePreference,
      );
    case AuthStatus.signedIn:
      return MainPage(
        onSignedOut: _signedOut,
        setThemePreference: widget.setThemePreference,
        getThemePreference: widget.getThemePreference,
      );
  }
  return null;
}
...