当前位置: 首页 > news >正文

Flutter_学习记录_实现列表上下拉加载 +实现加载html的数据

1. 效果图

在这里插入图片描述

2. 下拉加载的实现RefreshIndicator

在Flutter官方sdk中给我们提供了下拉刷新的组件RefreshIndicator。

// 显示内容列表Widget _showNewsListWidget() {if (_newsDataList.isNotEmpty) {//  RefreshIndicator 来实现下拉加载的功能return RefreshIndicator(onRefresh: () async {print("下拉加载");// 网络数据的请求_getNewDataRequest();},child: ListView.builder(itemCount: _newsDataList.length,itemBuilder: (context, index) {return Column(children: [ListTile(title: Text(_newsDataList[index]["title"]),onTap: () {Navigator.of(context).push(MaterialPageRoute(builder: (context) => NewsdetailDemo(cid: _newsDataList[index]["aid"])),);},)],);}, ));} else {// loadingreturn Center(child: CircularProgressIndicator(),);}}

3. 上拉加载的实现

flutter是没有提供上拉分页加载更多的组件,但是在Flutter ListView中有一个ScrollController组件,它就是专门来控制ListView滑动事件,在
这里我们可以根据ListView的位置来判断是否滑动到了底部来做加载更多的处理

上拉分页加载更多主要通过ListView监听 ScrollController 实现
_scrollController.position.pixels 滚动的距离
_scrollController.position.maxScrollExtent 总距离

核心代码,就是在 initState方法中,添加监听:

	_scrollController = ScrollController(); //listview的控制器_scrollController.addListener((){double scrollOffsetY =  _scrollController.position.pixels;double scrollContentHeight =  _scrollController.position.maxScrollExtent;if (scrollOffsetY > scrollContentHeight + 20) { print("上拉加载更多");_getNewDataRequest();}});

ListView中的controller中 关联_scrollController, 代码如下:

ListView.builder(// controller 关联_scrollControllercontroller: _scrollController,itemCount: _newsDataList.length,itemBuilder: (context, index) {return Column();}))

4. 实现列表上下拉加载的完整代码

import 'dart:convert';
import 'package:demoapp/Demo/NewsDemo/NewsDetail_demo.dart';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';class NewsDemo extends StatefulWidget {const NewsDemo({super.key});State<NewsDemo> createState() => _NewsDemoState();
}class _NewsDemoState extends State<NewsDemo> {final ScrollController _scrollController = ScrollController();List _newsDataList = [];int _page = 1;bool _isLoadingData = false;bool _hasMoreData = true;// 获取网络请求的数据void  _getNewDataRequest() async {if (_isLoadingData == true ) {print("数据加载中,请勿重新加载");return;}if (_hasMoreData == false) {print("没有更多的数据了");return;}_isLoadingData = true;var apiUri = "https://www.phonegap100.com/appapi.php?a=getPortalList&catid=20&page=$_page";print("apiUri = $apiUri");final response = await Dio().get(apiUri);List resultList = json.decode(response.data)["result"];setState(() {print("数据请求成功");if (_page == 1) {_newsDataList = resultList;} else {_newsDataList.addAll(resultList);}_isLoadingData = false;if (resultList.isNotEmpty) {_page += 1;}if (resultList.length < 20) {_hasMoreData = false;}});}// cell 底部视图的设置Widget _newsListCellBottomWidget(int index) {if (index == _newsDataList.length - 1) {if (_hasMoreData) {return CircularProgressIndicator();} else {return Text("---我也是有底线的---");}} else {return Divider();}}// 显示内容列表Widget _showNewsListWidget() {if (_newsDataList.isNotEmpty) {//  RefreshIndicator 来实现下拉加载的功能return RefreshIndicator(onRefresh: () async {print("下拉加载");_page = 1;_hasMoreData = true;_getNewDataRequest();},child: ListView.builder(controller: _scrollController,itemCount: _newsDataList.length,itemBuilder: (context, index) {return Column(children: [ListTile(title: Text(_newsDataList[index]["title"]),onTap: () {Navigator.of(context).push(MaterialPageRoute(builder: (context) => NewsdetailDemo(cid: _newsDataList[index]["aid"])),);},),_newsListCellBottomWidget(index)],);}, ));} else {return Center(child: CircularProgressIndicator(),);}}void initState() {super.initState();_scrollController.addListener((){double scrollOffsetY =  _scrollController.position.pixels;double scrollContentHeight =  _scrollController.position.maxScrollExtent;if (scrollOffsetY > scrollContentHeight + 20) { print("上拉加载更多");_getNewDataRequest();}});_getNewDataRequest();}Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("模拟新闻列表上下拉加载 + 加载html的数据"),),body: _showNewsListWidget(),);}
}

