#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, чтобы заставить его повторно загружать любые изображения, которые еще не загружены?