140 lines
4.6 KiB
Dart
140 lines
4.6 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:frontend/api_services/api_services.dart'; // Sesuaikan dengan path import Anda
|
|
|
|
class ImageUtilitiesPenyakit {
|
|
static Widget buildPenyakitImage(int id, {double? width, double? height}) {
|
|
final ApiService apiService = ApiService();
|
|
|
|
return FutureBuilder<bool>(
|
|
future: apiService.isPenyakitImageAvailable(id),
|
|
builder: (context, snapshot) {
|
|
if (snapshot.connectionState == ConnectionState.waiting) {
|
|
return Container(
|
|
width: width,
|
|
height: height,
|
|
color: Colors.grey[200],
|
|
child: const Center(child: CircularProgressIndicator()),
|
|
);
|
|
}
|
|
|
|
final bool imageAvailable = snapshot.data ?? false;
|
|
if (!imageAvailable) {
|
|
return Container(
|
|
width: width,
|
|
height: height ?? 150,
|
|
color: Colors.grey[300],
|
|
child: const Center(
|
|
child: Column(
|
|
mainAxisSize: MainAxisSize.min,
|
|
children: [
|
|
Icon(Icons.image_not_supported, size: 40, color: Colors.grey),
|
|
SizedBox(height: 8),
|
|
Text('Gambar tidak tersedia'),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
|
|
return Image.network(
|
|
apiService.getPenyakitImageUrl(id),
|
|
width: width,
|
|
height: height,
|
|
fit: BoxFit.cover,
|
|
errorBuilder: (context, error, stackTrace) {
|
|
print('Error loading image: $error');
|
|
return Container(
|
|
width: width,
|
|
height: height ?? 150,
|
|
color: Colors.grey[300],
|
|
child: Center(
|
|
child: Column(
|
|
mainAxisSize: MainAxisSize.min,
|
|
children: [
|
|
Icon(Icons.error_outline, size: 40, color: Colors.red),
|
|
SizedBox(height: 8),
|
|
Text('Tidak dapat memuat gambar'),
|
|
SizedBox(height: 4),
|
|
Text(
|
|
error.toString(),
|
|
style: TextStyle(fontSize: 10, color: Colors.red[700]),
|
|
maxLines: 2,
|
|
overflow: TextOverflow.ellipsis,
|
|
),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
},
|
|
loadingBuilder: (context, child, loadingProgress) {
|
|
if (loadingProgress == null) return child;
|
|
return Container(
|
|
width: width,
|
|
height: height ?? 150,
|
|
color: Colors.grey[200],
|
|
child: Center(
|
|
child: CircularProgressIndicator(
|
|
value: loadingProgress.expectedTotalBytes != null
|
|
? loadingProgress.cumulativeBytesLoaded /
|
|
loadingProgress.expectedTotalBytes!
|
|
: null,
|
|
),
|
|
),
|
|
);
|
|
},
|
|
);
|
|
},
|
|
);
|
|
}
|
|
|
|
// Widget untuk menampilkan gambar secara langsung dari URL (tanpa pengecekan ketersediaan)
|
|
static Widget buildImageFromUrl(String imageUrl, {double? width, double? height}) {
|
|
return Image.network(
|
|
imageUrl,
|
|
width: width,
|
|
height: height ?? 150,
|
|
fit: BoxFit.cover,
|
|
errorBuilder: (context, error, stackTrace) {
|
|
print('Error loading image from URL: $error');
|
|
return Container(
|
|
width: width,
|
|
height: height ?? 150,
|
|
color: Colors.grey[300],
|
|
child: Center(
|
|
child: Column(
|
|
mainAxisSize: MainAxisSize.min,
|
|
children: [
|
|
Icon(Icons.error_outline, size: 40, color: Colors.red),
|
|
SizedBox(height: 8),
|
|
Text('Gagal memuat gambar'),
|
|
SizedBox(height: 4),
|
|
Text(
|
|
error.toString(),
|
|
style: TextStyle(fontSize: 10, color: Colors.red[700]),
|
|
maxLines: 2,
|
|
overflow: TextOverflow.ellipsis,
|
|
),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
},
|
|
loadingBuilder: (context, child, loadingProgress) {
|
|
if (loadingProgress == null) return child;
|
|
return Container(
|
|
width: width,
|
|
height: height ?? 150,
|
|
color: Colors.grey[200],
|
|
child: Center(
|
|
child: CircularProgressIndicator(
|
|
value: loadingProgress.expectedTotalBytes != null
|
|
? loadingProgress.cumulativeBytesLoaded /
|
|
loadingProgress.expectedTotalBytes!
|
|
: null,
|
|
),
|
|
),
|
|
);
|
|
},
|
|
);
|
|
}
|
|
} |