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

如何修复Flutter报错type 'null' is not a subtype of type 'map string dynamic '

问题原因与修复方案

报错根源

  • 你调用的地震API返回的根结构是JSON对象,不是数组,原代码中json[0]取值为null,将null传入要求Map<String,dynamic>类型的Album.fromJson方法,直接触发type 'null' is not a subtype of type 'Map<String, dynamic>'报错。
  • 额外兼容问题:API返回的events字段是地震事件数组类型,原代码中将其定义为String类型,即使解决第一个报错后续也会出现类型不匹配问题。

修正代码

1. 调整接口请求方法与实体类定义

import 'dart:async';
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;

// 调整请求方法,直接返回地震事件列表
Future<List<Event>> getEarthquakeEvents() async {
  final response = await http.get(Uri.parse('https://cdn.knmi.nl/knmi/map/page/seismologie/all_induced.json'));
  if (response.statusCode == 200) {
    final json = jsonDecode(response.body);
    List eventsJson = json['events'] as List;
    return eventsJson.map((item) => Event.fromJson(item)).toList();
  } else {
    throw Exception("请求失败,状态码:${response.statusCode}");
  }
}

// 替换原Album类,定义符合API返回结构的Event实体
class Event {
  final String place;
  final double mag;
  final String time;
  final double lat;
  final double lon;

  Event({
    required this.place,
    required this.mag,
    required this.time,
    required this.lat,
    required this.lon,
  });

  factory Event.fromJson(Map<String, dynamic> json) {
    return Event(
      place: json['place'] as String,
      mag: json['mag'] as double,
      time: json['time'] as String,
      lat: json['lat'] as double,
      lon: json['lon'] as double,
    );
  }
}

2. 调整页面逻辑适配列表返回

将原页面中Future<Album>? _futureAlbum改为Future<List<Event>>? _futureEvents,调整按钮点击时的赋值逻辑,以及FutureBuilder的实现:

// 按钮点击逻辑
onPressed: () {
  setState(() {
    _futureEvents = getEarthquakeEvents();
  });
},

// FutureBuilder实现
FutureBuilder<List<Event>> buildFutureBuilder() {
  return FutureBuilder<List<Event>>(
    future: _futureEvents,
    builder: (context, snapshot) {
      if (snapshot.hasData) {
        return ListView.builder(
          itemCount: snapshot.data!.length,
          itemBuilder: (context, index) {
            Event event = snapshot.data![index];
            return ListTile(
              title: Text(event.place),
              subtitle: Text("震级:${event.mag} | 时间:${event.time}"),
            );
          },
        );
      } else if (snapshot.hasError) {
        return Text('${snapshot.error}');
      }
      return const CircularProgressIndicator();
    },
  );
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 10:24:04