Получение ошибки во флаттере:-Геттер был вызван при нуле

# #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. Я не могу подключиться