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

Flutter 学习之旅 之 flutter 在 Android 端读取相册图片显示

Flutter 学习之旅 之 flutter 在 Android 端读取相册图片显示

目录

Flutter 学习之旅 之 flutter 在 Android 端读取相册图片显示

一、简单介绍

二、简单介绍 image_picker

三、安装 image_picker

四、简单案例实现

五、关键代码

代码说明:


一、简单介绍

Flutter 是一款开源的 UI 软件开发工具包,由 Google 开发和维护。它允许开发者使用一套代码同时构建跨平台的应用程序,包括移动设备(iOS 和 Android)、Web 和桌面平台(Windows、macOS 和 Linux)。

Flutter 使用 Dart 编程语言,它可以将代码编译为 ARM 或 Intel 机器代码以及 JavaScript,从而实现快速的性能。Flutter 提供了一个丰富的预置小部件库,开发者可以根据自己的需求灵活地控制每个像素,从而创建自定义的、适应性强的设计,这些设计在任何屏幕上都能呈现出色的外观和感觉。

二、简单介绍 image_picker

网址:image_picker | Flutter package

image_picker 是 Flutter 中一个非常流行的插件,用于从设备的相册中选择图片或使用相机拍摄新照片。

三、安装 image_picker

1、直接运行命令

使用 Flutter:flutter pub add image_picker

2、或者在 pubspec.yaml 添加

dependencies:image_picker: ^1.1.2

四、简单案例实现

1、这里使用 Android Studio 进行创建 Flutter 项目

2、创建一个 application 的 Flutter 项目

3、工程创建后如下

4、在安卓端添加文件读取权限

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

5、在 lib/main.dart 编写代码实现相册图片显示

6、连接设备,运行设备上的简单效果如下

五、关键代码

import 'dart:io'; // 导入 Dart 的文件操作库,用于处理图片文件import 'package:flutter/material.dart'; // 导入 Flutter 的 Material Design 组件库
import 'package:image_picker/image_picker.dart'; // 导入图片选择器插件void main() {runApp(MyApp()); // 启动应用
}// 定义一个无状态的 MyApp 组件,作为应用的根组件
class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: 'Flutter Photo Picker', // 应用的标题theme: ThemeData(primarySwatch: Colors.blue), // 设置应用的主题颜色为蓝色home: PhotoPickerPage(), // 设置首页为 PhotoPickerPage 组件);}
}// 定义一个有状态的 PhotoPickerPage 组件,用于实现图片选择功能
class PhotoPickerPage extends StatefulWidget {@override_PhotoPickerPageState createState() => _PhotoPickerPageState();
}// 定义 PhotoPickerPage 的状态类,用于管理图片选择的状态
class _PhotoPickerPageState extends State<PhotoPickerPage> {final ImagePicker _picker = ImagePicker(); // 创建一个图片选择器实例XFile? _imageFile; // 定义一个变量,用于存储选择的图片文件// 定义一个异步方法,用于从图库中选择图片Future<void> _pickImage() async {try {// 调用图片选择器的 pickImage 方法,从图库中选择图片final pickedFile = await _picker.pickImage(source: ImageSource.gallery);setState(() {// 更新状态,将选择的图片文件赋值给 _imageFile_imageFile = pickedFile;});} catch (e) {// 捕获异常并打印错误信息print('Error picking image: $e');}}@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('选择照片'), // 设置应用栏的标题),body: Column(mainAxisAlignment: MainAxisAlignment.center, // 将子组件垂直居中children: <Widget>[// 设置图片显示区域Container(width: 300, // 设置容器的固定宽度为 300height: 300, // 设置容器的固定高度为 300decoration: BoxDecoration(border: Border.all(color: Colors.grey), // 添加灰色边框,便于观察容器边界),child: _imageFile == null? Center(child: Text('没有选择照片')) // 如果没有选择图片,显示提示文本: ClipRRect(borderRadius: BorderRadius.circular(8), // 添加圆角,半径为 8child: Image.file(File(_imageFile!.path), // 显示选择的图片文件fit: BoxFit.contain, // 设置图片填充方式为完整显示,保持宽高比例),),),SizedBox(height: 20), // 添加一个高度为 20 的间隔ElevatedButton(onPressed: _pickImage, // 点击按钮时调用 _pickImage 方法选择图片child: Text('选择照片'), // 设置按钮的文本),],),);}
}

