flutter 使用dio 请求go语言后台数据接口展示瀑布流图片

news2025/1/26 15:32:00

添加依赖

dependencies:
  flutter:
    sdk: flutter
  dio: ^5.0.0  # 请检查最新版本
  flutter_staggered_grid_view: ^0.4.0

添加网络权限

<uses-permission android:name="android.permission.INTERNET" />

go后端代码

图片存放目录

// main.go
package main

import (
	"github.com/gin-gonic/gin"
	"log"
	"net/http"
)

// 定义图片结构体
type Image struct {
	URL string `json:"url"`
}

func main() {
	// 创建 Gin 路由
	r := gin.Default()

	// 提供静态文件服务,images 文件夹中的图片文件可以通过 http://localhost:8080/images/xxx.jpg 来访问
	r.Static("/images", "./assets/images")

	// 设置路由,当访问 /images 时,返回图片 URL 列表
	r.GET("/images-list", func(c *gin.Context) {
		// 假设有一组图片 URL
		images := []Image{
			{URL: "/images/test.png"},
			{URL: "/images/test.png"},
			{URL: "/images/test.png"},
			{URL: "/images/test.png"},
			{URL: "/images/test.png"},
			{URL: "/images/test.png"},
			{URL: "/images/test.png"},
			{URL: "/images/test.png"},
			{URL: "/images/test.png"},
			{URL: "/images/test.png"},
			{URL: "/images/test.png"},
			{URL: "/images/test.png"},
			{URL: "/images/test.png"},
			{URL: "/images/test.png"},
			{URL: "/images/test.png"},
			{URL: "/images/test.png"},
			{URL: "/images/test.png"},
			{URL: "/images/test.png"},
			{URL: "/images/test.png"},
			{URL: "/images/test.png"},
			{URL: "/images/test.png"},
			{URL: "/images/test.png"},
			{URL: "/images/test.png"},
			{URL: "/images/test.png"},
			{URL: "/images/test.png"},
			{URL: "/images/test.png"},
			{URL: "/images/test.png"},
			{URL: "/images/test.png"},
			{URL: "/images/test.png"},
			{URL: "/images/test.png"},
			{URL: "/images/test.png"},
			{URL: "/images/test.png"},
			{URL: "/images/test.png"},
			{URL: "/images/test.png"},
			{URL: "/images/test.png"},
			{URL: "/images/test.png"},
			{URL: "/images/test.png"},
		}

		// 返回 JSON 格式的图片列表
		c.JSON(http.StatusOK, images)
	})

	// 启动 HTTP 服务,监听 8080 端口
	log.Println("Starting server at http://localhost:8080")
	r.Run(":8080")
}

flutter前端代码

import 'package:flutter/material.dart';
import 'package:dio/dio.dart'; // 引入 Dio 库以处理 HTTP 请求
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart'; // 引入用于创建瀑布流布局的库

void main() {
  runApp(MyApp()); // 运行应用并调用 MyApp 类
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: '瀑布流图片展示', // 应用标题
      theme: ThemeData(primarySwatch: Colors.blue), // 应用主题颜色
      home: ImageScreen(), // 设置 home 页为 ImageScreen
    );
  }
}

// 图片项类,用于存储图片的 URL
class ImageItem {
  final String url; // 图片的 URL

  ImageItem({required this.url}); // 构造函数

  // 从 JSON 数据创建 ImageItem 实例
  factory ImageItem.fromJson(Map<String, dynamic> json) {
    // 这里返回新的 ImageItem 实例,URL 前加上服务端地址
    return ImageItem(url: 'http://192.168.110.148:8080${json['url']}');
  }
}

// API 服务类,用于获取图片数据
class ApiService {
  final Dio _dio = Dio(); // 创建 Dio 实例

  // 从后端获取图片列表的异步方法
  Future<List<ImageItem>> fetchImages() async {
    try {
      // 请求 Go 后端接口,替换为您的 Go 后端地址
      final response = await _dio.get('http://192.168.110.148:8080/images-list');
      // 解析响应数据并转换为 ImageItem 列表
      List<ImageItem> images = (response.data as List)
          .map((item) => ImageItem.fromJson(item))
          .toList();
      return images; // 返回图片列表
    } catch (e) {
      throw Exception('加载图片失败: $e'); // 捕获异常并抛出
    }
  }
}

// 瀑布流图片展示组件
class ImageGrid extends StatelessWidget {
  final List<ImageItem> images; // 图片列表

  ImageGrid({required this.images}); // 构造函数

