Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.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
Flutter 如何在颤振中执行moor的insert或delete后运行setState()_Flutter_Dart_Setstate_Flutter Moor - Fatal编程技术网

Flutter 如何在颤振中执行moor的insert或delete后运行setState()

Flutter 如何在颤振中执行moor的insert或delete后运行setState(),flutter,dart,setstate,flutter-moor,Flutter,Dart,Setstate,Flutter Moor,如果触摸heart图标,我想在Moor数据库中插入或删除product类,并将heart图标更改为setState() 插入或删除操作执行得很好,但心脏图标似乎没有改变,因为在插入或删除过程中已执行setState() 如果您能告诉我我的方法是否错误,或者是否有比使用“流生成器”更好的方法,我将不胜感激 谢谢你阅读我的问题 Widget setFavorite() { ProductsDao productsDao = Provider.of<AppDatabase>(context

如果触摸heart图标,我想在Moor数据库中插入或删除product类,并将heart图标更改为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,
                  ),
                ),
              ],
            ),
          ),
        );
    }
  },
);
Widget setFavorite(){
ProductsDao ProductsDao=Provider.of(context).ProductsDao;
返回流生成器(
流:productsDao
.customSelect(
“从firestoreid类似${widget.product.firestoreid}”的产品中选择*)
.watch(),
建设者:
(BuildContext上下文,异步快照){
if(snapshot.hasError){
打印(快照错误);
返回新文本('Error:${snapshot.Error}');
}
交换机(快照.连接状态){
案例连接状态。正在等待:
返回文本(“”);
违约:
返回定位(
右:0,,
底部:0,
孩子:填充(
填充:边缘设置。全部(5),
孩子:排(
mainAxisAlignment:mainAxisAlignment.end,
儿童:[
手势检测器(
onTap:(){
设置状态(){
snapshot.data.isEmpty
?productsDao.insertProduct(this.widget.product)
:productsDao.deleteProduct(this.widget.product);
});
},
子:图标(
snapshot.data.isEmpty
?图标。最喜爱的\u边框
:Icons.favorite,
颜色:颜色。粉红色,
),
),
],
),
),
);
}
},
);

}

我不确定如何使用插入方法,但如果您使用的是提供程序,则需要使用一个函数来更新状态并使用NotifyListeners()。 当您使用notifylisteners时,您甚至不需要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,
                  ),
                ),
              ],
            ),
          ),
        );
    }
  },
);
Widget setFavorite(){
AppDatabase appState=Provider.of(上下文);
返回流生成器(
流:appState.productsDao
.customSelect(
“从firestoreid类似${widget.product.firestoreid}”的产品中选择*)
.watch(),
建设者:
(BuildContext上下文,异步快照){
if(snapshot.hasError){
打印(快照错误);
返回新文本('Error:${snapshot.Error}');
}
交换机(快照.连接状态){
案例连接状态。正在等待:
返回文本(“”);
违约:
返回定位(
右:0,,
底部:0,
孩子:填充(
填充:边缘设置。全部(5),
孩子:排(
mainAxisAlignment:mainAxisAlignment.end,
儿童:[
手势检测器(
onTap:(){
设置状态(){
snapshot.data.isEmpty
?appState.insertProduct(this.widget.product)
:appState.deleteProduct(this.widget.product);
});
},
子:图标(
snapshot.data.isEmpty
?图标。最喜爱的\u边框
:Icons.favorite,
颜色:颜色。粉红色,
),
),
],
),
),
);
}
},
);
这将刷新ui中的值


希望有帮助。

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

          onTap: () async {
              snapshot.data.isEmpty
                  ? await productsDao.insertProduct(this.widget.product)
                  : await productsDao.deleteProduct(this.widget.product);
            setState(() {}
            });
          },

谢谢你的回答。但是,图标仍然没有改变。还有其他方法吗?也许你应该使用状态管理插件。我使用MobX,当更新我的Moor数据库时,我调用MobX函数和MobX,验证值,将其存储并更改到UIT上感谢你的回答。提供者用于访问Moor da中的productDao类tabase.没有其他操作您应该在appdatabase中创建一个方法,该方法将使用新值获取插入,并将其插入到您拥有的列表中,然后调用NotifyListeners。我已使用代码更新了我的答案,这将使您刷新ui。您必须使用提供程序来刷新它,而不是ProductsDao对象.