Итак, я пытаюсь настроить автоматический вход в систему с помощью Firebase и провайдера, все работает, но проблема в том, что для того, чтобы узнать, вошел ли он в систему, требуется секунда. Я бы предпочел, чтобы вместо страницы приветствия отображался загрузчик домашняя страница пользователя.
В основном при запуске приложения первое, что нужно показать, это WelcoePage (), а через секунду появится соответствующая страница. Как мне ускорить его или как показать загрузчик или что-то, кроме WelcomePage (), когда пользователь вошел в систему.
Код:
user_provider.dart
class UserProvider with ChangeNotifier {
var _auth;
User _user;
UserProvider.instance() : _auth = Services().auth.auth {
_auth.onAuthStateChanged.listen((u) async {
if (u != null) {
// When creates a new user and before it creates the user document
// the app crashes because the user doesn't actually exist at that
// point so I just have a checker if the user actually exists in
// Firestore for the next function to work which retrieves the user document.
if (await APIs().users.userExists(userID: u.uid)) {
this.user = await APIs().users.user(userID: u.uid);
}
} else {
this.user = null;
}
});
}
// ...
}
main.dart
Future main() async {
WidgetsFlutterBinding.ensureInitialized();
List<CameraDescription> cameras = await availableCameras();
Widget _consumer() => Consumer4<ThemeProvider, CameraProvider, NetworkProvider, UserProvider>(
builder: (context, theme, camera, network, user, child) => App(
page: user.user == null
? WelcomePage()
: user.user.isEmployer ? EmployerPage() : user.user.resume == null ? SProfileSetupPage() : SeekerPage(),
// Detection to where the page should be.
),
);
runApp(
MultiProvider(
providers: [
ChangeNotifierProvider<ThemeProvider>(
create: (_) => ThemeProvider(Themes.light),
),
ChangeNotifierProvider<CameraProvider>(
create: (_) => CameraProvider(cameras),
),
ChangeNotifierProvider<NetworkProvider>(
create: (_) => NetworkProvider.instance(),
),
ChangeNotifierProvider<UserProvider>(
create: (_) => UserProvider.instance(),
),
],
child: await Funcs.isPhysicalDevice()
? _consumer()
: Constants.isDebug
? DevicePreview(
builder: (context) => _consumer(),
)
: _consumer(),
),
);
}
class App extends StatelessWidget {
final Widget page;
const App({Key key, this.page}) : super(key: key);
@override
Widget build(BuildContext context) => Platform.isIOS
? CupertinoApp(
home: this.page,
theme: Utils.currentTheme(context: context).cupertinoOverrideTheme,
navigatorObservers: [
Services().analytics.firebaseAnalyticsObserver,
],
title: Constants.title,
localizationsDelegates: const <LocalizationsDelegate<dynamic>>[
DefaultMaterialLocalizations.delegate,
DefaultWidgetsLocalizations.delegate,
],
debugShowCheckedModeBanner: false,
)
: MaterialApp(
home: this.page,
theme: Utils.currentTheme(context: context),
navigatorObservers: [
Services().analytics.firebaseAnalyticsObserver,
],
title: Constants.title,
localizationsDelegates: const <LocalizationsDelegate<dynamic>>[
DefaultMaterialLocalizations.delegate,
DefaultWidgetsLocalizations.delegate,
],
debugShowCheckedModeBanner: false,
);
}