代码说明:

  1. 导入库

    • dart:io 用于处理文件操作。

    • flutter/material 提供了 Material Design 风格的组件。

    • image_picker 是一个第三方插件,用于从图库或相机中选择图片。

  2. MyApp 组件

    • 作为应用的根组件,配置了应用的基本信息,如标题和主题颜色。

  3. PhotoPickerPage 组件

    • 一个有状态的组件,用于实现图片选择和显示功能。

  4. _PhotoPickerPageState 状态类

    • 管理图片选择的状态。

    • _pickImage 方法用于从图库中选择图片,并更新状态。

  5. UI 布局

    • 使用 Scaffold 提供应用的基本结构,包括应用栏。

    • 使用 Column 垂直排列子组件。

    • 使用 Container 设置图片显示区域的固定大小,并通过 ClipRRect 添加圆角。

    • 使用 BoxFit.contain 确保图片完整显示,同时保持宽高比例。

  6. 按钮功能

    • 点击按钮时调用 _pickImage 方法,从图库中选择图片并更新显示。

六、一些问题说明

1、未能打开相册

问题描述
尝试打开相册时,应用无法获取权限或无法打开相册界面。
解决方法

  • 确保在 AndroidManifest.xml 文件中正确添加了以下权限声明:

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  • 对于 Android 6.0(API 级别 23)及以上版本,需要动态请求权限。可以使用 permission_handler 插件来请求运行时权限。

  • 检查是否正确初始化了 image_picker 插件,并确保调用权限请求的代码逻辑正确。

2、图片选择后未显示

问题描述
选择图片后,图片未能正确显示在界面上。
解决方法

  • 检查是否正确处理了选择后的返回值。确保在 pickImage 方法的回调中正确更新了图片路径。

  • 确保图片路径正确,并且图片文件确实存在。例如,可以打印图片路径进行调试。

  • 如果使用了 setState 更新图片路径,确保路径更新后界面能够正确刷新。

  • 如果图片路径是一个文件路径,确保使用 File 类加载图片,例如:

    Image.file(File(_imageFile!.path));

3、安卓版本过低,无法读取图片

问题描述
在某些低版本的 Android 设备上,图片无法正确读取或显示。
解决方法

  • 确保设备运行的是 Android 4.0(API 级别 14)或更高版本。

  • 如果需要支持更低版本的 Android,建议检查 image_picker 的版本兼容性,或者使用其他兼容性更好的插件。

  • 如果问题依然存在,可以尝试更新 image_picker 插件到最新版本,或者查阅官方文档中的相关说明。


 

在开发过程中,可能会遇到各种问题或错误。以下是一些实用的建议,帮助您更高效地解决问题:

  1. 查阅官方文档
    官方文档是解决问题的首要资源。image_picker 的官方文档提供了详细的使用方法、配置说明和常见问题解答。
    image_picker 官方文档

  2. 搜索社区论坛
    如果官方文档中没有找到答案,可以尝试搜索 Stack Overflow、GitHub Issues 或其他社区论坛。许多开发者可能已经遇到并解决了类似的问题。

相关文章:

Flutter 学习之旅 之 flutter 在 Android 端读取相册图片显示

Flutter 学习之旅 之 flutter 在 Android 端读取相册图片显示 目录 Flutter 学习之旅 之 flutter 在 Android 端读取相册图片显示 一、简单介绍 二、简单介绍 image_picker 三、安装 image_picker 四、简单案例实现 五、关键代码 代码说明&#xff1a; 一、简单介绍 Fl…...

数据结构秘籍(一)线性数据结构

1.数组 数组&#xff08;Array&#xff09;是一种很常见的数据结构。它由相同类型的元素&#xff08;element&#xff09;组成&#xff0c;并且是使用一块连续的内存来存储。 我们直接可以利用元素的索引&#xff08;index&#xff09;计算出该元素对应的存储地址。 数组的特…...