5. 加载 Html 的数据

  1. 第三方插件:flutter_widget_from_html_core: ^0.16.0
  2. 引入头文件:
import 'package:flutter_widget_from_html_core/flutter_widget_from_html_core.dart';
  1. 使用代码
           return HtmlWidget("xxxx==> Html 的数据",onTapImage: (imageMetadata) {print(imageMetadata);},onTapUrl: (url) {print(url);return true;},);

6. 实现加载html的数据,完整代码

import 'dart:convert';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:flutter_widget_from_html_core/flutter_widget_from_html_core.dart';class NewsdetailDemo extends StatefulWidget {final String cid;const NewsdetailDemo({super.key, required this.cid});State<NewsdetailDemo> createState() => _NewsdetailDemoState();
}class _NewsdetailDemoState extends State<NewsdetailDemo> {List _resultDetailList = [];// 获取详情的数据void _getNewsDetailRequest() async {String apiUri = "https://www.phonegap100.com/appapi.php?a=getPortalArticle&aid=${widget.cid}";final response = await Dio().get(apiUri);final result = json.decode(response.data)["result"];setState(() {_resultDetailList = result;});}// 内容视图Widget _newsDetailWidget() {if (_resultDetailList.isNotEmpty) {Map resultInfo = _resultDetailList.isNotEmpty ?  _resultDetailList[0] : {};return Padding(padding: EdgeInsets.all(10),child: ListView(children: [Text(resultInfo["title"], textAlign: TextAlign.center, style: TextStyle(fontSize: 24),),SizedBox(height: 20),HtmlWidget(resultInfo["content"],onTapImage: (imageMetadata) {print(imageMetadata);},onTapUrl: (url) {print(url);return true;},)],),);} else {return Center(child: CircularProgressIndicator());}}void initState() {super.initState();_getNewsDetailRequest();}Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("详情"),),body: _newsDetailWidget(),);}
}

相关文章:

Flutter_学习记录_实现列表上下拉加载 +实现加载html的数据

1. 效果图 2. 下拉加载的实现RefreshIndicator 在Flutter官方sdk中给我们提供了下拉刷新的组件RefreshIndicator。 // 显示内容列表Widget _showNewsListWidget() {if (_newsDataList.isNotEmpty) {// RefreshIndicator 来实现下拉加载的功能return RefreshIndicator(onRefr…...

基于PaddleNLP使用DeepSeek-R1搭建智能体

基于PaddleNLP使用DeepSeek-R1搭建智能体 最近在学习DeepSeek&#xff0c;找到了PaddleNLP星河社区大模型&#xff0c;跟着敲写了一遍。内容来源&#xff1a;DeepSeek实战训练营&#xff1a;从云端模型部署到应用开发 - 飞桨AI Studio星河社区-人工智能学习与实训社区 本项目基…...

『PostgreSQL』PGSQL备份与还原实操指南

&#x1f4e3;读完这篇文章里你能收获到 了解逻辑备份与物理备份的区别及适用场景&#x1f50d;。掌握全库、指定库、指定表备份还原的命令及参数&#x1f4dd;。学会如何根据业务需求选择合适的备份策略&#x1f4ca;。熟悉常见备份还原问题的排查与解决方法&#x1f527;。 …...

基于单片机的智慧农业大棚系统(论文+源码)

1系统整体设计 经过上述的方案分析&#xff0c;采用STM32单片机为核心&#xff0c;结合串口通信模块&#xff0c;温湿度传感器&#xff0c;光照传感器&#xff0c;土壤湿度传感器&#xff0c;LED灯等硬件设备来构成整个控制系统。系统可以实现环境的温湿度检测&#xff0c;土壤…...

【C语言】数组篇

目录 引言一维数组数组的定义数组的初始化完全初始化部分初始化省略数组长度 数组元素的访问 多维数组二维数组的定义二维数组的初始化完全初始化部分初始化省略第一维长度 二维数组元素的访问 遍历数组元素遍历一维数组遍历二维数组 数组作为函数参数一维数组作为函数参数二维…...

FreeRTOS概述

文章目录 核心文件头文件内存管理文件入口函数数据类型前缀 核心文件 最核心文件&#xff1a;task.c和list.c 文件作用tasks.c必需&#xff0c;任务操作list.c必须&#xff0c;列表queue.c基本必需&#xff0c;提供队列操作、信号量(semaphore)操作timer.c可选&#xff0c;so…...

C++ 使用红黑树的实现及迭代器完成对set和map的封装

