Flutter中如何判断数据库返回数组是否包含指定user_id_liked?
Flutter判断用户是否已点赞帖子的正确实现方式
你当前代码的问题在于,数据库返回的TotalLike是对象数组(每个元素是包含user_id_liked字段的Map),不是单纯的字符串数组,所以用TotalLike.contains("id-2")无法匹配到目标值。
正确实现步骤:
- 给
TotalLike指定明确的类型:List<Map<String, dynamic>> TotalLike = [],避免动态类型带来的问题。 - 使用
List.any()方法遍历数组,检查是否存在user_id_liked等于目标值的对象。 - 优化请求逻辑,去掉冗余的
setState,同时处理请求失败的场景。
修改后的完整代码:
import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; // 替换成你的实际接口地址 const String url = "你的接口URL"; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( primarySwatch: Colors.blue, ), home: const MyHomePage(), ); } } class MyHomePage extends StatefulWidget { const MyHomePage({super.key}); @override State<MyHomePage> createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { // 指定明确的数组类型 List<Map<String, dynamic>> TotalLike = []; Future getLike() async { try { var response = await http.post( Uri.parse(url), body: {"id_post": "post-9d18d0a280"}, ); if (response.statusCode == 200) { setState(() { TotalLike = List<Map<String, dynamic>>.from(json.decode(response.body)); }); print(TotalLike); } else { print("请求失败,状态码:${response.statusCode}"); } } catch (e) { print("请求出错:$e"); } } @override void initState() { getLike(); super.initState(); } @override Widget build(BuildContext context) { // 使用any方法检查是否存在目标user_id_liked bool hasLiked = TotalLike.any((item) => item['user_id_liked'] == "id-2"); return Scaffold( body: Center( child: Container( width: 400, height: 400, color: hasLiked ? Colors.amber : Colors.pink, ), ), ); } }
关键说明:
TotalLike.any((item) => item['user_id_liked'] == "id-2"):遍历数组中的每个对象,只要有一个对象的user_id_liked等于"id-2",就返回true,代表用户已点赞。List<Map<String, dynamic>>.from(json.decode(response.body)):确保解析后的数组类型正确,避免类型转换异常。- 增加了try-catch包裹整个请求逻辑,更全面地处理网络异常。
内容的提问来源于stack exchange,提问作者Meng Qing
相关产品推荐
相关产品推荐

