Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
主屏幕显示firebaseAuth Flatter中的空future builder_Firebase_Flutter_Dart_Firebase Authentication - Fatal编程技术网

主屏幕显示firebaseAuth Flatter中的空future builder

主屏幕显示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

我目前正在尝试从FirebaseAuth获取当前用户状态,并在用户未注销时在主屏幕和用户注销时在闪屏之间切换。用户注册和登录均已成功,并已在firestore数据库中注册。但每次我从手机关闭应用程序并重新打开时,MediaQuery.of(context)宽度都有一个空值并显示一个错误

但底部导航栏仍在显示。当我重新构建应用程序并再次登录时,它会工作,它会将我带到主屏幕。它仅在我关闭并重新打开应用程序时发生

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();
            }