Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 如何将多个图像保存到Flatter中的共享首选项?_Flutter_Sharedpreferences - Fatal编程技术网

Flutter 如何将多个图像保存到Flatter中的共享首选项?

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

我想将多个图像保存到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.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