Flutter 'List<dynamic>' 不是 'Map<String, dynamic>' 类型的子类型

问题描述 投票:0回答:3

我目前正在构建一个从 Api 获取数据的 Flutter 应用程序,但是当我运行该应用程序时,我收到错误 Flutter 'List' 不是类型 'Map' 的子类型。这是我的代码

    class NewsData with ChangeNotifier 
{

  Map<String,dynamic> _map = {};
  bool _error = false;
  String _errorMessage = '';

  Map<String,dynamic> get map => _map;
  bool get error => _error;
  String get errorMessage => _errorMessage;

  Future<void> get fetchdata async {
    final response = await get(Uri.parse('https://script.google.com/macros/s/AKfycbz3ZmaMiTgR-y70MEE1v9VPz2QtmNzwnnnnnnn/exec'),);
   if (response.statusCode == 200)
    {
    try
     {
       _map = jsonDecode(response.body);
       _error = false;
     }
     catch(e) {
       _error = true;
       _errorMessage = e.toString();
       _map = {};
     }
   }
   else
   {
    _error = true; 
    _errorMessage = 'Error :it could be your internet connection ';
       _map = {};
   }
    notifyListeners();
  }
  void initialValues()
  {
    _map = {};
    _error = false;
    _errorMessage = '';
     notifyListeners();
  }
}


stories.dart

class Storiespage extends StatelessWidget {
  const Storiespage({ Key? key }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    context.read<NewsData>().fetchdata;
    return Scaffold(
     appBar: AppBar(
       actions: [
         IconButton(
           icon: Icon(Icons.refresh),
           onPressed:() {
             context.read<NewsData>().initialValues();
              context.read<NewsData>().fetchdata;
           },
         )
       ],
       title: Text('ggg'),
     ),
     body: RefreshIndicator(
       onRefresh: () async {
        await context.read<NewsData>().fetchdata;
       },
       child: Center(
        child: Consumer<NewsData>(
        builder: (context, value, child) {
          return value.map.length == 0 && !value.error 
          ? CircularProgressIndicator() 
          : value.error ? Text('oops,something went wrong ${value.errorMessage}'
          ,textAlign: TextAlign.center,) : 
          ListView.builder(
            itemCount: value.map['feedback'].length,
            itemBuilder: (context,index) {
            
            
            return Newscard(map: value.map['feedback'][index]);
          },
          );
        },
        ),
       ),
     ), 
    );
  }
}

class Newscard extends StatelessWidget {
  const Newscard({ Key? key,required this.map }) : super(key: key);
final Map<String,dynamic> map;
  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(8.0),
      child: Card(
        elevation:10 ,
        child: Padding(
          padding: const EdgeInsets.all(8.0),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Image.network('${map['image']}'),
            SizedBox(
              height: 10,
            ),
            Text('${map['heading']}'
            ),
           SizedBox(
              height: 10,
            ),
              Text('${map['story']}'
            ),
            ],
            
          ),
        ),
      ),
    );
  }
}

和 json 文件 [ {“标题”:“欣赏”,“故事”:2021,“日期”:“世界”,“图像”:“01/A0000/06”},{“标题”:“欣赏”,“故事”:2021 ,"date":"世界","image":"01/A0000/06"},{"heading":"标题","story":"story","date":"date","image" :“图像”}]

json flutter http provider
3个回答
9
投票

发生错误是因为您的 API 返回了

List
,正如您在 json 文件中看到的那样。使用
jsonDecode
后,您的解码类型为
List<dynamic>
。 要解决您的问题,您必须将
type
_map
更改为
List<dynamic>
。 如果您想拥有
List<Map<String, dynamic>>
类型,您可以执行以下操作。

List<Map<String, dynamic>> map = [];
...
_map = List<Map<String, dynamic>>.from(jsonDecode(response.body));

0
投票

_map 是一个 Map 变量,这意味着它可以用来存储单个地图元素。但是响应的 jsonDecode 的结果将是一个 Map 列表。因此将 _map 的声明更改为

列表> _map; 或者简单地 列出_地图;


0
投票

只需将

map<String,dynamic>
更改为
List<dynamic>
即可开始。

© www.soinside.com 2019 - 2024. All rights reserved.