Отображение изображения из настроек в приложении Flutter - PullRequest
0 голосов
/ 20 апреля 2020

У меня проблема. У меня есть приложение Drawer в приложении Flutter, и я хочу реализовать функцию, с помощью которой вы можете выбрать фотографию из галереи. Это самая легкая часть. Но я хочу сохранить это фото в настройках и загрузить его при повторном запуске приложения. Переменная imageFromPreferences должна быть Future, чтобы использовать ее в preferenceImage () Future Builder. Я не понял, как это после часов исследований. Может быть, это совершенно неправильный подход, и у вас есть другая идея.

import 'dart:io';
import 'dart:ui';
import 'package:firstapp/database/database.dart';
import 'package:firstapp/views/note.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/painting.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/widgets.dart';
import 'package:image_picker/image_picker.dart';
import 'package:firstapp/Utility/Utility.dart';

class NoteList extends StatefulWidget {
  @override
  NoteListState createState() {
    return new NoteListState();
  }
}

class NoteListState extends State<NoteList> {
  Future<File> imageFile;
  Image imageFromPreferences;

  pickImageFromGallery(ImageSource source) {
    setState(() {
      imageFile = ImagePicker.pickImage(source: source);
    });
  }

  loadImageFromPreferences() {
    Utility.getImageFromPreferences().then((img) {
      setState(() {
        imageFromPreferences = Utility.imageFromBase64String(img);
      });
    });
  }

  Widget preferenceImage() {
    return FutureBuilder<Image>(
      future: loadImageFromPreferences(),
      builder: (BuildContext context, AsyncSnapshot<Image> image) {
        print(image);
        if (image.connectionState == ConnectionState.done && image.hasData) {
          return image.data;
        } else {
          return Text("error");
        }
      },
    );
  }

  Widget imageFromGallery() {
    return FutureBuilder<File>(
      future: imageFile,
      builder: (BuildContext context, AsyncSnapshot<File> snapshot) {
        if (snapshot.connectionState == ConnectionState.done &&
            snapshot.hasData) {
          Utility.saveImageToPreferences(
              Utility.base64String(snapshot.data.readAsBytesSync()));
          return Image.file(
            snapshot.data,
          );
        }
        return null;
      },
    );
  }

  finalPicker() {
    if (imageFromGallery() == null) {
      return preferenceImage();
    } else if (imageFromGallery() != null) {
      return imageFromGallery();
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Taking Notes')),
      drawer: Drawer(
        child: ListView(
          children: <Widget>[
            UserAccountsDrawerHeader(
              accountEmail: Text('lala@web.de'),
              accountName: Text('Max'),
              decoration: BoxDecoration(
                color: Theme.of(context).primaryColor,
              ),
              currentAccountPicture: GestureDetector(
                onTap: () {
                  pickImageFromGallery(ImageSource.gallery);
                },
                child: Column(
                  children: <Widget>[finalPicker()],
                ),
              ),
            ),
            Container(
              padding: EdgeInsets.all(20.0),
              child: Text("Locked files"),
              color: Theme.of(context).primaryColor,
            ),
          ],
        ),
  ),

Так я могу сохранить изображение в виде строки в настройках. Может быть, я мог бы вместо этого сохранить его в файл?

import 'dart:async';
import 'dart:convert';

class Utility{

  static const String IMG_KEY = "IMAGE_KEY";

  static Future<bool> saveImageToPreferences(String value) async {
    final SharedPreferences preferences = await SharedPreferences.getInstance();
    return preferences.setString(IMG_KEY, value);
  }


  static Future<String> getImageFromPreferences() async{
    final SharedPreferences preferences = await SharedPreferences.getInstance();
    return preferences.getString(IMG_KEY);
  }


  static String base64String(Uint8List data) {
    return base64Encode(data);
  }

  static Image imageFromBase64String(String base64String){
    return Image.memory(base64Decode(base64String), fit: BoxFit.fill);
  }
}

Ответы [ 2 ]

0 голосов
/ 20 апреля 2020

также вы можете использовать этот плагин https://pub.dev/packages/image_picker_saver

[image_picker_saver][1]
0 голосов
/ 20 апреля 2020
// using your method of getting an image
final File image = await ImagePicker.pickImage(source: imageSource);

// getting a directory path for saving
final String path = await getApplicationDocumentsDirectory().path;

// copy the file to a new path
final File newImage = await image.copy('$path/image1.png');

setState(() {
_image = newImage;
});

вы можете сохранить этот путь в ваших общих настройках. здесь вы делаете копию в каталоге root и затем сохраняете путь к этому изображению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...