推荐律师事务管理系统(SpringCloud+mysql+rocketmq+deepseek)

1.深圳慧钛科技有限公司成立于2024年7月24日&#xff0c;官网地址&#xff1a;深圳慧钛律师事务管理系统&#xff08;官网&#xff09;-案件管理系统-律所档案管理-律所管理软件-律师办案系统-电子签章-律所印章-律师办公软件、律师办公系统、律所OA 。系统访问地址:深圳慧钛律…...

mysql怎样优化where like ‘%字符串%‘这种模糊匹配的慢sql

一 问题描述 工作中经常遇到这种模糊匹配的慢sql&#xff1a; select * from 表名 where 字段 like %字符串%; 由于前面有%&#xff0c;导致无法走该字段上的索引。 二 解决办法 ① 给该字段创建一个全文索引 CREATE FULLTEXT INDEX 索引名 ON 表名 (字段名); ② 改写sq…...

SpringSecurity基于JWT实现Token的处理

前面介绍了手写单点登录和JWT的应用,本文结合SpringSecurity来介绍下在SpringBoot项目中基于SpringSecurity作为认证授权框架的情况下如何整合JWT来实现Token的处理。 一、认证思路分析 SpringSecurity主要是通过过滤器来实现功能的!我们要找到SpringSecurity实现认证和校验…...

让AI“看见”光影变幻!华为云专利解锁动态光源渲染新境界

华为云计算技术有限公司&#xff08;申请人&#xff0c;申请号&#xff1a;202311653495.3&#xff09;通过一项创新专利&#xff0c;首次实现隐式对象模型与显式渲染管线深度融合&#xff0c;让动态光源下的图像渲染真实度与灵活性兼得&#xff01; 一、技术深度解析 技术背景…...

Linux(centos)系统安装部署MySQL8.0数据库(GLIBC版本)

前言 MySQL 是一款开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;主要用于‌结构化数据的存储、管理和检索‌。 一、检查环境 安装前检查服务器glibc版本&#xff0c;下载对应版本包 rpm -qa | grep glibc mysql安装包及依赖包已整理好&#xff0c…...

Redis缓存一致性难题:如何让数据库和缓存不“打架”?

标题&#xff1a;Redis缓存一致性难题&#xff1a;如何让数据库和缓存不“打架”&#xff1f;&#xff08;附程序员脱发指南&#xff09; 导言&#xff1a;当数据库和缓存成了“异地恋” 想象一下&#xff1a;你刚在美团下单了一份麻辣小龙虾&#xff0c;付款后刷新页面&#…...

【R包】pathlinkR转录组数据分析和可视化利器

介绍 通常情况下&#xff0c;基因表达研究如微阵列和RNA-Seq会产生数百到数千个差异表达基因&#xff08;deg&#xff09;。理解如此庞大的数据集的生物学意义变得非常困难&#xff0c;尤其是在分析多个条件和比较的情况下。该软件包利用途径富集和蛋白-蛋白相互作用网络&…...

PyCharm 的使用 + PyCharm快捷键 + 切换中文界面

2025 - 02 - 27 - 第 62 篇 Author: 郑龙浩 / 仟濹 【PyCharm的使用】 文章目录 如何使用Pycharm1 新建工程&#xff0c;新建 .py 文件&#xff0c;运行2 常用快捷键3 其他快捷键 - DeepSeek 总结如下**代码编辑****导航与定位****查找与替换****运行与调试****代码重构****其…...

1.68M 免安装多格式图片批量转 webp 无广告软件推荐

软件介绍 今天要给大家分享一款超实用的图片处理工具&#xff0c;它能实现多格式图片向 webp 格式的转换&#xff0c;无论是 jpg、png、tif、gif 还是 webp 格式自身的图片&#xff0c;都能批量且借助多线程技术进行转换。 直接打开就能用&#xff0c;体积小巧&#xff0c;仅 …...

总结gcc与msvc在标准库实现上的不同