一、红黑树的实现以及迭代器 #pragma once // 要实现完整的迭代器需要对红黑树进行改造&#xff0c;有兴趣可参考侯捷《STL源码剖析》 enum Colour {RED,BLACK };template<class T> struct RBTreeNode {RBTreeNode<T>* _left;RBTreeNode<T>* _right;RBTreeN…...

【Java从入门到起飞】面向对象编程(高级)

文章目录 1. 抽象类1.1 概述1.1.1 抽象类引入 1.2 abstract使用格式1.2.1 抽象方法1.2.2 抽象类1.2.3 抽象类的使用 1.3 抽象类的特征1.4 抽象类的细节1.5 抽象类存在的意义 2. 接口2.1 概述2.2 定义格式2.3 接口成分的特点2.3.1.抽象方法2.3.2 常量2.3.3 案例演示 2.4 基本的实…...

内网安全-横向移动PTH 哈希PTT 票据PTK 密匙Kerberos密码喷射

一.域横向pth&#xff0c;mimkatz&#xff0c;NTLM windwos server 2012 R2之前可能是NTLM和LM&#xff0c;之后为NTLM 1.mimkatz ptk 使用mimkatz进行横向移动 mimikatz sekurlsa::pth /user:administrator&#xff08;目标本地用户名&#xff09; /domain:192.168.3.32&a…...

【VMware安装Ubuntu实战分享】

在当今数字化时代&#xff0c;虚拟机技术已成为许多开发者、系统管理员以及技术爱好者的得力助手。VMware作为一款功能强大且广泛应用的虚拟化软件&#xff0c;为我们提供了便捷的环境来运行各种操作系统&#xff0c;而Ubuntu凭借其开源、稳定和易用性&#xff0c;深受广大用户…...

【推荐项目】 043-停车管理系统

043-停车管理系统 介绍 使用 springboot vuejs mysql 技术搭建框架。 智能停车管理系统描述 后端框架&#xff1a;采用Spring Boot与MySQL的强强联合&#xff0c;为系统提供稳健、高效的服务支撑。 前端框架&#xff1a;前端选用Vue.js&#xff0c;打造流畅、美观的用户交…...

【深入解析 epoll 的底层实现原理】

IO多路复用的简介select的工作原理和缺点epoll的引入和底层实现&#xff08;数据结构、系统调用&#xff09;epoll的优势和改进epoll的工作模式&#xff08;LT和ET&#xff09;在Java中的应用或相关API 需要确保每个部分逻辑清晰&#xff0c;逐步深入&#xff0c;帮助用户建立…...

Ubuntu 22.04 官方下载安装 Gradle 记录

Ubuntu 22.04 官方下载安装 Gradle 记录 Gradle 是一个强大的自动化构建工具&#xff0c;广泛用于 Java、Android 等项目的构建中。下面详细介绍如何在 Ubuntu 22.04 中使用官网下载安装 Gradle。 一、准备工作 首先&#xff0c;确保你的系统已安装 Java JDK&#xff08;推荐…...

HTTPS加密原理详解

目录 HTTPS是什么 加密是什么 HTTPS的工作流程 1.使用对称加密 2.引入非对称加密 3.引入证书机制 客户端验证证书真伪的过程 签名的加密流程 整体工作流程 总结 HTTPS是什么 HTTPS协议也是一个应用程协议&#xff0c;是在HTTP的基础上加入了一个加密层&#xff0c;由…...

无公网IP也能远程控制Windows:Linux rdesktop内网穿透实战

文章目录 前言1. Windows 开启远程桌面2. Linux安装rdesktop工具3. Win安装Cpolar工具4. 配置远程桌面地址5. 远程桌面连接测试6. 设置固定远程地址7. 固定地址连接测试 前言 如今远程办公已经从一种选择变成了许多企业和个人的必修课&#xff0c;而如何在Linux系统上高效地访…...

Unity入门学习笔记(Day01)

一.认识unity工作面板 1.1.project window&#xff08;项目面板&#xff09; 显示当前项目中的所有文件和目录&#xff0c;包含了项目里面所有的资源文件 1.2.console window&#xff08;输出面板&#xff09; 显示当前游戏开发中生成的警告错误 1.3.hierarchy window&…...

HTML中的块元素与行内元素

1.块级标签 块级元素会独占一行&#xff0c;通常用于构建页面的结构。常见的块级元素包括&#xff1a; <div>&#xff1a;通用的块级容器。没有任何语意。可以创建网页的不同部分&#xff0c;导航栏侧边栏等。 <body><div class"nav"><a hre…...

postgreSQL window function高级用法

正常使用&#xff1a;相当于对每个row做一次子查询 SELECT depname, empno, salary, avg(salary) OVER (PARTITION BY depname) FROM empsalary;order by 区别window frame and partition 没有order by&#xff0c; window function是对整个partition起作用&#xff0c; part…...

