![](/img/trans.png)
[英]Flutter Dart - LateInitializationError: Field 'playerSnapshot' has not been initialized
[英]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.