У меня проблема с начальным значением пользователя.
У меня есть исходники такого типа: "https:// paste.ofcode.org/ycHT4YFsDGSQXa68JiKJRH"
важные строки в ссылках:
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
height: 240,
child: FutureBuilder(
future: getCurrentUser(),
builder: (context, snapshot) {
return ListView.separated(
itemBuilder: (context, index) {
print(index);
return GetUserName(documentId: user?.uid);
},
separatorBuilder: (context, index) {
return SizedBox(width: 10);
},
itemCount: myCards.length,
shrinkWrap: true,
scrollDirection: Axis.horizontal,
);
}),
У меня тоже есть этот класс,
class GetUserName extends StatelessWidget {
final String documentId;
final int index = 0;
GetUserName({
required this.documentId,
});
@override
Widget build(BuildContext context) {
// get the collection
CollectionReference users = FirebaseFirestore.instance.collection('Users');
return FutureBuilder<DocumentSnapshot>(
future: users.doc(documentId).get(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
Map<String, dynamic> data =
snapshot.data!.data() as Map<String, dynamic>;
return MyCard(
userName: data['username'],
card: myCards[index],
);
// Text('First Name: ${data['username']}');
} else {
print("here");
return MyCard(
userName: "Waiting",
card: myCards[index],
);
}
return Text('loading..');
},
);
}
}
Я использую FutureBuilder в строке 90th
, и его будущее значение равно getCurrentUser()
эта функция создает это значение user = await _auth.currentUser;
и я даю параметр user?.uid в функции GetUserName в строке 96 (цель: дать текущий идентификатор пользователя для GetUserName).
Я успешно вижу текущее имя пользователя в MyCard, но также есть ошибка
======== Exception caught by widgets library =======================================================
The following LateError was thrown building:
LateInitializationError: Field 'user' has not been initialized.
Как я могу решить эту проблему ?
Это пришло от пользователя = await _auth.currentUser; в начальном состоянии этот пользователь получает Текущего пользователя. И я использую user.uid в Futurebuilder.
Используйте User? user
вместо late final user
, чтобы иметь возможность проверить нулевое значение до загрузки пользователя. И в вашем методе getCurrentUser()
, когда пользователь извлекается, используйте setState для обновления пользователя и текущего состояния:
Future getCurrentUser() async {
final loadedUser = await _auth.currentUser;
if (loadedUser != null) {
setState(() {
user = loadedUser;
});
}
}
Спасибо за ваш ответ, но когда я использую это, я получаю ошибку в этой строке GetUserName(documentId: user?.uid); Ошибка: тип аргумента «Строка?» не может быть присвоен типу параметра «Строка».
Затем вы выполняете нулевую проверку, что-то вроде этого: if(user != null){ return GetUserName(documentId: user!.uid); } else { return "Пользователь не найден"; }
и когда я использую заданное состояние в стеке приложения getCurrentUser в цикле, Futurebuilder также вызывает этот пользовательский setState getCurrent, который все еще нужен?
setState не нужен для Futurebuilder, и, поскольку getCurrentUser также вызывается только во время initState, setState вообще не нужен, вы правы. Также немного нелогично вызывать getCurrentUser как в initState, так и в Futurebuilder, только одного из них должно быть достаточно.
Каково значение
user.uid
в строке 96?