  @override
  Widget build(BuildContext context) {
    return StaggeredGridView.countBuilder(
      crossAxisCount: 2, // 列数设置为2
      itemCount: images.length, // 图片数量
      itemBuilder: (context, index) => Image.network(images[index].url), // 构建每个图片项
      staggeredTileBuilder: (index) => StaggeredTile.fit(1), // 瀑布流样式设置
      mainAxisSpacing: 4.0, // 主轴间距
      crossAxisSpacing: 4.0, // 交叉轴间距
    );
  }
}

// 显示图片的主屏幕
class ImageScreen extends StatefulWidget {
  @override
  _ImageScreenState createState() => _ImageScreenState(); // 创建状态
}

class _ImageScreenState extends State<ImageScreen> {
  late Future<List<ImageItem>> futureImages; // 声明未来的图片列表

  @override
  void initState() {
    super.initState();
    futureImages = ApiService().fetchImages(); // 初始化时请求图片
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('瀑布流图片展示')), // 设置 AppBar 的标题
      body: FutureBuilder<List<ImageItem>>(
        future: futureImages, // 提供未来的图片列表
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.waiting) {
            // 当请求数据时显示加载指示器
            return Center(child: CircularProgressIndicator());
          } else if (snapshot.hasError) {
            // 如果出现错误,显示错误信息
            return Center(child: Text('加载失败: ${snapshot.error}'));
          } else {
            // 成功获取数据,显示图片网格
            return ImageGrid(images: snapshot.data!);
          }
        },
      ),
    );
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2263060.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ZYNQ初识2(zynq_7010)基于vivado,从PL端调用PS端的时钟

由于需要进行一些FPGA的简单开发&#xff0c;但板载PL端没有焊接晶振&#xff0c;所以需要从PS端借用时钟到PL端使用。 首先新建项目&#xff0c;根据自己的板载选择芯片&#xff0c;我的板载芯片是zynq_7010。 一路next&#xff0c;在自己的vivado的工作文档新建文件夹并给自…

Go语言启动独立进程

文章目录 问题解决方案1. **将 npc.exe 启动为独立的进程**2. **修改 exec.Command 函数**示例代码解释为什么这样有效注意 问题 在你当前的代码中&#xff0c;调用 exec.Command("XXX.exe") 启动 XXX.exe 程序时&#xff0c;这个程序是由 Go 程序直接启动的。如果 …

oracle client linux服务器安装教程

p13390677_112040_Linux-x86-64_4of7.zip 安装前&#xff0c;确认/etc/hosts文件已配置正确 cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 10.2…

strongswan构建测试环境

make-testing脚本文件负责构建strongswan的虚拟化测试系统。位于目录strongswan-5.9.14/testing/&#xff0c;需要以管理员身份运行make-testing。生成测试用到的虚拟客户机镜像&#xff0c;KVM虚拟机和虚拟网络的配置文件位于目录:config/kvm。 ~/strongswan-5.9.14/testing$…

页面无滚动条,里面div各自有滚动条

一、双滚动条左右布局 实现效果 实现代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Doc…

踩准智能汽车+机器人两大风口,速腾聚创AI+机器人应用双线爆发

日前&#xff0c;RoboSense速腾聚创交出了一份亮眼的Q3财报。受到多重利好消息影响&#xff0c;其股价也应势连续大涨。截止12月9日发稿前&#xff0c;速腾聚创股价近一个月内累计涨幅已超88%。 财务数据方面&#xff0c;速腾聚创在今年前三季度实现总收入约11.3亿元&#xff0…

省略内容在句子中间

一、使用二分查找法 每次查找时&#xff0c;将查找范围分成两半&#xff0c;并判断目标值位于哪一半&#xff0c;从而逐步缩小查找范围。 循环查找 计算中间位置 mid Math.floor((low high) / 2)。比较目标值 target 和中间位置的元素 arr[mid]&#xff1a; 如果 target ar…

CTF — 压缩包密码爆破

CTF — 压缩包密码爆破 ​ 在CTF比赛中&#xff0c;密码爆破压缩包&#xff08;如ZIP或RAR文件&#xff09;是一个常见的任务。针对ZIP压缩包的密码爆破主要是使用工具ARCHPR完成的。这个工具的功能非常强大&#xff0c;假设你已经在Win系统里安装完这个软件了&#xff0c;打开…

Spring之我见 - 从IOC谈到AOP实现原理

前言 以前写过一篇文章&#xff0c; 专门讲了 Spring 的动态代理实现原理 从代理模式再出发&#xff01;Proxy.newProxyInstance的秘密&#xff0c; 这一次我们探究下动态代理模式比较重量级的应用 – Spring AOP 的源码实现。 本文重在讲主流程&#xff0c; 但为了让流程更清…

