Неудачное утверждение: булево выражение не должно быть нулевым с моделью области действия на флаттере - PullRequest
0 голосов
/ 05 января 2020

Я пытаюсь создать функцию, используя модель с областью видимости, в которой будет иконка favour_border, а когда она нажата, изменится на иконку избранного. Кроме того, счетчик приращений будет показывать количество лайков от данных из базы данных зрителю. Я пытаюсь использовать модель с областью действия, чтобы сделать эту функцию, но я получаю сообщение об ошибке «Неудачное утверждение: логическое выражение не должно быть нулевым». Есть идеи по этому вопросу?

class LikesModel extends Model {

DocumentSnapshot snapshot;

bool liked = false;

static LikesModel of(BuildContext context) =>
  ScopedModel.of<LikesModel>(context);


bool isLiked() {

 liked = true;
 notifyListeners();

}

void pressed(){
liked = !liked;
notifyListeners();
}

void changeLikes() {
Firestore.instance
    .collection(snapshot.documentID)
    .document(snapshot.documentID)
    .updateData({'likes': FieldValue.increment(liked ? 1 : -1)});
notifyListeners();
}
}

class LanchonetesContact extends StatefulWidget {

final DocumentSnapshot lanchonetes;

LanchonetesContact(this.lanchonetes);

@override
_LanchonetesContactState createState() => _LanchonetesContactState();
}

class _LanchonetesContactState extends State<LanchonetesContact> {


@override
Widget build(BuildContext context) {
return Padding(
              padding: EdgeInsets.only(top: 0.0),
              child: Card(
                  elevation: 1.0,
                  child: GestureDetector(
                      child: Container(
                        height: 70.0,
                        width: 390.0,
                        color: Colors.white,
                        child: Row(
                          children: <Widget>[
                            Icon(
                              LikesModel.of(context).isLiked() ?       
                                Icons.favorite : Icons.favorite_border,
                              color: LikesModel.of(context).isLiked() ?   
                              Colors.red : Colors.black,
                              size: 50.0,
                            ),

                            StreamBuilder(
                               stream: Firestore.instance
                               .collection('lanchonetes')
                               .document(widget.lanchonetes.documentID)
                               .snapshots(),
                               builder: (context, snapshot) => Text(
                               snapshot.data.data["likes"].toString(),
                                  style: TextStyle(fontSize: 40.0),
                                ) 
                            ),
                          ],
                          mainAxisAlignment: MainAxisAlignment.center,
                        ),
                      ),
                      onTap: () {
                        LikesModel.of(context).changeLikes();
                        LikesModel.of(context).pressed();

                      }

                  ))


          ),

Ответы [ 2 ]

2 голосов
/ 05 января 2020

Добро пожаловать в основную концепцию управления состоянием, стандартное setState для виджета сохраняет состояние только до тех пор, пока виджет не будет ликвидирован (что происходит при навигации в вашем случае.) Вам нужно иметь состояние приложения вместо состояния виджета, Прочитайте один из различных методов управления состоянием, например BLO C, Redux, Provider et c. Что они делают, так это сохраняют состояние для приложения или для любого виджета, который я должен сказать, даже когда вы удаляете виджет или перемещаетесь.

1 голос
/ 06 января 2020

Я не совсем понимаю цель isLiked(), но он ничего не возвращает и ожидается, что будет возвращен bool

bool isLiked() {

 liked = true;
 notifyListeners();

}

Это приводит к ошибке здесь, в коде ниже, так как LikesModel.of(context).isLiked() возвращает ноль и bool в условном операторе (? :) не может быть нулем

Icon(
   LikesModel.of(context).isLiked() ?       
    Icons.favorite : Icons.favorite_border,
    color: LikesModel.of(context).isLiked() ?   
      Colors.red : Colors.black,
    size: 50.0,
),

Если вы просто хотите проверить liked, вам нужно просто сделать

bool isLiked() => liked;

или даже чище

bool get isLiked => liked; // Возможно, было бы лучше сделать liked приватным: _liked.

...