Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
失败的断言:布尔表达式不能为null,且作用域模型在flutter上_Flutter_Scoped Model - Fatal编程技术网

失败的断言:布尔表达式不能为null,且作用域模型在flutter上

失败的断言:布尔表达式不能为null,且作用域模型在flutter上,flutter,scoped-model,Flutter,Scoped Model,我正在尝试使用作用域模型创建一个函数,该模型将有一个收藏夹边框图标,当按下该图标时,会更改为收藏夹图标。此外,增量计数器将向查看器显示firebase数据中的like数。我试图使用作用域模型来创建此函数,但得到的错误是断言失败:布尔表达式不能为null。对这个问题有什么想法吗 class LikesModel extends Model { DocumentSnapshot snapshot; bool liked = false; static LikesModel of(BuildCo

我正在尝试使用作用域模型创建一个函数,该模型将有一个收藏夹边框图标,当按下该图标时,会更改为收藏夹图标。此外,增量计数器将向查看器显示firebase数据中的like数。我试图使用作用域模型来创建此函数,但得到的错误是断言失败:布尔表达式不能为null。对这个问题有什么想法吗

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();

                      }

                  ))


          ),

欢迎使用状态管理的核心概念,小部件的默认设置状态仅在小部件被释放之前保持状态,这在您的案例中是在导航时发生的。 您需要有一个应用程序状态而不是小部件状态,读取各种状态管理技术之一,即BLOC、Redux、Provider等。
它们所做的是保留应用程序或任何小部件的状态,即使在您处理小部件或导航时也是如此。

我不完全理解isLiked的目标,但它不会返回任何内容,并且预计会返回bool

布尔岛{ 喜欢=真实; 通知听众; } 这会在下面的代码中抛出一个错误,就像model.ofcontext.isLiked在条件运算符中返回null和bool一样?:不能为null

如果你只是想检查一下,你应该这样做

bool isLiked=>喜欢

甚至更干净


bool get islike=>喜欢//也许将liked设置为private会更好:_liked.

除了状态管理技术之外,您还可以将变量存储在您的最大父窗口小部件中,并将变量和函数向下传递给子窗口小部件。isLiked应该检查liked==bool,而不是将liked更新为true,如果您的目标是将其重命名函数更新为updateLiked或SetLike以使其更清晰,您能告诉我们哪一行给出了错误吗?谢谢@Yudhishthir,我正在尝试使用作用域模型,我可以理解它的概念,但我仍然有困难。我用我的结果编辑了我的问题。谢谢Jaime,它起作用了,这个检查是我遗漏的。
Icon(
   LikesModel.of(context).isLiked() ?       
    Icons.favorite : Icons.favorite_border,
    color: LikesModel.of(context).isLiked() ?   
      Colors.red : Colors.black,
    size: 50.0,
),