Сохранение изображений на устройство и использование сетевого образа, только если он не сохранен на устройстве (Flutter)

#android #android-studio #flutter #dart

#Android #android-studio #flutter #dart

Вопрос:

Я новичок в Flutter, поэтому извините, если это глупый вопрос.

Я пытаюсь создать приложение, в котором пользователь может загружать изображение (не обязательно изображение, должна быть возможность загружать все виды файлов), и каждый раз, когда он входит в приложение, оно будет там (автоматически). Итак, я внедрил Firebase в приложение, но это немного обременительно для сети пользователя, особенно если он подключен к сотовой связи, за это может взиматься дополнительная плата.

Итак, я хочу реализовать функциональность, которая автоматически сохраняет загруженные изображения во внутреннюю память пользователя, и в следующий раз не нужно будет загружать их заново, но, если у пользователя их нет в его хранилище, он снова загрузит их из Интернета и сохранит.

Также я хочу, чтобы пользователь мог удалить его непосредственно из своего внутреннего хранилища, не обязательно через приложение, но в приложении также должна быть опция для его удаления.

Примером функциональности, которую я ищу, является Telegram, у него есть изображения на сервере, и он загружает их, только если они не сохранены на устройстве, и пользователь может легко зайти в свое хранилище и удалить сохраненные файлы.

Текущая функциональность моего приложения заключается в загрузке изображений в приложение с их URL-адресов Firebase при каждом запуске приложения.

Мой текущий код:

 import 'package:flutter/material.dart';
import 'package:firebase_storage/firebase_storage.dart';
import 'package:flutter/widgets.dart';
import 'dart:io';
import 'package:image_picker/image_picker.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
    
final _firestore = Firestore.instance;
int pictureNumber = 0;
Stream stream;

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData.dark(),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  void initState() {
    stream = _firestore.collection('links').orderBy('link').snapshots();
    super.initState();
  }

  var _scaffoldKey = GlobalKey<ScaffoldState>();
  String imageLink;
  File _image;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      floatingActionButton: FloatingActionButton(
        backgroundColor: Colors.blue,
        child: Icon(
          Icons.add,
          size: 30,
        ),
        onPressed: () async {
          _image =
              // ignore: deprecated_member_use
              await ImagePicker.pickImage(source: ImageSource.gallery);

          FirebaseStorage firebaseStorage = FirebaseStorage.instance;
          StorageReference rootReference = firebaseStorage.ref();
          StorageReference pictureFolderRef =
              rootReference.child('pictures').child('$pictureNumber');
          pictureFolderRef.putFile(_image).onComplete.then((storageTask) async {
            String link = await storageTask.ref.getDownloadURL();
            await _firestore
                .collection('links')
                .add({'link': link, 'index': pictureNumber});
            setState(() {
              pictureNumber  ;
            });
          });
        },
      ),
      key: _scaffoldKey,
      body: PictureStream(),
    );
  }
}

class PictureStream extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return StreamBuilder(
      stream: stream,
      // ignore: missing_return
      builder: (context, snapshot) {
        List<Widget> pictures = [];
        List<Widget> fPictures = [];
        if (!snapshot.hasData) {
          return Center(
            child: CircularProgressIndicator(
              backgroundColor: Color(0xFF3E3E3E),
            ),
          );
        }
        final links = snapshot.data.documents;
        for (var linkData in links) {
          final index = linkData.data['index'];
          final link = linkData.data['link'];
          print(link);
          print(index);

          pictures.add(Image.network(link));
          print(pictures.length);
          pictureNumber = pictures.length;
        }
        for (Image image in pictures) {
          fPictures.add(image);
          fPictures.add(Divider());
        }
        return Container(
          width: double.infinity,
          child: Column(
            children: [
              Expanded(
                  child: ListView.builder(
                itemCount: fPictures.length,
                itemBuilder: (context, index) => Padding(
                  padding: EdgeInsets.all(16.0),
                  child: fPictures[index],
                ),
              )),
            ],
          ),
        );
      },
    );
  }
}
  

Хранилище Firebase:https://prnt.sc/u0c6mr .
База данных Firebase:https://prnt.sc/u0c6rw .

Комментарии:

1. Попробуйте этот сетевой образ кэша: pub.dev/packages/cached_network_image

2. Как это дает мне необходимую функциональность? Как бы мне заставить это работать с Firebase, чтобы заставить его повторно загружать любые изображения, которые еще не загружены?