颤振:LateInitializationError:字段“名称”尚未初始化

Posted

技术标签:

【中文标题】颤振:LateInitializationError:字段“名称”尚未初始化【英文标题】:flutter: LateInitializationError: Field 'name' has not been initialized 【发布时间】:2021-07-06 11:58:07 【问题描述】:

错误:Runner[463:34314] 颤动:LateInitializationError:字段“名称”尚未初始化。

我最近更新为使用 firebase 核心和 nullsafety,并对我不太了解的代码进行了一些更改,我是在这里编程的新手。无论如何,我已经尝试阅读这个类似的线程here,但我仍然不太了解它。我知道我很可能在 initstate 中没有正确使用名称,但这就是我所理解的。有人可以提供解决以下错误所需的示例代码吗?

2021-04-10 17:59:41.331476-0700 Runner[463:34314] 。

class MyService extends StatefulWidget 
  @override
  _MyServiceState createState() => _MyServiceState();


class _MyServiceState extends State<MyService> 
  late String name, email;
  Widget currentWidget = BackgroundBetcher();

  @override
  void initState() 
    // TODO: implement initState
    super.initState();
    findNameAnEmail();
  

  Future<Null> findNameAnEmail() async 
    await Firebase.initializeApp().then((value) async 
      FirebaseAuth.instance.authStateChanges().listen((event) 
        setState(() 
          name = event!.displayName!;
          email = event.email!;
        );
      );
    );
  

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      appBar: AppBar(
        backgroundColor: MyStyle().primaryColor,
      ),
      drawer: buildDrawer(),
      body: currentWidget,
    );
  

  Drawer buildDrawer() 
    return Drawer(
      child: Stack(
        children: [
          Column(
            children: [
              buildUserAccountsDrawerHeader(),
              buildListTileShowCartoonList(),
              buildListTileInformation(),
            ],
          ),
          buildSignOut(),
        ],
      ),
    );
  

  ListTile buildListTileShowCartoonList() 
    return ListTile(
      leading: Icon(
        Icons.face,
        size: 36,
      ),
      title: Text('Manual Location Update'),
      subtitle: Text('Send a single location update'),
      onTap: () 
        setState(() 
          currentWidget = PageWidget();
        );
        Navigator.pop(context);
      ,
    );
  

  ListTile buildListTileInformation() 
    return ListTile(
      leading: Icon(
        Icons.perm_device_info,
        size: 36,
      ),
      title: Text('Background Location Fetch Log'),
      subtitle: Text('History of recorded locations'),
      onTap: () 
        setState(() 
          currentWidget = BackgroundBetcher();
        );
        Navigator.pop(context);
      ,
    );
  

  UserAccountsDrawerHeader buildUserAccountsDrawerHeader() 
    return UserAccountsDrawerHeader(
      decoration: BoxDecoration(
        image: DecorationImage(
            image: AssetImage('images/wall.jpg'), fit: BoxFit.cover),
      ),
      accountName: MyStyle().titleH3(name),
      accountEmail: MyStyle().titleH3(email),
      currentAccountPicture: Image.asset('images/logo.png'),
    );
  

  Column buildSignOut() 
    return Column(
      mainAxisAlignment: MainAxisAlignment.end,
      children: [
        ListTile(
          onTap: () async 
            await Firebase.initializeApp().then((value) async 
              await FirebaseAuth.instance.signOut().then((value) =>
                  Navigator.pushNamedAndRemoveUntil(
                      context, '/authen', (route) => false));
            );
          ,
          tileColor: MyStyle().darkColor,
          leading: Icon(
            Icons.exit_to_app,
            color: Colors.white,
            size: 36,
          ),
          title: MyStyle().titleH2White('Sign Out'),
          subtitle: MyStyle().titleH3White('Sign Out & Go to Authen'),
        ),
      ],
    );
  

【问题讨论】:

我已经回答了你的问题,但另一方面:自 Dart 2 发布以来,Future&lt;void&gt; 优于 Future&lt;Null&gt; 【参考方案1】:

您应该检查变量name 的可空性。所以,使用:

String? name;

代替:

late String name

迟到的意思,

我保证稍后我会初始化这个变量

但是当在构建方法中使用该变量时,这个承诺并不意味着什么。

【讨论】:

android Studio 建议在更新到空安全时使用延迟,我花了一段时间才弄清楚“?”正是需要的,谢谢。 不会撒谎,零安全性一直很痛苦 我不确定用一个可以为空的变量替换后期初始化变量如何解决这个问题?这主要是主题以错误的顺序调用某些内容的问题,而 Flutter 编译器足够聪明,可以解决这个问题。【参考方案2】:

findNameAnEmail 是一个异步方法,因此,在initState 中调用它时,Flutter 不会在调用build 之前等待它完成。这会导致您的后期字段在设置之前被访问。

为了在构建之前等待Future 完成,请考虑使用FutureBuilder

【讨论】:

感谢阅读和回答,我现在明白了FutureBuilder的目的,但不知道如何实现。您能否提供一个我需要进行更改的示例?谢谢。【参考方案3】:

我是 Flutter 的新手,但这对我有用。

@override
void initState() 
    // TODO: implement initState
    super.initState();

    findNameAndEmail().whenComplete(() 
        setState(() );
    );

【讨论】:

对我不起作用 仍然出现错误LateInitializationError: Field '_cartFuture@52302676' has not been initialized. 我不推荐这种方法有几个原因。首先,它不安全。不能保证在调用 setState 时仍然会挂载小部件,如果不是,则会发生运行时错误。此外,它没有优化。而不是重建整个小部件,使用类似FutureBuilder 的东西只会重建使用未来的组件。【参考方案4】:

对于 LateInitializationError,只需使用 int? count; 代替 late int count;

【讨论】:

以上是关于颤振:LateInitializationError:字段“名称”尚未初始化的主要内容,如果未能解决你的问题,请参考以下文章

颤振——哎呀;颤振意外退出:“FileSystemException:删除失败,路径='...\.ios')

命令“颤振:新项目”导致错误(找不到命令“颤振.createProject”),我无法在 VSCODE 上调试颤振项目

在你的颤振项目中找不到颤振 sdk 中的飞镖?

颤振给我错误(不知道为啥)(使用颤振和Android Studio)

构建颤振项目时如何将飞镖和颤振设置为默认值

升级颤振后颤振标签栏错误“getter'key'被称为null”