【问题标题】:Why am I getting stack overflow?为什么我会出现堆栈溢出?
【发布时间】:2021-06-18 21:50:19
【问题描述】:
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'package:keol_beta/providers/authservice.dart';
import 'package:keol_beta/screen/home.dart';
import 'package:keol_beta/screen/login.dart';
import 'package:provider/provider.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(
    ChangeNotifierProvider(
      create: (context) => AuthService(),
      child: MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'Keol Beta',
        theme: ThemeData(
          primarySwatch: Colors.blue,
          visualDensity: VisualDensity.adaptivePlatformDensity,
        ),
        home: MyApp(),
        debugShowCheckedModeBanner: false);
  }
}

FutureBuilder<User> mainMethod(BuildContext context) {
  return FutureBuilder(
    future: Provider.of<AuthService>(context).getUser(),
    builder: (BuildContext context, AsyncSnapshot snapshot) {
      Firebase.initializeApp();
      if (snapshot.connectionState == ConnectionState.done) {
        if (snapshot.error != null) {
          print("ini error di main");
          return Text(snapshot.error.toString());
        }
        print("Connect Done " + snapshot.toString());
        return snapshot.hasData
            // ? HomePage(currentUser: snapshot.data)
            // ? HomePage()
            // : LoginPage();
            ? LoginPage()
            : HomePage();
      } else {
        print("Connect Failure");
        return Center(
          child: Container(
            child: CircularProgressIndicator(),
            alignment: Alignment(0, 0),
          ),
        );
      }
    },
  );
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;

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

class _MyHomePageState extends State<MyHomePage> {
  bool _initialized = false;
  bool _error = false;

  void initializeFlutterFire() async {
    try {

      await Firebase.initializeApp();
      setState(() {
        _initialized = true;
      });
    } catch (e) {

      setState(() {
        _error = true;
      });
    }
  }

  @override
  void initState() {
    initializeFlutterFire();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    
    if (_error) {
      return showAlertDialog(context, "error");
    }

    
    if (!_initialized) {
      return showAlertDialog(context, "loading");
    }

    return mainMethod(context);
  }
}

showAlertDialog(BuildContext context, String value) {
  
  Widget okButton = TextButton(
    child: Text("OK"),
    onPressed: () {},
  );

  
  AlertDialog alert = AlertDialog(
    title: Text("Error"),
    content: Text(value),
    actions: [
      okButton,
    ],
  );

  
  showDialog(
    context: context,
    builder: (BuildContext context) {
      return alert;
    },
  );
}

所以,我正在为我的学士学位完成我的最后一个项目,并且仍然是 Flutter 的新手。 我正在尝试使用

升级我的依赖项
firebase_core: ^0.7.0

之前是 0.5.0,在新版本中,它需要初始化默认 firebase,我正在尝试这样做,但不知何故它得到了堆栈溢出错误。

快3天了,什么都没有,有什么解决办法吗?

【问题讨论】:

  • 你能发布错误日志吗?如果没有堆栈跟踪,我们将无法为您提供帮助。另外,firebase_core 最新版本是 1.0.1(见pub.dev/packages/firebase_core
  • 请不要回答这个问题。我已回滚/编辑您的问题并删除了答案。仅在答案部分添加答案。

标签: flutter dart


【解决方案1】:

我想我发现你的代码有什么问题。

根据documentation,您应该任何 Firebase 调用之前运行await Firebase.initializeApp()

在您的代码中,您在调用 Provider.of&lt;AuthService&gt;(context).getUser() 之后调用它,我认为(因为没有此文件的代码)使用 Firebase Auth 代码。

在使用await 关键字运行应用程序之前,您应该调用await Firebase.initializeApp(),因为Firebase.initializeApp() 返回Future。重要的是,在进一步对未初始化的对象调用 Firebase 方法之前完成此 Future。

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  await Firebase.initializeApp();

  runApp(
    ChangeNotifierProvider(
      create: (context) => AuthService(),
      child: MyApp(),
    ),
  );
}

【讨论】:

  • 它仍然有一些stackoverflowm,有一些变化,它写道:堆栈溢出相关的错误导致小部件是MaterialApp lib\main.dart:23
  • 试试去掉theme参数看看有没有问题。
【解决方案2】:

在身份验证服务之前尝试初始化 firebase 应用:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  await Firebase.initializeApp();

  runApp(
    ChangeNotifierProvider(
      create: (context) => AuthService(),
      child: MyApp(),
    ),
  );
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 2019-01-09
    相关资源
    最近更新 更多