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

Flutter中如何用CarouselSlider展示API返回的图片列表

在CarouselSlider中展示API获取的图片列表

步骤1:添加必要依赖

确保pubspec.yaml中引入carousel_slider和http依赖(使用最新版本即可):

dependencies:
  flutter:
    sdk: flutter
  carousel_slider: ^4.2.1
  http: ^1.1.0

步骤2:结合FutureBuilder处理异步数据

因为图片数据是异步获取的,用FutureBuilder可以自然处理加载、成功、错误三种状态,再联动CarouselSlider渲染图片。完整代码示例如下:

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

// 根据API返回结构定义ImageModel类
class ImageModel {
  final String imageUrl; // 替换为接口实际返回的图片地址字段名

  ImageModel({required this.imageUrl});

  factory ImageModel.fromJson(Map<String, dynamic> json) {
    return ImageModel(
      imageUrl: json['你的图片地址字段名'], // 比如接口返回的是'ImgUrl'就填这个
    );
  }
}

class ImageCarouselPage extends StatefulWidget {
  const ImageCarouselPage({super.key});

  @override
  State<ImageCarouselPage> createState() => _ImageCarouselPageState();
}

class _ImageCarouselPageState extends State<ImageCarouselPage> {
  // 复用你提供的API请求方法
  Future<List<ImageModel>> _getImageList() async {
    final url = Uri.parse('http://45.34.15.25/API/api/v1/MerchandiseImage/GetMerchandiseImage?OrganizationId=1');
    var response = await http.get(
      url,
      headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json',
        'tenant-code': 'flatworld',
      },
    );

    if (response.body.isNotEmpty) {
      final result = jsonDecode(response.body);
      Iterable imageList = result["result"];
      return imageList.map((record) => ImageModel.fromJson(record)).toList();
    } else {
      throw Exception("Failed to load data!");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("图片轮播")),
      body: FutureBuilder<List<ImageModel>>(
        future: _getImageList(),
        builder: (context, snapshot) {
          // 加载中状态
          if (snapshot.connectionState == ConnectionState.waiting) {
            return const Center(child: CircularProgressIndicator());
          }
          // 错误状态
          if (snapshot.hasError) {
            return Center(child: Text('加载失败: ${snapshot.error}'));
          }
          // 无数据状态
          if (!snapshot.hasData || snapshot.data!.isEmpty) {
            return const Center(child: Text('暂无图片'));
          }
          // 成功加载,渲染轮播
          final imageList = snapshot.data!;
          return CarouselSlider(
            options: CarouselOptions(
              height: 220,
              autoPlay: true,
              enlargeCenterPage: true,
              viewportFraction: 0.85,
              autoPlayInterval: const Duration(seconds: 3),
            ),
            items: imageList.map((item) {
              return Builder(
                builder: (context) {
                  return Container(
                    width: MediaQuery.of(context).size.width,
                    margin: const EdgeInsets.symmetric(horizontal: 6),
                    child: Image.network(
                      item.imageUrl,
                      fit: BoxFit.cover,
                      // 添加加载中和错误占位
                      loadingBuilder: (_, child, progress) => progress == null 
                          ? child 
                          : const Center(child: CircularProgressIndicator()),
                      errorBuilder: (_, __, ___) => const Icon(Icons.broken_image, size: 60),
                    ),
                  );
                },
              );
            }).toList(),
          );
        },
      ),
    );
  }
}

关键注意事项

  • 字段匹配:必须根据API返回的实际字段名调整ImageModel.fromJson中的映射关系,比如接口返回图片地址的字段是ImageUrl,就把json['你的图片地址字段名']改成json['ImageUrl']。
  • 用户体验优化:给Image.network添加loadingBuilder和errorBuilder,避免加载时空白或出错时显示异常。
  • 轮播配置:通过CarouselOptions可以自定义轮播高度、自动播放间隔、图片缩放比例等参数,按需调整即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 04:20:54