Flutter 如何在颤振中执行moor的insert或delete后运行setState()
如果触摸heart图标,我想在Moor数据库中插入或删除product类,并将heart图标更改为setState() 插入或删除操作执行得很好,但心脏图标似乎没有改变,因为在插入或删除过程中已执行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
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对象.