簡體   English   中英

flutter:LateInitializationError:字段“名稱”尚未初始化

[英]flutter: LateInitializationError: Field 'name' has not been initialized

錯誤:Runner[463:34314] flutter: LateInitializationError: 字段“名稱”尚未初始化。

我最近更新為使用 firebase 核心和 nullsafety 並對我的代碼進行了一些我不太了解的更改,我是這里編程的新手。 無論如何,我已經嘗試在這里閱讀這個類似的線程,但我仍然不太了解它。 我知道我很可能沒有在 initstate 中正確使用名稱,但據我所知就是這樣。 有人可以提供解決以下錯誤所需的示例代碼嗎?

2021-04-10 17:59:41.331476-0700 Runner[463:34314] flutter: LateInitializationError: 字段 'name' 尚未初始化。

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'),
        ),
      ],
    );
  }
}

您應該檢查變量name的可空性。 所以,使用:

String? name;

代替:

late String name

遲到的意思,

我 promise 我稍后會初始化這個變量

但是在構建方法中使用該變量時,這個 promise 並不意味着什么。

findNameAnEmail是一個異步方法,因此,在initState中調用它時,Flutter 在調用build之前不會等待它完成。 這會導致您的后期字段在設置之前被訪問。

為了在構建之前等待Future完成,請考慮使用FutureBuilder

對於LateInitializationError ,只需使用int? count; int? count; 而不是late int count;

我發現要使用的 lateInitializationError 有同樣的問題? 避免它。 如果有人面臨這個問題而不是late嘗試? .

例如:

Gender? selectedGender;

當我遇到同樣的問題時,我使用了 Future Builder snapshot.data 不能是 null 來處理這個只是使用 if block (snapshot.data==null) then return container with child .neter Text('Loading') 直到未來完成屏幕會顯示加載,然后會顯示數據解決方案

我對 flutter 很陌生,但這對我有用。

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

    findNameAndEmail().whenComplete(() {
        setState(() {});
    });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM