You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter解决List<dynamic>非Map<String,dynamic>子类型并展示name列表

解决Flutter中type 'List<dynamic>' is not a subtype of type 'Map<String, dynamic>'错误

问题根源

API返回的是JSON数组(列表),但当前代码尝试将其解析为单个Workouts_Model对象,导致类型不匹配。

修改步骤

1. 更新API调用代码

将fetchUserWorkout的返回类型改为Future<List<Workouts_Model>>,并使用模型中已有的列表解析方法处理返回数据:

static Future<List<Workouts_Model>> fetchUserWorkout() async {
  var url = Uri.parse(Config.apiURL + Config.userWorkoutsAPI);

  final response = await http.get(
    url,
    headers: {
      HttpHeaders.authorizationHeader:
          'Token XXXXXXXXXXXXXXX',
    },
  );

  final responseJson = jsonDecode(response.body);
  print(responseJson);

  if (response.statusCode == 200) {
    return workoutsModelFromJson(response.body);
  } else {
    throw Exception('Failed to load User');
  }
}

2. 更新HomeScreen中的Future类型

把页面内的futureWorkouts类型改为Future<List<Workouts_Model>>,匹配API方法的返回值:

class _HomeScreenState extends State<HomeScreen> {
  late Future<List<Workouts_Model>> futureWorkouts;

  @override
  void initState() {
    super.initState();
    futureWorkouts = APIService.fetchUserWorkout();
  }
  // 其他原有代码
}

3. 修改FutureBuilder展示列表

将FutureBuilder的泛型改为List<Workouts_Model>,并通过ListView渲染所有name字段:

FutureBuilder<List<Workouts_Model>>(
  future: futureWorkouts,
  builder: (context, snapshot) {
    if (snapshot.hasData) {
      return ListView.builder(
        itemCount: snapshot.data!.length,
        itemBuilder: (context, index) {
          return ListTile(
            title: Text(snapshot.data![index].name ?? 'noname'),
          );
        },
      );
    } else if (snapshot.hasError) {
      print(snapshot.error);
      return Text('${snapshot.error}');
    }
    return const CircularProgressIndicator();
  },
),

4. 模型代码无需修改

你的模型代码已经包含了正确的列表解析方法workoutsModelFromJson,可以直接将JSON数组转换为List<Workouts_Model>,保持原样即可。

内容的提问来源于stack exchange,提问作者Shiko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 14:20:34