主屏幕显示firebaseAuth Flatter中的空future builder
我目前正在尝试从FirebaseAuth获取当前用户状态,并在用户未注销时在主屏幕和用户注销时在闪屏之间切换。用户注册和登录均已成功,并已在firestore数据库中注册。但每次我从手机关闭应用程序并重新打开时,MediaQuery.of(context)宽度都有一个空值并显示一个错误 但底部导航栏仍在显示。当我重新构建应用程序并再次登录时,它会工作,它会将我带到主屏幕。它仅在我关闭并重新打开应用程序时发生主屏幕显示firebaseAuth Flatter中的空future builder,firebase,flutter,dart,firebase-authentication,Firebase,Flutter,Dart,Firebase Authentication,我目前正在尝试从FirebaseAuth获取当前用户状态,并在用户未注销时在主屏幕和用户注销时在闪屏之间切换。用户注册和登录均已成功,并已在firestore数据库中注册。但每次我从手机关闭应用程序并重新打开时,MediaQuery.of(context)宽度都有一个空值并显示一个错误 但底部导航栏仍在显示。当我重新构建应用程序并再次登录时,它会工作,它会将我带到主屏幕。它仅在我关闭并重新打开应用程序时发生 import 'package:country_code_picker/country
import 'package:country_code_picker/country_localizations.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'routes.dart';
import 'package:screens/home/home_screen.dart';
import 'package:screens/splash/splash_screen.dart';
import 'constants.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
supportedLocales: [Locale('en', 'US')],
localizationsDelegates: [CountryLocalizations.delegate],
title: 'App',
theme: theme(),
routes: routes,
home: LandingPage(),
);
}
}
class LandingPage extends StatelessWidget {
const LandingPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
final Future<FirebaseApp> _init = Firebase.initializeApp();
return FutureBuilder(
future: _init,
builder: (context, snapshot) {
if (snapshot.hasError) {
return Scaffold(
body: Center(
child: Text("Error: ${snapshot.error}"),
),
);
}
if (snapshot.connectionState == ConnectionState.done) {
return StreamBuilder(
stream: FirebaseAuth.instance.authStateChanges(),
builder: (context, streamSnapshot) {
if (streamSnapshot.hasError) {
return Scaffold(
body: Center(
child: Text("Error: ${streamSnapshot.error}"),
),
);
}
if (streamSnapshot.connectionState == ConnectionState.active) {
print(streamSnapshot.data.toString());
if (streamSnapshot.data == null) {
return SplashScreen();
} else {
return HomeScreen();
}
}
return Scaffold(
body: Center(
child: CircularProgressIndicator(
backgroundColor: Colors.white,
color: kPrimaryColor,
strokeWidth: 3,
),
),
);
},
);
}
return Scaffold(
body: Center(
child: CircularProgressIndicator(
backgroundColor: Colors.white,
color: kPrimaryColor,
strokeWidth: 3,
),
),
);
},
);
}
}
大小\配置.dart
import 'package:flutter/material.dart';
class SizeConfig {
static MediaQueryData? _mediaQueryData;
static double? screenWidth;
static double? screenHeight;
static double? defaultSize;
static Orientation? orientation;
void init(BuildContext context) {
_mediaQueryData = MediaQuery.of(context);
screenWidth = _mediaQueryData!.size.width;
screenHeight = _mediaQueryData!.size.height;
orientation = _mediaQueryData!.orientation;
}
}
// Proportionate height per screen size
double getProportionateScreenHeight(double inputHeight) {
double? screenHeight = SizeConfig.screenHeight;
return (inputHeight / 812.0) * screenHeight!;
}
// Proportionate width per screen size
double getProportionateScreenWidth(double inputWidth) {
double? screenWidth = SizeConfig.screenWidth;
return (inputWidth / 375.0) * screenWidth!;
}
#0的堆栈跟踪行是返回(inputWidth/375.0)*屏幕宽度!;这表明im对screenWidth!使用空检查 我猜罪魁祸首是这句话:
print(streamSnapshot.data.toString())代码>
实际上,您正在检查下一行的streamSnapshot.data
是否为空:
print(streamSnapshot.data.toString());
if (streamSnapshot.data == null) {
return SplashScreen();
} else {
return HomeScreen();
}
我看不出您实际上在哪里调用SizeConfig().init(上下文)?
在项目顶部出现之前,不会为您定义任何内容。更多详细信息会有所帮助。你也有来自控制台的stacktrace吗?@nilsmagnus是没有问题,我已经添加了stacktrace。我已经编辑并添加了stacktrace。实际上,打印显示了用户详细信息,但如果没有用户,则返回null。只有当用户未注销并重新打开应用程序时,才会发生这种情况。无法看到主屏幕。非常感谢。我忘了在LandingPage()的构建中添加它。这就是mediaQueryData返回null的原因。
print(streamSnapshot.data.toString());
if (streamSnapshot.data == null) {
return SplashScreen();
} else {
return HomeScreen();
}