Flutter 如何将多个图像保存到Flatter中的共享首选项?
我想将多个图像保存到SharedReferences。我已经从我的图库中获取了图像并保存了它,但我不想保存一张图像,我想保存多张图像。这是我的密码:Flutter 如何将多个图像保存到Flatter中的共享首选项?,flutter,sharedpreferences,Flutter,Sharedpreferences,我想将多个图像保存到SharedReferences。我已经从我的图库中获取了图像并保存了它,但我不想保存一张图像,我想保存多张图像。这是我的密码: import 'package:flutter/material.dart'; import 'package:image_picker/image_picker.dart'; import 'package:path_provider/path_provider.dart'; import 'dart:io'; import 'Utility.d
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:path_provider/path_provider.dart';
import 'dart:io';
import 'Utility.dart';
class SaveImageDemo extends StatefulWidget {
SaveImageDemo() : super();
final String title = "Flutter Save Image in Preferences";
@override
_SaveImageDemoState createState() => _SaveImageDemoState();
}
class _SaveImageDemoState extends State<SaveImageDemo> {
//
Future<File> imageFile;
Future<List<Image>> myImageList;
List<Image> imageHolderList = List<Image>();
Image imageFromPreferences;
pickImageFromGallery(ImageSource source) {
setState(() {
imageFile = ImagePicker.pickImage(source: source);
});
}
loadImageFromPreferences() {
Utility.getImageFromPreferences().then((img) {
if (null == img) {
return;
}
setState(() {
imageFromPreferences = Utility.imageFromBase64String(img);
});
});
}
Widget imageFromGallery() {
return FutureBuilder<File>(
future: imageFile,
builder: (BuildContext context, AsyncSnapshot<File> snapshot) {
if (snapshot.connectionState == ConnectionState.done &&
null != snapshot.data) {
print(snapshot.data.path);
Utility.saveImageToPreferences(
Utility.base64String(snapshot.data.readAsBytesSync()));
imageHolderList.add(Image.file(snapshot.data));
print(imageHolderList.length);
return Image.file(
snapshot.data,
);
} else if (null != snapshot.error) {
return const Text(
'Error Picking Image',
textAlign: TextAlign.center,
);
} else {
return const Text(
'No Image Selected',
textAlign: TextAlign.center,
);
}
},
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
actions: <Widget>[
IconButton(
icon: Icon(Icons.add),
onPressed: () {
pickImageFromGallery(ImageSource.gallery);
setState(() {
imageFromPreferences = null;
});
},
),
IconButton(
icon: Icon(Icons.refresh),
onPressed: () {
loadImageFromPreferences();
},
),
],
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
SizedBox(
height: 20.0,
),
Container(width: 100, height: 250, child: imageFromGallery()),
Expanded(
child: ListView.builder(
shrinkWrap: true,
scrollDirection: Axis.horizontal,
itemCount: imageHolderList.length ?? 0,
itemBuilder: (BuildContext context, int index) => Card(
child: Container(
width: 100, height: 100, child: imageHolderList[index]),
),
),
),
SizedBox(
height: 400.0,
),
null == imageFromPreferences ? Container() : imageFromPreferences,
],
),
),
);
}
}
导入“包装:颤振/材料.省道”;
导入“包:image_picker/image_picker.dart”;
导入“package:path_provider/path_provider.dart”;
导入“dart:io”;
导入“Utility.dart”;
类SaveImageDemo扩展StatefulWidget{
SaveImageDemo():super();
最终字符串title=“颤振在首选项中保存图像”;
@凌驾
_SaveImageDemoState createState()=>\u SaveImageDemoState();
}
类_SaveImageDemoState扩展状态{
//
未来图像文件;
未来myImageList;
List imageHolderList=List();
图像偏好;
pickImageFromGallery(图像源){
设置状态(){
imageFile=ImagePicker.pickImage(源:源);
});
}
loadImageFromPreferences(){
Utility.getImageFromPreferences().then((img){
if(null==img){
返回;
}
设置状态(){
imageFromPreferences=Utility.imageFromBase64String(img);
});
});
}
Widget imageFromGallery(){
回归未来建设者(
未来:图像文件,
生成器:(BuildContext上下文,异步快照){
如果(snapshot.connectionState==connectionState.done&&
null!=快照。数据){
打印(快照、数据、路径);
Utility.saveImageToPreferences(
base64String(snapshot.data.readAsBytesSync());
add(Image.file(snapshot.data));
打印(imageHolderList.长度);
返回Image.file(
快照数据,
);
}else if(null!=快照.错误){
返回常量文本(
“拾取图像时出错”,
textAlign:textAlign.center,
);
}否则{
返回常量文本(
“未选择图像”,
textAlign:textAlign.center,
);
}
},
);
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(widget.title),
行动:[
图标按钮(
图标:图标(Icons.add),
已按下:(){
pickImageFromGallery(ImageSource.gallery);
设置状态(){
imageFromPreferences=null;
});
},
),
图标按钮(
图标:图标(Icons.refresh),
已按下:(){
loadImageFromPreferences();
},
),
],
),
正文:中(
子:列(
mainAxisAlignment:mainAxisAlignment.start,
儿童:[
大小盒子(
身高:20.0,
),
容器(宽度:100,高度:250,子级:imageFromGallery()),
扩大(
子项:ListView.builder(
收缩膜:对,
滚动方向:轴水平,
itemCount:imageHolderList.length±0,
itemBuilder:(BuildContext上下文,int索引)=>Card(
子:容器(
宽度:100,高度:100,子级:imageHolderList[索引],
),
),
),
大小盒子(
高度:400.0,
),
null==imageFromPreferences?容器():imageFromPreferences,
],
),
),
);
}
}
此代码保存1个图像。我有Utility.dart文件和该文件代码:
import 'dart:typed_data';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:flutter/material.dart';
import 'dart:async';
import 'dart:convert';
class Utility {
//
static const String KEY = "IMAGE_KEY";
static Future<String> getImageFromPreferences() async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.getString(KEY) ?? null;
}
static Future<bool> saveImageToPreferences(String value) async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.setString(KEY, value);
}
static Image imageFromBase64String(String base64String) {
return Image.memory(
base64Decode(base64String),
fit: BoxFit.fill,
);
}
static Uint8List dataFromBase64String(String base64String) {
return base64Decode(base64String);
}
static String base64String(Uint8List data) {
return base64Encode(data);
}
}
导入'dart:typed_data';
导入“package:shared_preferences/shared_preferences.dart”;
进口“包装:颤振/材料.省道”;
导入“dart:async”;
导入“dart:convert”;
类效用{
//
静态常量字符串KEY=“IMAGE\u KEY”;
静态未来getImageFromPreferences()异步{
final SharedReferences prefs=等待SharedReferences.getInstance();
返回prefs.getString(键)??空;
}
静态未来saveImageToPreferences(字符串值)异步{
final SharedReferences prefs=等待SharedReferences.getInstance();
返回prefs.setString(键、值);
}
静态图像imageFromBase64String(字符串base64String){
返回图像。内存(
Base64解码(Base64字符串),
fit:BoxFit.fill,
);
}
静态UINT8列表dataFromBase64String(字符串base64String){
返回base64Decode(base64String);
}
静态字符串base64String(Uint8List数据){
返回base64Encode(数据);
}
}
我唯一想做的就是保存多个图像,就像我保存一个图像一样。您可以使用
SharedReferences
的setStringList
方法:
import 'dart:typed_data';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:flutter/material.dart';
import 'dart:async';
import 'dart:convert';
class Utility {
//
static const String KEY = "IMAGES_KEY";
static Future<List<String>> getImagesFromPreferences() async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.getStringList(KEY) ?? null;
}
static Future<bool> saveImageToPreferences(String value) async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
List<String> currentImages = await prefs.getStringList(KEY); // getting current loaded images
currentImages.add(value); // adding the new image
return prefs.setStringList(KEY, currentImages); // saving the array of images
}
static Future<bool> resetImages() async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.setStringList(KEY, []); // deleting all saved images
}
static Image imageFromBase64String(String base64String) {
return Image.memory(
base64Decode(base64String),
fit: BoxFit.fill,
);
}
static Uint8List dataFromBase64String(String base64String) {
return base64Decode(base64String);
}
static String base64String(Uint8List data) {
return base64Encode(data);
}
}
导入'dart:typed_data';
导入“package:shared_preferences/shared_preferences.dart”;
进口“包装:颤振/材料.省道”;
导入“dart:async”;
导入“dart:convert”;
类效用{
//
静态常量字符串KEY=“IMAGES\u KEY”;
静态未来getImagesFromPreferences()异步{
final SharedReferences prefs=等待SharedReferences.getInstance();
返回prefs.getStringList(键)??空;
}
静态未来saveImageToPreferences(字符串值)异步{
final SharedReferences prefs=等待SharedReferences.getInstance();
List currentImages=wait prefs.getStringList(键);//获取当前加载的图像
currentImages.add(value);//添加新图像
return prefs.setString(KEY,currentImages);//保存图像数组
}
静态未来resetImages()异步{
final SharedReferences prefs=等待SharedReferences.getInstance();
return prefs.setString(键[]);//删除所有保存的图像
}
静态图像imageFromBase64String(字符串base64String){
返回图像。内存(
Base64解码(Base64字符串),
fit:BoxFit.fill,
);
}
静态UINT8列表dataFromBase64String(字符串base64String){
返回base64Decode(base64String);
}
静态Stri