当中国“智算心跳”与全球共振:九章云极DataCanvas首秀MWC 2025

3月3日&#xff0c;西班牙巴塞罗那&#xff0c;全球通信与科技领域的盛会“2025世界移动通信大会&#xff08;MWC 2025&#xff09;”正式拉开帷幕。中国人工智能基础设施领军企业九章云极DataCanvas公司以全球化战略视野与硬核技术实力&#xff0c;全方位、多维度地展示了在智…...

机器视觉检测显卡与工控机选型指南

在机器视觉检测项目中,深度学习显卡和工控机的选择直接影响算法性能、系统稳定性和长期维护成本。以下是关键注意事项及建议: 一、深度学习显卡选择 核心需求分析 任务类型:检测任务复杂度(如YOLO、ResNet等模型的参数量)决定显存需求。 高分辨率图像(如4K以上)需大显存…...

配置安全网站

配置网站 确定是Debian系统 更新索引&#xff1a;apt update 安装包&#xff1a;apt upgrade -y 查看nginx状态&#xff1a;systemctl status nginx 安装&#xff1a;nginx&#xff1a;apt install nginx 启动&#xff1a;systemctl start nginx 在/var/www/里面创建一个…...

ds回答 什么是数据召回

数据召回&#xff08;Data Recall&#xff09;在不同领域有不同的具体含义&#xff0c;但核心都指向“从大量信息中筛选出相关数据”的过程。以下是其在不同场景下的定义和关键要点&#xff1a; 一、技术领域的定义&#xff08;信息检索与推荐系统&#xff09; 1. 基本概念 数…...

复现无人机的项目,项目名称为Evidential Detection and Tracking Collaboration

项目名称为Evidential Detection and Tracking Collaboration&#xff0c;主要用于强大的反无人机系统&#xff0c;涉及新问题、基准和算法研究。下面介绍项目的复现步骤&#xff1a; 安装环境&#xff1a;使用Anaconda创建并激活名为edtc的虚拟环境&#xff0c;Python版本为3…...

mac本地部署Qwq-32b记录

导语 昨天看到阿里开源了Qwq-32b&#xff0c;号称性能可以媲美Deepseek-R1。今天晚上有空就在Mac上折腾了一下&#xff0c;使用ollma进行了部署&#xff0c;效果感觉还不错&#xff0c;特此记录。 环境 硬件 型号&#xff1a;Macbook M1 Pro 14寸内存&#xff1a;512G 环境…...

实验三 Python 数据可视化 Python 聚类-K-means(CQUPT)

一、实验目的 Python 数据可视化&#xff1a; 1、学习使用 jieba、wordcloud 等类库生成词云图。 2、学习使用 Matplotlib 库进行数据可视化。 Python 聚类-K-means&#xff1a; 1、理解聚类非监督学习方法的基本原理。 2、掌握 Python、numpy、pandas、sklearn 实现聚类…...

通义万相2.1:开启视频生成新时代

摘要&#xff1a;文章开篇便点明了通义万相2.1在视频生成领域的重大突破&#xff0c;强调其作为阿里云通义系列AI模型的重要成员&#xff0c;不仅是简单的模型升级&#xff0c;更是视频生成技术迈向更智能、高效、精准的重要里程碑。其核心技术包括自研的高效VAE和DiT架构&…...

爬虫案例十一js逆向数位观察网

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、网站分析二、代码总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 爬虫案例十一js逆向数位观察网 提示&#xff1a;以下是本篇…...

WSL安装及问题

1 概述 Windows Subsystem for Linux&#xff08;简称WSL&#xff09;是一个在Windows 10\11上能够运行原生Linux二进制可执行文件&#xff08;ELF格式&#xff09;的兼容层。它是由微软与Canonical公司合作开发&#xff0c;开发人员可以在 Windows 计算机上同时访问 Windows 和…...

WordPress开发到底是开发什么?

WordPress 开发主要涉及基于 WordPress 平台构建、定制和扩展网站功能的过程。它不仅仅是简单的网站搭建&#xff0c;而是通过代码和技术实现个性化需求。 以下是 WordPress 开发的核心内容&#xff1a; 1. 主题开发&#xff08;Theme Development&#xff09; 功能&#xff…...

元脑服务器的创新应用:浪潮信息引领AI计算新时代

浪潮信息的元脑 R1 服务器现已全面支持开源框架 SGLang&#xff0c;能够在单机环境下实现 DeepSeek 671B 模型的高并发性能&#xff0c;用户并发访问量超过1000。通过对 SGLang 最新版本的深度适配&#xff0c;元脑 R1 推理服务器在运行高性能模型时&#xff0c;展现出卓越的处…...