Flutter如何修改布尔字段值并保存到数据库?收藏星标切换功能实现求助
修复方案
1. 补全收藏更新接口的传参逻辑
你当前的setFavorite方法仅发送了空PUT请求,没有将需要修改的节点ID、收藏状态传递给后端,无法完成数据库更新,先修改该方法:
Future<Favorite> setFavorite(String nodeId, bool favorite) async{ var requestHeaders = <String, String>{ "Content-type": "application/json", "Accept": "application/json", "Authorization": "Bearer 你的授权token" }; final response = await http.put( // 如果接口要求nodeId拼接在请求地址里,可修改为Uri.parse('$URL_SETFAVORITE/$nodeId') Uri.parse(URL_SETFAVORITE), headers: requestHeaders, // 新增请求体,传递要更新的参数 body: jsonEncode({ "nodeId": nodeId, "favorite": favorite }), ); if (response.statusCode == 200) { return Favorite.fromJson(json.decode(response.body)); } else { throw Exception('更新收藏状态失败'); } }
2. 调整星星控件的渲染逻辑
不要单独定义isStar变量,直接绑定每个收藏项对应Favorite对象的favorite属性,需要在收藏状态为false时隐藏控件的话,直接加判断条件即可:
// 假设当前列表项对应的收藏对象变量名为item,类型为Favorite if (item.favorite) // 仅收藏状态为true时展示星星控件 SizedBox( height: 30, child: Padding( padding: EdgeInsets.only(left: 114, top: 7), child: IconButton( padding: EdgeInsets.zero, icon: Icon( Icons.star, color: Colors.amber, size: 25 ), onPressed: () async { // 先保存旧状态,接口调用失败时可回滚 bool oldStatus = item.favorite; // 乐观更新本地UI,提升用户体验 setState(() { item.favorite = !item.favorite; }); try { // 同步状态到后端数据库 await setFavorite(item.nodeId, item.favorite); } catch (e) { // 接口调用失败,回滚本地状态 setState(() { item.favorite = oldStatus; }); // 可按需添加错误提示 ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text('收藏状态更新失败,请重试')) ); } } ), ) )
3. 列表绑定注意事项
页面中用一个List<Favorite>类型的变量存储fetchFavorite拉取到的收藏列表数据,每次拉取数据后更新该变量再调用setState刷新列表即可,不需要单独维护每个条目的状态。
内容的提问来源于stack exchange,提问作者Huu Hung Do
相关产品推荐
相关产品推荐

