# #flutter #dart #google-cloud-firestore #flutter-layout
Вопрос:
Я пытаюсь получить максимальное расстояние, выбранное пользователем, и продолжаю получать эту ошибку. Это полный код от того места, где я получаю свои данные, до того места, где я их отображаю. И в Cloud Firestore также сохраняются данные, но я не знаю, почему я не могу отобразить эти данные здесь. Пожалуйста, помогите мне. Спасибо.И я получаю эту ошибку:-
The getter 'maxDistance' was called on null.
Receiver: null
Tried calling: maxDistance
Это экран, на котором я его называю:-
class More extends StatefulWidget{
final CreateAccountData currentUser;
More({this.currentUser,}) ;
@override
_MoreState createState() => new _MoreState();
}
class _MoreState extends State<More>
with SingleTickerProviderStateMixin{
Map<String, dynamic> changeValues = {};
final auth = FirebaseAuth.instance;
int distance;
String currentuser;
int freeR;
int paidR;
@override
void initState() {
super.initState();
freeR = 500;
paidR = 500;
setState(() {
if (widget.currentUser.maxDistance > freeR) {
widget.currentUser.maxDistance = freeR.round();
changeValues.addAll({'maximum_distance': freeR.round()});
} else if (
widget.currentUser.maxDistance >= paidR) {
widget.currentUser.maxDistance = paidR.round();
changeValues.addAll({'maximum_distance': paidR.round()});
}
distance = widget.currentUser.maxDistance.round();
});
}
@override
void dispose() {
super.dispose();
if (changeValues.length > 0) {
updateData();
}
}
Future updateData() async {
FirebaseFirestore.instance
.collection("users")
.doc(widget.currentUser.uid)
.set(changeValues,SetOptions( merge: true));
}
Вот где я показываю:-
Padding(
padding: const EdgeInsets.all(10.0),
child: Card(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: ListTile(
title: Text(
"Maximum distance",
style: TextStyle(
fontSize: 18,
color: mRed,
fontWeight: FontWeight.w500),
),
trailing: Text(
"$distance Km.",
style: TextStyle(fontSize: 16),
),
subtitle: Slider(
value: distance.toDouble(),
inactiveColor: Colors.blueGrey,
min: 1.0,
max: 500,
activeColor: mRed,
onChanged: (val) {
changeValues
.addAll({'maximum_distance': val.round()});
setState(() {
distance = val.round();
});
}),
),
),
),
),
This is MODEL class from where I am getting my data:-
class CreateAccountData {
final String name, email,DOB,age,uid,username, countryCode ,
address,phone, password,profilepic,showGender,gender;
final Map coordinates,editInfo,ageRange;
final List hobbies ;
int maxDistance;
var distanceBW;
CreateAccountData({this.name,this.email,this.DOB,this.age,
this.username,this.uid,this.countryCode,this.address,
this.phone, this.password,this.profilepic,this.coordinates,
this.hobbies,this.gender,this.showGender,this.ageRange,this.maxDistance,
this.editInfo,this.distanceBW});
factory CreateAccountData.fromJson(Map<String, dynamic> json) {
return CreateAccountData(
name: json['name'],
email: json['email'],
age:json['age'],
DOB:json['DOB'],
gender: json['gender'],
hobbies: json['hobbies']['list'],
address: json['location']['address'],
coordinates: json['location'],
username:json['username'],
uid:json['uid'],
editInfo:json['editInfo'],
maxDistance:json['maximum_distance'],
showGender:json['showGender'],
phone: json['phone'],
profilepic : json['profilepic']
);
}
factory CreateAccountData.fromDocument(DocumentSnapshot doc){
return CreateAccountData(
uid: doc['uid'],
phone: doc['phone'],
name: doc['name'],
editInfo: doc['editInfo'],
ageRange: doc['age_range'],
showGender: doc['showGender'],
maxDistance: doc['maximum_distance'],
age:doc['age'],
address: doc['location']['address'],
coordinates: doc['location'],
);
}
Map<String, dynamic> toMap() {
return {
'name':name,
'email': email,
'age': age,
'username':username,
'DOB':DOB,
'gender':gender,
'uid':uid,
'showGender':showGender,
'address':address,
'editInfo':editInfo,
'hobbies':hobbies,
'location':coordinates,
'maximum_distance':maxDistance,
'phone' : phone,
'profilepic':profilepic,
};
}
}
Нижний экран навигации, с которого пользователь переключается на другие вкладки:-
class BottomNav extends StatefulWidget {
@override
_BottomNavState createState() => _BottomNavState();
}
class _BottomNavState extends State<BottomNav> {
int _index = 0;
List<Widget> _items = [
Home(),
UserProfile(FirebaseAuth.instance.currentUser,imageList: [],currentIndex:0),
Notifications(),
Chat(),
More(),
];
Попробовал передать CurrentUser в More():-
Тогда это дает мне это:-
The argument type 'Type' can't be assigned to the parameter type 'CreateAccountData.
Undefined name 'currentUser'.
Комментарии:
1. Можете ли вы опубликовать код экрана, на который осуществляется переход
More
? Вам нужно передатьcurrentUser
More
кому .2. обновлено, пожалуйста, проверьте, может быть, я передаю это неправильно, пожалуйста, направьте меня.
Ответ №1:
пожалуйста, проверьте эту строку с точками отладки
if (widget.currentUser.maxDistance > freeR) {
Я думаю, что текущий пользователь здесь равен нулю, если да, это может решить вашу проблему
измените вторую строку в этом на
class More extends StatefulWidget{
final CreateAccountData currentUser;
More({this.currentUser,}) ;
к этому
CreateAccountData currentUser = CreateAccountData();
если это не устранило вашу проблему, убедитесь, что вы отправляете текущего пользователя в этот виджет
Комментарии:
1. Да, я думаю, что текущий пользователь не зайдет в этот виджет. Как я могу это сделать? Где и какие изменения мне нужно внести?
2. вы проверили это, как я уже сказал? потому что final CreateAccountData текущий пользователь; строка может создать много проблем… но если вы хотите убедиться, что вернулись к виджету, который вы называете Дополнительным виджетом… посмотрите, отправляете ли вы вообще что-нибудь? если да, проверьте его с помощью точек отладки, чтобы убедиться, что он не пустой или пустой
3. Если я изменю имя «CreateAccountData» на «Пользователь», то я получу еще одну ошибку, которая :- Получатель «maxDistance» не определен для типа «Пользователь».
4. Да, я пробовал это:- CreateAccountData Текущий пользователь = CreateAccountData(); это не сработало.
5. хорошо, поэтому проверьте, отправляете ли вы что-либо в этот виджет или нет
Ответ №2:
отладка текущего пользователя. Я думаю, что вы не передали текущего пользователя на эту страницу.
widget?.currentUser?.maxDistance != null
проверьте вот так
setState(() {
if(widget?.currentUser?.maxDistance != null){
if (widget.currentUser.maxDistance > freeR) {
widget.currentUser.maxDistance = freeR.round();
changeValues.addAll({'maximum_distance': freeR.round()});
} else if (
widget.currentUser.maxDistance >= paidR) {
widget.currentUser.maxDistance = paidR.round();
changeValues.addAll({'maximum_distance': paidR.round()});
}
distance = widget.currentUser.maxDistance.round();
} else {
print('currentUser is null ${widget?.currentUser?.maxDistance}')
}
});
Комментарии:
1. да, ничего не печатается. как я могу это сделать ?
2. Хорошо. Это подло,
widget?.currentUser?.maxDistance != null
это правда. верно?3. помогите мне, пожалуйста. могу ли я поделиться своим экраном на любом сервисе.. сильно застрял в нем..
4. откуда у вас эта ошибка? ` Получатель ‘maxDistance’ был вызван при нуле.`
5. Я не могу подключиться