Как я могу запретить короткое отображение / мигание страницы регистрации во время загрузки приложения?

#dart #flutter #flutter-layout

#dart #трепетание #flutter-layout

Вопрос:

У меня есть приложение, в котором я проверяю на корневой странице в самом начале, если пользователь вошел в систему. Это делается при каждом запуске приложения.

Если он вошел в систему -> показать стартовую страницу, если не вошел в систему -> показать страницу регистрации

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

Как я могу запретить короткое отображение страницы регистрации?

Корневая страница

 import 'package:first_app/start_screen.dart';
import 'package:first_app/user_auth/registration_start_screen.dart';
import 'package:flutter/material.dart';
import 'package:first_app/user_auth/auth.dart';

class RootPage extends StatefulWidget {
  RootPage({this.auth, this.completed});

  final BaseAuth auth;
  final bool completed;

  @override
  State createState() => new RootPageState();
}

enum AuthStatus { notSignedIn, signedIn }

class RootPageState extends State<RootPage> {
  AuthStatus authStatus = AuthStatus.notSignedIn;

  @override
  void initState() {
    super.initState();
    signedIn();

    widget.auth.currentUser().then((userId) {
      //comment this setState to show login/registration screen
      setState(() {
        authStatus =
            userId == null ? AuthStatus.notSignedIn : AuthStatus.signedIn;
        print(userId);
      });
    }).catchError((onError) {
      authStatus = AuthStatus.notSignedIn;
    });
  }

  void signedIn() {
    if (widget.completed)
      setState(() {
        authStatus = AuthStatus.signedIn;
      });
  }

  @override
  Widget build(BuildContext context) {
    switch (authStatus) {
      case AuthStatus.notSignedIn:
        return RegistrationStartScreen(auth: widget.auth);

      case AuthStatus.signedIn:
        return StartScreen();
    }

    return new RegistrationStartScreen(auth: widget.auth);
  }
}
  

Комментарии:

1. Если возможно, пожалуйста, поделитесь своим кодом, чтобы его было легко понять другим.

2. Конечно. код для корневой страницы приведен выше. Я думаю, поскольку установлен notSignedIn и начальное значение, экран RegistrationStartScreen отображается в течение миллисекунды, пока виджет не будет полностью загружен?

3. Спасибо. Уже найден ответ. Теперь я разрешаю нулевые значения для authStatus и показываю контейнер, если значение равно нулю.

Ответ №1:

Я смог опубликовать это следующим образом. Чтобы знать, что authStatus все еще загружается, вы должны разрешить значение null, поэтому измените AuthStatus authStatus = AuthStatus.notSignedIn; на AuthStatus authStatus .

Тогда используйте пустой контейнер в качестве запасного варианта, если значение равно null:

  Widget build(BuildContext context) {
    if (authStatus != null) {
      switch (authStatus) {
        case AuthStatus.notSignedIn:
          return RegistrationStartScreen(auth: widget.auth);

        case AuthStatus.signedIn:
          return StartScreen();
      }

      return RegistrationStartScreen(auth: widget.auth);
    } else {
      return Container();
    }
  }