1. std::string::data()的返回类型区别 在C17以及之前的标准中&#xff0c;std::string::data()仅有一个返回类型const char *&#xff0c;MSVC遵守了这个规定。而GCC很早就有非标准扩展&#xff0c;重载了一个 char *data() noexcept;C20标准引入了这个非标准扩展。...

《Qt窗口动画实战:Qt实现呼吸灯效果》

Qt窗口动画实战&#xff1a;Qt实现呼吸灯效果 在嵌入式设备或桌面应用中&#xff0c;呼吸灯效果是一种常见且优雅的UI动画&#xff0c;常用于指示系统状态或吸引用户注意。本文将介绍如何使用Qt动画框架实现平滑的呼吸灯效果。 一、实现原理 利用Qt自带的动画框架来实现&…...

Rider 安装包 绿色版 Win/Mac/Linux 适合.NET和游戏开发者使用 2025全栈开发终极指南:从零配置到企业级实战

下载链接&#xff1a; https://pan.baidu.com/s/1cfkJf6Zgxc1XfYrVpwtHkA?pwd1234 导语&#xff1a;JetBrains Rider以跨平台支持率100%、深度.NET集成和智能代码分析能力&#xff0c;成为2025年全栈开发者的首选工具。本文涵盖环境配置、核心功能、框架集成、性能调优、团队…...

CVE-2025-1094: 通过 WebSocket 的 SQL 注入到 RCE

该存储库包含一个针对 CVE-2025-1094 的概念验证(PoC)漏洞利用,该漏洞存在于 PostgreSQL 中,允许通过 WebSocket 劫持将 SQL 注入(SQLi)攻击升级为远程代码执行(RCE)。 概述 该漏洞利用 PostgreSQL 中的 SQL 注入漏洞,注入恶意代码读取敏感文件(如 /etc/passwd),…...

详解Tomcat下载安装以及IDEA配置Tomcat(2023最新)

目录 步骤一&#xff1a;首先确认自己是否已经安装JDK步骤二&#xff1a;下载安装Tomcat步骤三&#xff1a;Tomcat配置环境变量步骤四&#xff1a;验证Tomcat配置是否成功步骤五&#xff1a;为IDEA配置Tomcat 步骤一&#xff1a;首先确认自己是否已经安装JDK jdk各版本通用安…...

AI如何通过大数据分析提升制造效率和决策智能化

人工智能&#xff08;AI&#xff09;与大数据技术的融合&#xff0c;不仅重新定义了生产流程&#xff0c;更让企业实现了从“经验驱动”到“数据智能驱动”的跨越式升级。 从“模糊经验”到“精准洞察”​​ 传统制造业依赖人工经验制定生产计划&#xff0c;但面对复杂多变的市…...

开源程序wordpress在海外品牌推广中的重要作用

WordPress作为全球最流行的开源内容管理系统(CMS)&#xff0c;在全球网站搭建中占据超过40%的市场份额。其强大的功能、灵活性和易用性使其成为企业进行海外品牌推广的首选平台。以下是WordPress在海外品牌推广中的重要性分析&#xff1a; 1. 多语言支持与本地化 WordPress通…...

kafka-关于ISR-概述

一. 什么是ISR &#xff1f; Kafka 中通常每个分区都有多个副本&#xff0c;其中一个副本被选举为 Leader&#xff0c;其他副本为 Follower。ISR 是指与 Leader 副本保持同步的 Follower 副本集合。ISR 机制的核心是确保数据在多个副本之间的一致性和可靠性&#xff0c;同时在 …...

Android 8.0 (API 26) 对广播机制做了哪些变化

大部分隐式广播无法通过静态注册接收&#xff0c;除了以下白名单广播&#xff1a; ACTION_BOOT_COMPLETED ACTION_TIMEZONE_CHANGED ACTION_LOCALE_CHANGED ACTION_MY_PACKAGE_REPLACED ACTION_PACKAGE_ADDED ACTION_PACKAGE_REMOVED 需要以动态注册方案替换&#xff1a; cl…...

使用 Polars 进行人工智能医疗数据分析(ICU数据基本测试篇)

