Imrpoved image handling since the size of the image is about 5MB.
This commit is contained in:
@@ -4,13 +4,15 @@ class PictureDto {
|
||||
final int id;
|
||||
final String? comment;
|
||||
final String? category;
|
||||
final String image;
|
||||
int evaluation;
|
||||
final DateTime pictureDate;
|
||||
final String? username;
|
||||
final String imageUrl;
|
||||
final String normalSizeUrl;
|
||||
final String thumbnailSizeUrl;
|
||||
|
||||
PictureDto(
|
||||
{required this.id, required this.comment, required this.category, required this.image, required this.evaluation, required this.pictureDate, required this.username});
|
||||
{required this.id, required this.comment, required this.category, required this.evaluation, required this.pictureDate, required this.username, required this.imageUrl, required this.normalSizeUrl, required this.thumbnailSizeUrl});
|
||||
|
||||
/// Create from JSON response
|
||||
factory PictureDto.fromJson(Map<String, dynamic> json) {
|
||||
@@ -18,10 +20,12 @@ class PictureDto {
|
||||
id: json['id'] as int,
|
||||
comment: json['comment'] as String?,
|
||||
category: json['category'] as String?,
|
||||
image: json['image'] as String,
|
||||
evaluation: json["evaluation"] as int,
|
||||
pictureDate: DateTimeUtils.toDateTime(json['pictureDate']) ?? DateTime.now(),
|
||||
username: json['username'] as String?
|
||||
username: json['username'] as String?,
|
||||
imageUrl: json['imageUrl'] as String,
|
||||
normalSizeUrl: json['normalSizeUrl'] as String,
|
||||
thumbnailSizeUrl: json['thumbnailSizeUrl'] as String,
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
import 'dart:convert' show base64Decode;
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:fotodocumentation/controller/base_controller.dart';
|
||||
import 'package:fotodocumentation/controller/customer_controller.dart';
|
||||
@@ -218,8 +216,8 @@ class _CustomerWidgetState extends State<CustomerWidget> {
|
||||
alignment: Alignment.centerLeft,
|
||||
child: ConstrainedBox(
|
||||
constraints: const BoxConstraints(maxWidth: 70, maxHeight: 70),
|
||||
child: Image.memory(
|
||||
base64Decode(pictureDto.image),
|
||||
child: Image.network(
|
||||
pictureDto.thumbnailSizeUrl,
|
||||
fit: BoxFit.contain,
|
||||
),
|
||||
),
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
import 'dart:convert' show base64Decode;
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:fotodocumentation/dto/picture_dto.dart';
|
||||
import 'package:fotodocumentation/pages/ui_utils/general_style.dart';
|
||||
@@ -18,7 +16,6 @@ class PictureFullscreenDialog extends StatelessWidget {
|
||||
final dialogWidth = screenSize.width * 0.9;
|
||||
final dialogHeight = screenSize.height * 0.9 - 50;
|
||||
|
||||
final imageBytes = base64Decode(dto.image);
|
||||
return Dialog(
|
||||
backgroundColor: Colors.black,
|
||||
clipBehavior: Clip.hardEdge,
|
||||
@@ -52,8 +49,8 @@ class PictureFullscreenDialog extends StatelessWidget {
|
||||
scaleEnabled: true,
|
||||
minScale: 0.5,
|
||||
maxScale: 5.0,
|
||||
child: Image.memory(
|
||||
imageBytes,
|
||||
child: Image.network(
|
||||
dto.imageUrl,
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
import 'dart:convert' show base64Decode;
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:fotodocumentation/controller/base_controller.dart';
|
||||
import 'package:fotodocumentation/controller/customer_controller.dart';
|
||||
@@ -154,8 +152,8 @@ class _PictureWidgetState extends State<PictureWidget> {
|
||||
cursor: SystemMouseCursors.click,
|
||||
child: ConstrainedBox(
|
||||
constraints: const BoxConstraints(minWidth: 100, minHeight: 100),
|
||||
child: Image.memory(
|
||||
base64Decode(dto.image),
|
||||
child: Image.network(
|
||||
dto.normalSizeUrl,
|
||||
fit: BoxFit.contain,
|
||||
),
|
||||
),
|
||||
@@ -350,13 +348,10 @@ class _PictureWidgetState extends State<PictureWidget> {
|
||||
// Bottom navigation buttons
|
||||
Widget _bottomNavigationWidget(List<PictureDto> pictures, PictureDto selectedPicture) {
|
||||
pictures.sort((a, b) => a.pictureDate.compareTo(b.pictureDate));
|
||||
print(pictures);
|
||||
final currentIndex = pictures.indexWhere((p) => p.id == selectedPicture.id);
|
||||
final hasPrevious = currentIndex > 0;
|
||||
final hasNext = currentIndex < pictures.length - 1;
|
||||
|
||||
print("hasnext $hasNext hasPrevious $hasPrevious current $currentIndex");
|
||||
|
||||
return Padding(
|
||||
padding: const EdgeInsets.only(bottom: 24.0),
|
||||
child: Row(
|
||||
@@ -435,7 +430,7 @@ class _PictureWidgetState extends State<PictureWidget> {
|
||||
setState(() {
|
||||
_selectedPicture = pictures[index];
|
||||
});
|
||||
}else {
|
||||
} else {
|
||||
print("empty");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,7 +35,7 @@ void _testDelete(PictureController controller, int response, bool expected) asyn
|
||||
|
||||
when(client.delete(Uri.parse('http://localhost:8080/api/picture/4'), headers: {"Accept-Language": "en-US"})).thenAnswer((_) async => http.Response("", response));
|
||||
|
||||
var dto = await controller.delete(PictureDto(id: 4, image: "", pictureDate: DateTime.now(), category: "", comment: "", evaluation: 1, username: ""));
|
||||
var dto = await controller.delete(PictureDto(id: 4, pictureDate: DateTime.now(), category: "", comment: "", evaluation: 1, username: "", imageUrl: "", normalSizeUrl: "", thumbnailSizeUrl: ""));
|
||||
expect(dto, expected);
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -12,9 +12,6 @@ import 'package:mockito/mockito.dart';
|
||||
import '../testing/test_utils.dart';
|
||||
import '../testing/test_utils.mocks.dart';
|
||||
|
||||
// Minimal valid base64 encoded 1x1 pixel PNG image
|
||||
const String _testImage = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==';
|
||||
|
||||
void main() {
|
||||
TestWidgetsFlutterBinding.ensureInitialized();
|
||||
DiContainer.instance.initState();
|
||||
@@ -31,30 +28,36 @@ void main() {
|
||||
id: 1,
|
||||
comment: 'First picture comment',
|
||||
category: 'category1',
|
||||
image: _testImage,
|
||||
pictureDate: DateTime(2024, 1, 15),
|
||||
username: 'user1',
|
||||
evaluation: 1,
|
||||
imageUrl: "",
|
||||
normalSizeUrl: "",
|
||||
thumbnailSizeUrl: "",
|
||||
);
|
||||
|
||||
pictureDto2 = PictureDto(
|
||||
id: 2,
|
||||
comment: 'Second picture comment',
|
||||
category: 'category2',
|
||||
image: _testImage,
|
||||
pictureDate: DateTime(2024, 2, 20),
|
||||
username: 'user2',
|
||||
evaluation: 1,
|
||||
imageUrl: "",
|
||||
normalSizeUrl: "",
|
||||
thumbnailSizeUrl: "",
|
||||
);
|
||||
|
||||
pictureDto3 = PictureDto(
|
||||
id: 3,
|
||||
comment: null,
|
||||
category: 'category3',
|
||||
image: _testImage,
|
||||
pictureDate: DateTime(2024, 3, 25),
|
||||
username: 'user3',
|
||||
evaluation: 1,
|
||||
imageUrl: "",
|
||||
normalSizeUrl: "",
|
||||
thumbnailSizeUrl: "",
|
||||
);
|
||||
|
||||
customerDto = CustomerDto(
|
||||
@@ -170,10 +173,9 @@ void main() {
|
||||
expect(find.text('First picture comment'), findsOneWidget);
|
||||
|
||||
// Tap right navigation button
|
||||
print(find.byKey(Key("navigate_right")));
|
||||
await tester.tap(find.byKey(Key("navigate_right")));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
|
||||
// Verify second picture comment is now shown
|
||||
expect(find.text('Second picture comment'), findsOneWidget);
|
||||
expect(find.text('First picture comment'), findsNothing);
|
||||
|
||||
Reference in New Issue
Block a user