Eroor:类型'_InternalLinkedHashMap <string,dynamic =“”>'不是强制类型转换

时间:2019-05-01 00:19:00

标签: json rest api flutter

我是Flutter的新手,我尝试从“ 10.0.2.2:8000/api/membres”上的api中获取数据,但出现类似“列表动态”的错误,而不是“列表”类型的子类型。 我以抖动为例:https://flutter.dev/docs/cookbook/networking/fetch-data#complete-example

请帮助我遵循一个有用的教程,并告诉我如何解决此代码。

MyHomePage.dart

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

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key key}) : super(key: key);

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  static const url = "10.0.2.2:8000/api/membres";

  Future<List<Map<String, dynamic>>> _future;
  @override
  void initState() {
    super.initState();
    _future = fetch();
  }

  Future<List<Map<String, dynamic>>> fetch() {
    return http
        .get("http://10.0.2.2:8000/api/membres")
        .then((response) {
          return response.statusCode == 200
              ? response.body
              : throw 'Error when getting data';
        })
        .then((body) => json.decode(body)) //
        .then((list) => (list as List).cast<Map<String, dynamic>>());
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home'),
      ),
      body: RefreshIndicator(
        onRefresh: () async {
          _future = fetch();
          setState(() {});
          return _future;
          },
        child: FutureBuilder<List<Map<String, dynamic>>>(
          future: _future,
          builder: (context, snapshot) {
            if (snapshot.hasError) {
              return Center(
                child: Container(
                  constraints: BoxConstraints.expand(),
                  child: SingleChildScrollView(
                    physics: AlwaysScrollableScrollPhysics(),
                    child: Text(snapshot.error.toString()),),),);}
            if (!snapshot.hasData) {
              return Center(
                child: CircularProgressIndicator(),
              );}
            return ListView.builder(
              itemCount: snapshot.data.length,
              itemBuilder: (BuildContext context, int index) {
                final item = snapshot.data[index];
                return ListTile(
                  title: Text(item['nom']),
                  subtitle: Text(item['prenom']),
                );
              },
            );
          },
        ),
      ),
    );
  }
}

我用Postman测试了API,并且可以正常工作:

enter image description here

这是错误: enter image description here

在模拟器中:

enter image description here

1 个答案:

答案 0 :(得分:1)

您有几个问题...

您可能应该将fetch整理为async

Future<Map<String, dynamic>> fetch() async {
  http.Response response = await http.get('http://10.0.2.2:8000/api/membres');
  if (response.statusCode != 200) return null;
  return json.decode(response.body);
}

如果您查看邮递员提供的json,您会看到最上面的项目是地图-至少有一个键membres。该键似乎包含其他地图的列表。从您的类型看来,您希望获得该列表。

如果该假设是正确的,则可以如下进行调整:

Future<List<Map<String, dynamic>>> fetch() async {
  http.Response response = await http.get('http://10.0.2.2:8000/api/membres');
  if (response.statusCode != 200) return null;
  return List<Map<String, dynamic>>.from(json.decode(response.body)['membre']);
}