基于 SSM 框架 Vue 电脑测评系统:赋能电脑品质鉴定

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;作为一个一般的用户都开始注重与自己的信息展示平台&#xff0c;实现基于SSM框架的电脑测评系统在技术上已成熟。本文介绍了基于SSM框架的电脑测评系统的开发全过程。通过分析用户对于基于SSM框架的电脑测评系统的…

[react] 优雅解决typescript动态获取redux仓库的类型问题

store.getState()是可以获取总仓库的 先拿到函数的类型 再用ReturnType<T> 它是 TypeScript 中的一个内置条件类型&#xff0c;用于获取某个函数类型 T 的返回值类型 代码 // 先拿总仓库的函数类型type StatefuncType typeof store.getState;//再拿函数类型T的返回值类…

mysql中与并发相关的问题?

今天我们来聊聊 MySQL 中与并发相关的一些问题。作为一名资深 Python 开发工程师&#xff0c;我觉得这些问题不仅关乎数据库的稳定性和数据的一致性&#xff0c;更与我们的代码实现和业务逻辑密切相关。 尤其是在高并发环境下&#xff0c;如何保证数据的一致性&#xff0c;如何…

(补)算法刷题Day19:BM55 没有重复项数字的全排列

题目链接 给出一组数字&#xff0c;返回该组数字的所有排列 例如&#xff1a; [1,2,3]的所有排列如下 [1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2], [3,2,1]. &#xff08;以数字在数组中的位置靠前为优先级&#xff0c;按字典序排列输出。&#xff09; 思路&#xff1a; 使用回…

ARM嵌入式学习--第八天(PWM)

PWM -PWM介绍 PWM&#xff08;pulse Width Modulation&#xff09;简称脉宽调制&#xff0c;是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术&#xff0c;广泛应用在测量&#xff0c;通信&#xff0c;工控等方面 PWM的频率 是指在1秒钟内&#xff0c;信号从…

neo4j 图表数据导入到 TuGraph

neo4j 图表数据导入到 TuGraph 代码文件说明后文 前言:近期在引入阿里的 TuGraph 图数据库&#xff0c;需要将 原 neo4j 数据导入到新的 tugraph 数据库中。预期走csv文件导入导出&#xff0c;但因为格式和数据库设计问题&#xff0c;操作起来比较麻烦&#xff08;可能是个人没…

Docker介绍、安装、namespace、cgroup、镜像-Dya 01

0. 容器简介 从生活上来说&#xff0c;容器是一种工具&#xff0c;可以装东西的工具&#xff0c;如衣柜、背包、行李箱等等。 从IT技术方面来说&#xff0c;容器是一种全新的虚拟化技术&#xff0c;它提高了硬件资源利用率&#xff0c;结合k8s还可以让企业业务快速横向扩容、业…

鱼跃医疗获评2024年国家级“绿色工厂”,以绿色制造树立行业标杆

近日&#xff0c;工业和信息化部公布了2024年度绿色制造名单&#xff0c;鱼跃医疗凭借在绿色制造和可持续发展方面的卓越表现&#xff0c;成功入选并获评国家级“绿色工厂”。 “绿色工厂”是工信部为贯彻落实国家《工业绿色发展规划》&#xff0c;加快推动绿色制造体系建设&a…

建投数据与腾讯云数据库TDSQL完成产品兼容性互认证

近日&#xff0c;经与腾讯云联合测试&#xff0c;建投数据自主研发的人力资源信息管理系统V3.0、招聘管理系统V3.0、绩效管理系统V2.0、培训管理系统V3.0通过腾讯云数据库TDSQL的技术认证&#xff0c;符合腾讯企业标准的要求&#xff0c;产品兼容性良好&#xff0c;性能卓越。 …

Java-30 深入浅出 Spring - IoC 基础 启动IoC 纯XML启动 Bean、DI注入

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大数据篇正在更新&#xff01;https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了&#xff1a; MyBatis&#xff…

基础入门-Web应用蜜罐系统堡垒机运维API内外接口第三方拓展架构部署影响

知识点&#xff1a; 1、基础入门-Web应用-蜜罐系统 2、基础入门-Web应用-堡垒机运维 3、基础入门-Web应用-内外API接口 4、基础入门-Web应用-第三方拓展架构 一、演示案例-Web-拓展应用-蜜罐-钓鱼诱使 蜜罐&#xff1a;https://hfish.net/ 测试系统&#xff1a;Ubuntu 20.04 …