引言 在医疗领域&#xff0c;数据就是生命的密码&#xff0c;每一个数据点都可能蕴含着拯救生命的关键信息。特别是在 ICU 这样的重症监护场景中&#xff0c;医生需要实时、准确地了解患者的病情变化&#xff0c;以便做出及时有效的治疗决策。而随着医疗技术的飞速发展&#x…...

超过DeepSeek、o3,Claude发布全球首个混合推理模型,并将完成新一轮35亿美元融资...

Anthropic于2025年2月25日发布全球首个“混合推理”AI模型Claude 3.7 Sonnet&#xff0c;并在融资层面取得重大进展&#xff0c;计划完成35亿美元的新一轮融资&#xff0c;估值将达615亿美元。以下是核心信息整理&#xff1a; 技术突破&#xff1a;双思维模型与代码能力 1. 混合…...

# C# 中堆(Heap)与栈(Stack)的区别

在 C# 中&#xff0c;堆和栈是两种不同的内存分配机制&#xff0c;它们在存储位置、生命周期、性能和用途上存在显著差异。理解堆和栈的区别对于优化代码性能和内存管理至关重要。 1. 栈&#xff08;Stack&#xff09; 1.1 定义 栈是一种后进先出&#xff08;LIFO&#xff0…...

OmniParser v2本地部署(2)部署omnitool(包含自动化控制工具)

1 配置omniparserserver 1.1 配置conda环境、下载依赖和权重 我建议按照OmniParser v2本地部署&#xff08;1&#xff09;部署OmniParser_v2模型先设置一次&#xff0c;其中所创造的conda环境&#xff0c;和这一步相似 1.2 启动omniparserserver 进入OmniParser/omnitool/o…...

“深入解析 SQL Server 子查询:从基础到应用”

目录 引言什么是子查询&#xff1f; 子查询的定义子查询的类型 子查询的使用 标量子查询多行子查询多列子查询相关子查询 子查询的性能优化子查询的实际案例总结 引言 在 SQL Server 中&#xff0c;子查询是一种强大的工具&#xff0c;允许我们在一个查询中嵌套另一个查询&am…...

音频进阶学习十六——LTI系统的差分方程与频域分析一(频率响应)

文章目录 前言一、差分方程的有理式1.差分方程的有理分式2.因果系统和ROC3.稳定性与ROC 二、频率响应1.定义2.幅频响应3.相频响应4.群延迟 总结 前言 本篇文章会先复习Z变换的有理分式&#xff0c;这是之前文章中提过的内容&#xff0c;这里会将差分方程和有理分式进行结合来看…...

JavaWeb-ServletContext应用域接口

文章目录 ServletContext接口简介获取一个ServletContext对象ServletContext接口中的相关方法获取应用域配置参数关于应用域参数的配置要求getContextPath获取项目路径getRealPath获取真实路径log系列方法添加相关日志增删查应用域属性 ServletContext接口简介 ServletContext…...

为什么@Autowired 在属性上被警告,在 setter 方法上不被警告

在 Spring 开发中&#xff0c;Autowired 注解常用于实现依赖注入。它可以应用于类的 属性、构造器 或 setter 方法 上。然而&#xff0c;当 Autowired 注解在 属性 上使用时&#xff0c;IntelliJ IDEA 等 IDE 会给出 Field injection is not recommended 的警告&#xff0c;而在…...

SQL命令详解之操作数据表

​​​​​ 操作数据表 操作数据表是数据库管理系统中用于存储、管理和操作数据的核心结构。数据表通常由行和列组成&#xff0c;每一列代表一种数据类型&#xff08;例如&#xff0c;整数、字符、日期等&#xff09;&#xff0c;而每一行代表一条记录&#xff08;即数据项&a…...

Linux 下使用tracepath进行网络诊断分析

简介 tracepath 命令是 Linux 中的一个网络诊断工具&#xff0c;类似于 traceroute &#xff0c;但专门用于跟踪到目标主机的网络路径&#xff0c;同时自动处理路径MTU发现。这是一种简单的方法&#xff0c;可以找出机器和远程目的地之间的跃点&#xff0c;同时还可以识别沿途…...