Untitled
unknown
plain_text
a year ago
5.4 kB
5
Indexable
import 'dart:io';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:firebase_storage/firebase_storage.dart';
import 'package:image_picker/image_picker.dart';
import 'package:flutter/foundation.dart' show kIsWeb;
class StoragePage extends StatefulWidget {
const StoragePage({Key? key}) : super(key: key);
@override
_StoragePageState createState() => _StoragePageState();
}
class _StoragePageState extends State<StoragePage> {
final FirebaseStorage storage = FirebaseStorage.instance;
List<Reference> refs = [];
List<String> arquivos = [];
bool loading = true;
bool uploading = false;
double total = 0;
Future<XFile?> getImage() async {
final ImagePicker picker = ImagePicker();
XFile? image = await picker.pickImage(source: ImageSource.gallery);
return image;
}
Future<UploadTask> upload(String path) async {
File file = File(path);
try {
String ref = 'images/img-${DateTime.now().toString()}.jpeg';
final storageRef = FirebaseStorage.instance.ref();
return storageRef.child(ref).putFile(
file,
SettableMetadata(
cacheControl: "public, max-age=300",
contentType: "image/jpeg",
customMetadata: {
"user": "123",
},
),
);
} on FirebaseException catch (e) {
throw Exception('Erro no upload: ${e.code}');
}
}
pickAndUploadImage() async {
XFile? file = await getImage();
if (file != null) {
UploadTask task = await upload(file.path);
task.snapshotEvents.listen((TaskSnapshot snapshot) async {
if (snapshot.state == TaskState.running) {
setState(() {
uploading = true;
total = (snapshot.bytesTransferred / snapshot.totalBytes) * 100;
});
} else if (snapshot.state == TaskState.success) {
final photoRef = snapshot.ref;
arquivos.add(await photoRef.getDownloadURL());
refs.add(photoRef);
setState(() => uploading = false);
}
});
}
}
@override
void initState() {
super.initState();
loadImages();
}
loadImages() async {
refs = (await storage.ref('images').listAll()).items;
for (var ref in refs) {
final arquivo = await ref.getDownloadURL();
arquivos.add(arquivo);
}
setState(() => loading = false);
}
deleteImage(int index) async {
await storage.ref(refs[index].fullPath).delete();
arquivos.removeAt(index);
refs.removeAt(index);
setState(() {});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
centerTitle: true,
title: uploading
? Text('${total.round()}% enviado')
: const Text('Firebase Storage'),
actions: [
uploading
? const Padding(
padding: EdgeInsets.only(right: 12.0),
child: Center(
child: SizedBox(
width: 20.0,
height: 20.0,
child: CircularProgressIndicator(
strokeWidth: 3,
color: Colors.white,
),
),
),
)
: IconButton(
icon: const Icon(Icons.upload),
onPressed: pickAndUploadImage,
)
],
elevation: 0,
),
body: loading
? const Center(child: CircularProgressIndicator())
: Padding(
padding: const EdgeInsets.all(24.0),
child: arquivos.isEmpty
? const Center(child: Text('Não há imagens ainda.'))
: ListView.builder(
itemBuilder: (BuildContext context, index) {
return ListTile(
leading: SizedBox(
width: 60,
height: 40,
child: kIsWeb
? Image.network(
arquivos[index],
fit: BoxFit.cover,
errorBuilder: (BuildContext context,
Object error, StackTrace? stackTrace) {
print(
'Erro ao carregar a imagem: $error');
return const SizedBox(); // ou substitua por um widget de placeholder
},
)
: Image(
image: CachedNetworkImageProvider(
arquivos[index]),
fit: BoxFit.cover,
),
),
title: Text('Image $index'),
trailing: IconButton(
icon: const Icon(Icons.delete),
onPressed: () => deleteImage(index),
),
);
},
itemCount: arquivos.length,
),
),
);
}
}
Editor is loading...
Leave a Comment