0

如果触摸心形图标,我想在 Moor 数据库中插入或删除产品类并将心形图标更改为 setState()

插入或删除执行良好,但心形图标似乎没有改变,因为在插入或删除期间已经执行了 setState()。

如果您能告诉我我的方法是否错误,或者是否有比使用“流生成器”更好的方法,我将不胜感激。

感谢您阅读我的问题。

Widget setFavorite() {
ProductsDao productsDao = Provider.of<AppDatabase>(context).productsDao;
return StreamBuilder<List<mf.QueryRow>>(
  stream: productsDao
      .customSelect(
          "SELECT * FROM Products WHERE firestoreid LIKE '${widget.product.firestoreid}'")
      .watch(),
  builder:
      (BuildContext context, AsyncSnapshot<List<mf.QueryRow>> snapshot) {
    if (snapshot.hasError) {
      print(snapshot.error);
      return new Text('Error: ${snapshot.error}');
    }
    switch (snapshot.connectionState) {
      case ConnectionState.waiting:
        return Text("");
      default:
        return Positioned(
          right: 0,
          bottom: 0,
          child: Padding(
            padding: EdgeInsets.all(5),
            child: Row(
              mainAxisAlignment: MainAxisAlignment.end,
              children: <Widget>[
                GestureDetector(
                  onTap: () {
                    setState(() {
                      snapshot.data.isEmpty
                          ? productsDao.insertProduct(this.widget.product)
                          : productsDao.deleteProduct(this.widget.product);
                    });
                  },
                  child: Icon(
                    snapshot.data.isEmpty
                        ? Icons.favorite_border
                        : Icons.favorite,
                    color: Colors.pink,
                  ),
                ),
              ],
            ),
          ),
        );
    }
  },
);

}

4

2 回答 2

0

我不确定您是如何使用插入方法的,但是如果您使用的是提供程序,则需要使用一个可以更新状态并使用 notifiyListeners() 的函数。当您使用通知侦听器时,您甚至不需要 setstate 它会更新所有值。

class AppDatabase extends ChangeNotifier {
  
  ProductsDao _productsDao;
  
  ProductsDao get productsDao => _productsDao;
  
  void insertProduct(value){
     this._productsDao.insertProduct(value);
        notifiyListeners();
      }

void deleteProduct(value){
    this._productsDao.deleteProduct(value);
    notifiyListeners();
  }

    }

现在您应该使用提供程序 insertProduct 来刷新您的值的状态。

Widget setFavorite() {
AppDatabase appState = Provider.of<AppDatabase>(context);
return StreamBuilder<List<mf.QueryRow>>(
  stream: appState.productsDao
      .customSelect(
          "SELECT * FROM Products WHERE firestoreid LIKE '${widget.product.firestoreid}'")
      .watch(),
  builder:
      (BuildContext context, AsyncSnapshot<List<mf.QueryRow>> snapshot) {
    if (snapshot.hasError) {
      print(snapshot.error);
      return new Text('Error: ${snapshot.error}');
    }
    switch (snapshot.connectionState) {
      case ConnectionState.waiting:
        return Text("");
      default:
        return Positioned(
          right: 0,
          bottom: 0,
          child: Padding(
            padding: EdgeInsets.all(5),
            child: Row(
              mainAxisAlignment: MainAxisAlignment.end,
              children: <Widget>[
                GestureDetector(
                  onTap: () {
                    setState(() {
                      snapshot.data.isEmpty
                          ? appState.insertProduct(this.widget.product)
                          : appState.deleteProduct(this.widget.product);
                    });
                  },
                  child: Icon(
                    snapshot.data.isEmpty
                        ? Icons.favorite_border
                        : Icons.favorite,
                    color: Colors.pink,
                  ),
                ),
              ],
            ),
          ),
        );
    }
  },
);

这将刷新您在 ui 中的值。

希望它有所帮助。

于 2020-11-23T15:33:56.963 回答
0

您可以尝试使用 await 等待数据库完成:

          onTap: () async {
              snapshot.data.isEmpty
                  ? await productsDao.insertProduct(this.widget.product)
                  : await productsDao.deleteProduct(this.widget.product);
            setState(() {}
            });
          },
于 2020-11-23T15:34:25.683 回答