首页 > 解决方案 > 如何修复以下_CastError被抛出构建:类型'Future' 不是类型 'List 的子类型' 在类型转换中

问题描述

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

class Gallery extends StatefulWidget {

@override
_GalleryState createState() => _GalleryState();

}

class _GalleryState extends State<Gallery> {

pic() async {

var url = "http://120.76.247.131:8081/findAllImages";
var response = await http.get(Uri.parse(url));
return json.decode(response.body);
}
@override
void initState() {
super.initState();
pic();
 }
@override
Widget build(BuildContext context) {
return Scaffold(
  appBar: AppBar(
    title: Text('Gallery'),

  ),

  body: FutureBuilder(
    future : pic(),
    builder: (context, snapshot) {
      if (snapshot.hasError) print(snapshot.error);
      return snapshot.hasData
          ? ListView.builder(
          itemCount:2,
          itemBuilder: (context, index) {
            List list = pic() as List;
            return Card(
                child: ListTile(
                title: Container(
                width: 100,
                height: 100,
                child: Image.network(
                "http://120.76.247.131:8081/findAllImages/%7Blist[index][%22image%22]%7D%22)"
            ),
            ),
            ));
          })
          : Center(
        child: CircularProgressIndicator(),
      );
    },
  ),
);
  }
  }

我曾试图在未来添加,但它并没有解决问题。此外,itemcount 有问题,所以我留下了一个数字而不是添加 snapshot.data!.length(),因为我不确定为什么 itemcount 的 snapshot.data!.length() 有错误。

标签: javaflutterdart

解决方案


这是完整的工作代码。

起初因为 pic() 返回 Future,你需要使用 'await' 或 'then' 来获得响应。
https://dart.dev/codelabs/async-await

因此,以下句子会导致您提供的错误。
但是因为在这种情况下没有必要,所以我摆脱了这个。

List list = pic() as List;

如果你想使用 pic() 方法,只需像下面这样调用。
(但在这种情况下,你不能这样打电话。)

List list = await pic()

您已经使用过“FutureBuilder”,无需再次调用 pic()。
如果 snapdata 有数据,您只需使用 snapdata 的数据。

在此处输入图像描述

import 'dart:convert';

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

void main() {
  print('onStart');
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: Gallery(),
    );
  }
}

class Gallery extends StatefulWidget {
  @override
  _GalleryState createState() => _GalleryState();
}

class _GalleryState extends State<Gallery> {
  pic() async {
    var url = "http://120.76.247.131:8081/findAllImages";
    var response = await http.get(Uri.parse(url));
    return json.decode(response.body);
  }

  @override
  void initState() {
    super.initState();
    pic();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Gallery'),
      ),
      body: FutureBuilder(
        future: pic(),
        builder: (context, snapshot) {
          if (snapshot.hasError) print(snapshot.error);
          return snapshot.hasData
              ? ListView.builder(
                  itemCount: (snapshot.data! as Map)['data'].length,
                  itemBuilder: (context, index) {
                    // List list = pic() as List;
                    print((snapshot.data! as Map)['data'][index]);
                    return Card(
                        child: ListTile(
                      title: Container(
                        width: 100,
                        height: 100,
                        child: Image.network(
                            (snapshot.data! as Map)['data'][index]['image']),
                      ),
                    ));
                  })
              : Center(
                  child: CircularProgressIndicator(),
                );
        },
      ),
    );
  }
}


推荐阅读