bugfix(image): Перенос хранения картинок из бд в папку приложения

This commit is contained in:
2025-09-08 20:55:17 +03:00
parent a376faf0ce
commit 51c4ae4f02
22 changed files with 191 additions and 155 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -36,7 +36,7 @@ class CollectionsDao extends DatabaseAccessor<AppDatabase>
title: dto.title,
desc: dto.desc,
isPublic: Value<bool>(dto.isPublic),
image: Value<Uint8List?>(dto.avatar),
image: Value<String?>(dto.avatar),
),
);
} catch (e, st) {
@@ -54,7 +54,7 @@ class CollectionsDao extends DatabaseAccessor<AppDatabase>
title: Value<String>(dto.title),
desc: Value<String>(dto.desc),
isPublic: Value<bool>(dto.isPublic),
image: Value<Uint8List?>(dto.avatar),
image: Value<String?>(dto.avatar),
),
);
} catch (e, st) {

View File

@@ -45,8 +45,8 @@ class TicketsDao extends DatabaseAccessor<AppDatabase> with _$TicketsDaoMixin {
question: dto.question!,
answer: dto.answer!,
collectionId: dto.collection!.id,
questionImage: Value<Uint8List?>(dto.questionImage),
answerImage: Value<Uint8List?>(dto.answerImage),
questionImage: Value<String?>(dto.questionImage),
answerImage: Value<String?>(dto.answerImage),
);
await db.managers.tickets.create((o) => companion);
@@ -58,8 +58,8 @@ class TicketsDao extends DatabaseAccessor<AppDatabase> with _$TicketsDaoMixin {
answer: dto.question!,
question: dto.answer!,
collectionId: dto.collection!.id,
answerImage: Value<Uint8List?>(dto.questionImage),
questionImage: Value<Uint8List?>(dto.answerImage),
answerImage: Value<String?>(dto.questionImage),
questionImage: Value<String?>(dto.answerImage),
);
await db.managers.tickets.create((o) => revertCompanion);

View File

@@ -75,11 +75,11 @@ class $CollectionsTable extends Collections
);
static const VerificationMeta _imageMeta = const VerificationMeta('image');
@override
late final GeneratedColumn<Uint8List> image = GeneratedColumn<Uint8List>(
late final GeneratedColumn<String> image = GeneratedColumn<String>(
'image',
aliasedName,
true,
type: DriftSqlType.blob,
type: DriftSqlType.string,
requiredDuringInsert: false,
);
static const VerificationMeta _payloadMeta = const VerificationMeta(
@@ -281,7 +281,7 @@ class $CollectionsTable extends Collections
data['${effectivePrefix}desc'],
)!,
image: attachedDatabase.typeMapping.read(
DriftSqlType.blob,
DriftSqlType.string,
data['${effectivePrefix}image'],
),
payload: attachedDatabase.typeMapping.read(
@@ -328,7 +328,7 @@ class Collection extends DataClass implements Insertable<Collection> {
final DateTime updatedAt;
final String title;
final String desc;
final Uint8List? image;
final String? image;
final String? payload;
final int likesCount;
final bool isLiked;
@@ -356,7 +356,7 @@ class Collection extends DataClass implements Insertable<Collection> {
map['title'] = Variable<String>(title);
map['desc'] = Variable<String>(desc);
if (!nullToAbsent || image != null) {
map['image'] = Variable<Uint8List>(image);
map['image'] = Variable<String>(image);
}
if (!nullToAbsent || payload != null) {
map['payload'] = Variable<String>(payload);
@@ -399,7 +399,7 @@ class Collection extends DataClass implements Insertable<Collection> {
updatedAt: serializer.fromJson<DateTime>(json['updatedAt']),
title: serializer.fromJson<String>(json['title']),
desc: serializer.fromJson<String>(json['desc']),
image: serializer.fromJson<Uint8List?>(json['image']),
image: serializer.fromJson<String?>(json['image']),
payload: serializer.fromJson<String?>(json['payload']),
likesCount: serializer.fromJson<int>(json['likesCount']),
isLiked: serializer.fromJson<bool>(json['isLiked']),
@@ -416,7 +416,7 @@ class Collection extends DataClass implements Insertable<Collection> {
'updatedAt': serializer.toJson<DateTime>(updatedAt),
'title': serializer.toJson<String>(title),
'desc': serializer.toJson<String>(desc),
'image': serializer.toJson<Uint8List?>(image),
'image': serializer.toJson<String?>(image),
'payload': serializer.toJson<String?>(payload),
'likesCount': serializer.toJson<int>(likesCount),
'isLiked': serializer.toJson<bool>(isLiked),
@@ -431,7 +431,7 @@ class Collection extends DataClass implements Insertable<Collection> {
DateTime? updatedAt,
String? title,
String? desc,
Value<Uint8List?> image = const Value.absent(),
Value<String?> image = const Value.absent(),
Value<String?> payload = const Value.absent(),
int? likesCount,
bool? isLiked,
@@ -495,7 +495,7 @@ class Collection extends DataClass implements Insertable<Collection> {
updatedAt,
title,
desc,
$driftBlobEquality.hash(image),
image,
payload,
likesCount,
isLiked,
@@ -511,7 +511,7 @@ class Collection extends DataClass implements Insertable<Collection> {
other.updatedAt == this.updatedAt &&
other.title == this.title &&
other.desc == this.desc &&
$driftBlobEquality.equals(other.image, this.image) &&
other.image == this.image &&
other.payload == this.payload &&
other.likesCount == this.likesCount &&
other.isLiked == this.isLiked &&
@@ -525,7 +525,7 @@ class CollectionsCompanion extends UpdateCompanion<Collection> {
final Value<DateTime> updatedAt;
final Value<String> title;
final Value<String> desc;
final Value<Uint8List?> image;
final Value<String?> image;
final Value<String?> payload;
final Value<int> likesCount;
final Value<bool> isLiked;
@@ -567,7 +567,7 @@ class CollectionsCompanion extends UpdateCompanion<Collection> {
Expression<DateTime>? updatedAt,
Expression<String>? title,
Expression<String>? desc,
Expression<Uint8List>? image,
Expression<String>? image,
Expression<String>? payload,
Expression<int>? likesCount,
Expression<bool>? isLiked,
@@ -597,7 +597,7 @@ class CollectionsCompanion extends UpdateCompanion<Collection> {
Value<DateTime>? updatedAt,
Value<String>? title,
Value<String>? desc,
Value<Uint8List?>? image,
Value<String?>? image,
Value<String?>? payload,
Value<int>? likesCount,
Value<bool>? isLiked,
@@ -640,7 +640,7 @@ class CollectionsCompanion extends UpdateCompanion<Collection> {
map['desc'] = Variable<String>(desc.value);
}
if (image.present) {
map['image'] = Variable<Uint8List>(image.value);
map['image'] = Variable<String>(image.value);
}
if (payload.present) {
map['payload'] = Variable<String>(payload.value);
@@ -749,12 +749,11 @@ class $TicketsTable extends Tickets with TableInfo<$TicketsTable, Ticket> {
'questionImage',
);
@override
late final GeneratedColumn<Uint8List> questionImage =
GeneratedColumn<Uint8List>(
late final GeneratedColumn<String> questionImage = GeneratedColumn<String>(
'question_image',
aliasedName,
true,
type: DriftSqlType.blob,
type: DriftSqlType.string,
requiredDuringInsert: false,
);
static const VerificationMeta _answerMeta = const VerificationMeta('answer');
@@ -770,12 +769,11 @@ class $TicketsTable extends Tickets with TableInfo<$TicketsTable, Ticket> {
'answerImage',
);
@override
late final GeneratedColumn<Uint8List> answerImage =
GeneratedColumn<Uint8List>(
late final GeneratedColumn<String> answerImage = GeneratedColumn<String>(
'answer_image',
aliasedName,
true,
type: DriftSqlType.blob,
type: DriftSqlType.string,
requiredDuringInsert: false,
);
static const VerificationMeta _collectionIdMeta = const VerificationMeta(
@@ -924,7 +922,7 @@ class $TicketsTable extends Tickets with TableInfo<$TicketsTable, Ticket> {
data['${effectivePrefix}question'],
)!,
questionImage: attachedDatabase.typeMapping.read(
DriftSqlType.blob,
DriftSqlType.string,
data['${effectivePrefix}question_image'],
),
answer:
@@ -933,7 +931,7 @@ class $TicketsTable extends Tickets with TableInfo<$TicketsTable, Ticket> {
data['${effectivePrefix}answer'],
)!,
answerImage: attachedDatabase.typeMapping.read(
DriftSqlType.blob,
DriftSqlType.string,
data['${effectivePrefix}answer_image'],
),
collectionId:
@@ -965,9 +963,9 @@ class Ticket extends DataClass implements Insertable<Ticket> {
/// Дата последней модификации
final DateTime updatedAt;
final String question;
final Uint8List? questionImage;
final String? questionImage;
final String answer;
final Uint8List? answerImage;
final String? answerImage;
final String collectionId;
final double progress;
const Ticket({
@@ -989,11 +987,11 @@ class Ticket extends DataClass implements Insertable<Ticket> {
map['updated_at'] = Variable<DateTime>(updatedAt);
map['question'] = Variable<String>(question);
if (!nullToAbsent || questionImage != null) {
map['question_image'] = Variable<Uint8List>(questionImage);
map['question_image'] = Variable<String>(questionImage);
}
map['answer'] = Variable<String>(answer);
if (!nullToAbsent || answerImage != null) {
map['answer_image'] = Variable<Uint8List>(answerImage);
map['answer_image'] = Variable<String>(answerImage);
}
map['collection_id'] = Variable<String>(collectionId);
map['progress'] = Variable<double>(progress);
@@ -1030,9 +1028,9 @@ class Ticket extends DataClass implements Insertable<Ticket> {
createdAt: serializer.fromJson<DateTime>(json['createdAt']),
updatedAt: serializer.fromJson<DateTime>(json['updatedAt']),
question: serializer.fromJson<String>(json['question']),
questionImage: serializer.fromJson<Uint8List?>(json['questionImage']),
questionImage: serializer.fromJson<String?>(json['questionImage']),
answer: serializer.fromJson<String>(json['answer']),
answerImage: serializer.fromJson<Uint8List?>(json['answerImage']),
answerImage: serializer.fromJson<String?>(json['answerImage']),
collectionId: serializer.fromJson<String>(json['collectionId']),
progress: serializer.fromJson<double>(json['progress']),
);
@@ -1045,9 +1043,9 @@ class Ticket extends DataClass implements Insertable<Ticket> {
'createdAt': serializer.toJson<DateTime>(createdAt),
'updatedAt': serializer.toJson<DateTime>(updatedAt),
'question': serializer.toJson<String>(question),
'questionImage': serializer.toJson<Uint8List?>(questionImage),
'questionImage': serializer.toJson<String?>(questionImage),
'answer': serializer.toJson<String>(answer),
'answerImage': serializer.toJson<Uint8List?>(answerImage),
'answerImage': serializer.toJson<String?>(answerImage),
'collectionId': serializer.toJson<String>(collectionId),
'progress': serializer.toJson<double>(progress),
};
@@ -1058,9 +1056,9 @@ class Ticket extends DataClass implements Insertable<Ticket> {
DateTime? createdAt,
DateTime? updatedAt,
String? question,
Value<Uint8List?> questionImage = const Value.absent(),
Value<String?> questionImage = const Value.absent(),
String? answer,
Value<Uint8List?> answerImage = const Value.absent(),
Value<String?> answerImage = const Value.absent(),
String? collectionId,
double? progress,
}) => Ticket(
@@ -1118,9 +1116,9 @@ class Ticket extends DataClass implements Insertable<Ticket> {
createdAt,
updatedAt,
question,
$driftBlobEquality.hash(questionImage),
questionImage,
answer,
$driftBlobEquality.hash(answerImage),
answerImage,
collectionId,
progress,
);
@@ -1132,9 +1130,9 @@ class Ticket extends DataClass implements Insertable<Ticket> {
other.createdAt == this.createdAt &&
other.updatedAt == this.updatedAt &&
other.question == this.question &&
$driftBlobEquality.equals(other.questionImage, this.questionImage) &&
other.questionImage == this.questionImage &&
other.answer == this.answer &&
$driftBlobEquality.equals(other.answerImage, this.answerImage) &&
other.answerImage == this.answerImage &&
other.collectionId == this.collectionId &&
other.progress == this.progress);
}
@@ -1144,9 +1142,9 @@ class TicketsCompanion extends UpdateCompanion<Ticket> {
final Value<DateTime> createdAt;
final Value<DateTime> updatedAt;
final Value<String> question;
final Value<Uint8List?> questionImage;
final Value<String?> questionImage;
final Value<String> answer;
final Value<Uint8List?> answerImage;
final Value<String?> answerImage;
final Value<String> collectionId;
final Value<double> progress;
final Value<int> rowid;
@@ -1181,9 +1179,9 @@ class TicketsCompanion extends UpdateCompanion<Ticket> {
Expression<DateTime>? createdAt,
Expression<DateTime>? updatedAt,
Expression<String>? question,
Expression<Uint8List>? questionImage,
Expression<String>? questionImage,
Expression<String>? answer,
Expression<Uint8List>? answerImage,
Expression<String>? answerImage,
Expression<String>? collectionId,
Expression<double>? progress,
Expression<int>? rowid,
@@ -1207,9 +1205,9 @@ class TicketsCompanion extends UpdateCompanion<Ticket> {
Value<DateTime>? createdAt,
Value<DateTime>? updatedAt,
Value<String>? question,
Value<Uint8List?>? questionImage,
Value<String?>? questionImage,
Value<String>? answer,
Value<Uint8List?>? answerImage,
Value<String?>? answerImage,
Value<String>? collectionId,
Value<double>? progress,
Value<int>? rowid,
@@ -1244,13 +1242,13 @@ class TicketsCompanion extends UpdateCompanion<Ticket> {
map['question'] = Variable<String>(question.value);
}
if (questionImage.present) {
map['question_image'] = Variable<Uint8List>(questionImage.value);
map['question_image'] = Variable<String>(questionImage.value);
}
if (answer.present) {
map['answer'] = Variable<String>(answer.value);
}
if (answerImage.present) {
map['answer_image'] = Variable<Uint8List>(answerImage.value);
map['answer_image'] = Variable<String>(answerImage.value);
}
if (collectionId.present) {
map['collection_id'] = Variable<String>(collectionId.value);
@@ -1318,7 +1316,7 @@ typedef $$CollectionsTableCreateCompanionBuilder =
Value<DateTime> updatedAt,
required String title,
required String desc,
Value<Uint8List?> image,
Value<String?> image,
Value<String?> payload,
Value<int> likesCount,
Value<bool> isLiked,
@@ -1333,7 +1331,7 @@ typedef $$CollectionsTableUpdateCompanionBuilder =
Value<DateTime> updatedAt,
Value<String> title,
Value<String> desc,
Value<Uint8List?> image,
Value<String?> image,
Value<String?> payload,
Value<int> likesCount,
Value<bool> isLiked,
@@ -1400,7 +1398,7 @@ class $$CollectionsTableFilterComposer
builder: (column) => ColumnFilters(column),
);
ColumnFilters<Uint8List> get image => $composableBuilder(
ColumnFilters<String> get image => $composableBuilder(
column: $table.image,
builder: (column) => ColumnFilters(column),
);
@@ -1490,7 +1488,7 @@ class $$CollectionsTableOrderingComposer
builder: (column) => ColumnOrderings(column),
);
ColumnOrderings<Uint8List> get image => $composableBuilder(
ColumnOrderings<String> get image => $composableBuilder(
column: $table.image,
builder: (column) => ColumnOrderings(column),
);
@@ -1545,7 +1543,7 @@ class $$CollectionsTableAnnotationComposer
GeneratedColumn<String> get desc =>
$composableBuilder(column: $table.desc, builder: (column) => column);
GeneratedColumn<Uint8List> get image =>
GeneratedColumn<String> get image =>
$composableBuilder(column: $table.image, builder: (column) => column);
GeneratedColumn<String> get payload =>
@@ -1627,7 +1625,7 @@ class $$CollectionsTableTableManager
Value<DateTime> updatedAt = const Value.absent(),
Value<String> title = const Value.absent(),
Value<String> desc = const Value.absent(),
Value<Uint8List?> image = const Value.absent(),
Value<String?> image = const Value.absent(),
Value<String?> payload = const Value.absent(),
Value<int> likesCount = const Value.absent(),
Value<bool> isLiked = const Value.absent(),
@@ -1655,7 +1653,7 @@ class $$CollectionsTableTableManager
Value<DateTime> updatedAt = const Value.absent(),
required String title,
required String desc,
Value<Uint8List?> image = const Value.absent(),
Value<String?> image = const Value.absent(),
Value<String?> payload = const Value.absent(),
Value<int> likesCount = const Value.absent(),
Value<bool> isLiked = const Value.absent(),
@@ -1743,9 +1741,9 @@ typedef $$TicketsTableCreateCompanionBuilder =
Value<DateTime> createdAt,
Value<DateTime> updatedAt,
required String question,
Value<Uint8List?> questionImage,
Value<String?> questionImage,
required String answer,
Value<Uint8List?> answerImage,
Value<String?> answerImage,
required String collectionId,
Value<double> progress,
Value<int> rowid,
@@ -1756,9 +1754,9 @@ typedef $$TicketsTableUpdateCompanionBuilder =
Value<DateTime> createdAt,
Value<DateTime> updatedAt,
Value<String> question,
Value<Uint8List?> questionImage,
Value<String?> questionImage,
Value<String> answer,
Value<Uint8List?> answerImage,
Value<String?> answerImage,
Value<String> collectionId,
Value<double> progress,
Value<int> rowid,
@@ -1817,7 +1815,7 @@ class $$TicketsTableFilterComposer
builder: (column) => ColumnFilters(column),
);
ColumnFilters<Uint8List> get questionImage => $composableBuilder(
ColumnFilters<String> get questionImage => $composableBuilder(
column: $table.questionImage,
builder: (column) => ColumnFilters(column),
);
@@ -1827,7 +1825,7 @@ class $$TicketsTableFilterComposer
builder: (column) => ColumnFilters(column),
);
ColumnFilters<Uint8List> get answerImage => $composableBuilder(
ColumnFilters<String> get answerImage => $composableBuilder(
column: $table.answerImage,
builder: (column) => ColumnFilters(column),
);
@@ -1890,7 +1888,7 @@ class $$TicketsTableOrderingComposer
builder: (column) => ColumnOrderings(column),
);
ColumnOrderings<Uint8List> get questionImage => $composableBuilder(
ColumnOrderings<String> get questionImage => $composableBuilder(
column: $table.questionImage,
builder: (column) => ColumnOrderings(column),
);
@@ -1900,7 +1898,7 @@ class $$TicketsTableOrderingComposer
builder: (column) => ColumnOrderings(column),
);
ColumnOrderings<Uint8List> get answerImage => $composableBuilder(
ColumnOrderings<String> get answerImage => $composableBuilder(
column: $table.answerImage,
builder: (column) => ColumnOrderings(column),
);
@@ -1955,7 +1953,7 @@ class $$TicketsTableAnnotationComposer
GeneratedColumn<String> get question =>
$composableBuilder(column: $table.question, builder: (column) => column);
GeneratedColumn<Uint8List> get questionImage => $composableBuilder(
GeneratedColumn<String> get questionImage => $composableBuilder(
column: $table.questionImage,
builder: (column) => column,
);
@@ -1963,7 +1961,7 @@ class $$TicketsTableAnnotationComposer
GeneratedColumn<String> get answer =>
$composableBuilder(column: $table.answer, builder: (column) => column);
GeneratedColumn<Uint8List> get answerImage => $composableBuilder(
GeneratedColumn<String> get answerImage => $composableBuilder(
column: $table.answerImage,
builder: (column) => column,
);
@@ -2027,9 +2025,9 @@ class $$TicketsTableTableManager
Value<DateTime> createdAt = const Value.absent(),
Value<DateTime> updatedAt = const Value.absent(),
Value<String> question = const Value.absent(),
Value<Uint8List?> questionImage = const Value.absent(),
Value<String?> questionImage = const Value.absent(),
Value<String> answer = const Value.absent(),
Value<Uint8List?> answerImage = const Value.absent(),
Value<String?> answerImage = const Value.absent(),
Value<String> collectionId = const Value.absent(),
Value<double> progress = const Value.absent(),
Value<int> rowid = const Value.absent(),
@@ -2051,9 +2049,9 @@ class $$TicketsTableTableManager
Value<DateTime> createdAt = const Value.absent(),
Value<DateTime> updatedAt = const Value.absent(),
required String question,
Value<Uint8List?> questionImage = const Value.absent(),
Value<String?> questionImage = const Value.absent(),
required String answer,
Value<Uint8List?> answerImage = const Value.absent(),
Value<String?> answerImage = const Value.absent(),
required String collectionId,
Value<double> progress = const Value.absent(),
Value<int> rowid = const Value.absent(),

View File

@@ -64,7 +64,7 @@ mixin _Deletable on Table {
class Collections extends Table with _UuidPrimaryKey, _Timestampable {
TextColumn get title => text()();
TextColumn get desc => text()();
BlobColumn get image => blob().nullable()();
TextColumn get image => text().nullable()();
TextColumn get payload => text().nullable()();
IntColumn get likesCount => integer().withDefault(Constant(0))();
BoolColumn get isLiked => boolean().withDefault(Constant(false))();
@@ -78,9 +78,9 @@ class Collections extends Table with _UuidPrimaryKey, _Timestampable {
@DataClassName('Ticket')
class Tickets extends Table with _UuidPrimaryKey, _Timestampable {
TextColumn get question => text()();
BlobColumn get questionImage => blob().named('question_image').nullable()();
TextColumn get questionImage => text().named('question_image').nullable()();
TextColumn get answer => text()();
BlobColumn get answerImage => blob().named('answer_image').nullable()();
TextColumn get answerImage => text().named('answer_image').nullable()();
TextColumn get collectionId =>
text().references(Collections, #id, onDelete: KeyAction.cascade)();
RealColumn get progress => real().withDefault(Constant(0))();

View File

@@ -6,7 +6,7 @@
/// Locales: 2
/// Strings: 20 (10 per locale)
///
/// Built on 2025-06-17 at 18:40 UTC
/// Built on 2025-09-08 at 14:50 UTC
// coverage:ignore-file
// ignore_for_file: type=lint, unused_import

View File

@@ -2,8 +2,6 @@
//
// final collectionDto = collectionDtoFromJson(jsonString);
import 'dart:convert';
import 'dart:typed_data';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:remever/database/database.dart';
@@ -14,9 +12,9 @@ abstract class CreateTicketDto with _$CreateTicketDto {
const factory CreateTicketDto({
Collection? collection,
String? question,
Uint8List? questionImage,
String? questionImage,
String? answer,
Uint8List? answerImage,
String? answerImage,
bool? needRevert,
}) = _CreateTicketDto;
}

View File

@@ -19,9 +19,9 @@ final _privateConstructorUsedError = UnsupportedError(
mixin _$CreateTicketDto {
Collection? get collection => throw _privateConstructorUsedError;
String? get question => throw _privateConstructorUsedError;
Uint8List? get questionImage => throw _privateConstructorUsedError;
String? get questionImage => throw _privateConstructorUsedError;
String? get answer => throw _privateConstructorUsedError;
Uint8List? get answerImage => throw _privateConstructorUsedError;
String? get answerImage => throw _privateConstructorUsedError;
bool? get needRevert => throw _privateConstructorUsedError;
/// Create a copy of CreateTicketDto
@@ -41,9 +41,9 @@ abstract class $CreateTicketDtoCopyWith<$Res> {
$Res call({
Collection? collection,
String? question,
Uint8List? questionImage,
String? questionImage,
String? answer,
Uint8List? answerImage,
String? answerImage,
bool? needRevert,
});
}
@@ -86,7 +86,7 @@ class _$CreateTicketDtoCopyWithImpl<$Res, $Val extends CreateTicketDto>
freezed == questionImage
? _value.questionImage
: questionImage // ignore: cast_nullable_to_non_nullable
as Uint8List?,
as String?,
answer:
freezed == answer
? _value.answer
@@ -96,7 +96,7 @@ class _$CreateTicketDtoCopyWithImpl<$Res, $Val extends CreateTicketDto>
freezed == answerImage
? _value.answerImage
: answerImage // ignore: cast_nullable_to_non_nullable
as Uint8List?,
as String?,
needRevert:
freezed == needRevert
? _value.needRevert
@@ -120,9 +120,9 @@ abstract class _$$CreateTicketDtoImplCopyWith<$Res>
$Res call({
Collection? collection,
String? question,
Uint8List? questionImage,
String? questionImage,
String? answer,
Uint8List? answerImage,
String? answerImage,
bool? needRevert,
});
}
@@ -164,7 +164,7 @@ class __$$CreateTicketDtoImplCopyWithImpl<$Res>
freezed == questionImage
? _value.questionImage
: questionImage // ignore: cast_nullable_to_non_nullable
as Uint8List?,
as String?,
answer:
freezed == answer
? _value.answer
@@ -174,7 +174,7 @@ class __$$CreateTicketDtoImplCopyWithImpl<$Res>
freezed == answerImage
? _value.answerImage
: answerImage // ignore: cast_nullable_to_non_nullable
as Uint8List?,
as String?,
needRevert:
freezed == needRevert
? _value.needRevert
@@ -202,11 +202,11 @@ class _$CreateTicketDtoImpl implements _CreateTicketDto {
@override
final String? question;
@override
final Uint8List? questionImage;
final String? questionImage;
@override
final String? answer;
@override
final Uint8List? answerImage;
final String? answerImage;
@override
final bool? needRevert;
@@ -226,15 +226,11 @@ class _$CreateTicketDtoImpl implements _CreateTicketDto {
) &&
(identical(other.question, question) ||
other.question == question) &&
const DeepCollectionEquality().equals(
other.questionImage,
questionImage,
) &&
(identical(other.questionImage, questionImage) ||
other.questionImage == questionImage) &&
(identical(other.answer, answer) || other.answer == answer) &&
const DeepCollectionEquality().equals(
other.answerImage,
answerImage,
) &&
(identical(other.answerImage, answerImage) ||
other.answerImage == answerImage) &&
(identical(other.needRevert, needRevert) ||
other.needRevert == needRevert));
}
@@ -244,9 +240,9 @@ class _$CreateTicketDtoImpl implements _CreateTicketDto {
runtimeType,
const DeepCollectionEquality().hash(collection),
question,
const DeepCollectionEquality().hash(questionImage),
questionImage,
answer,
const DeepCollectionEquality().hash(answerImage),
answerImage,
needRevert,
);
@@ -266,9 +262,9 @@ abstract class _CreateTicketDto implements CreateTicketDto {
const factory _CreateTicketDto({
final Collection? collection,
final String? question,
final Uint8List? questionImage,
final String? questionImage,
final String? answer,
final Uint8List? answerImage,
final String? answerImage,
final bool? needRevert,
}) = _$CreateTicketDtoImpl;
@@ -277,11 +273,11 @@ abstract class _CreateTicketDto implements CreateTicketDto {
@override
String? get question;
@override
Uint8List? get questionImage;
String? get questionImage;
@override
String? get answer;
@override
Uint8List? get answerImage;
String? get answerImage;
@override
bool? get needRevert;

View File

@@ -2,7 +2,6 @@
//
// final collectionDto = collectionDtoFromJson(jsonString);
import 'dart:convert';
import 'dart:typed_data';
import 'package:freezed_annotation/freezed_annotation.dart';
@@ -14,6 +13,6 @@ abstract class CrudCollectionDto with _$CrudCollectionDto {
required String desc,
required String title,
required bool isPublic,
Uint8List? avatar,
String? avatar,
}) = _CrudCollectionDto;
}

View File

@@ -20,7 +20,7 @@ mixin _$CrudCollectionDto {
String get desc => throw _privateConstructorUsedError;
String get title => throw _privateConstructorUsedError;
bool get isPublic => throw _privateConstructorUsedError;
Uint8List? get avatar => throw _privateConstructorUsedError;
String? get avatar => throw _privateConstructorUsedError;
/// Create a copy of CrudCollectionDto
/// with the given fields replaced by the non-null parameter values.
@@ -36,7 +36,7 @@ abstract class $CrudCollectionDtoCopyWith<$Res> {
$Res Function(CrudCollectionDto) then,
) = _$CrudCollectionDtoCopyWithImpl<$Res, CrudCollectionDto>;
@useResult
$Res call({String desc, String title, bool isPublic, Uint8List? avatar});
$Res call({String desc, String title, bool isPublic, String? avatar});
}
/// @nodoc
@@ -80,7 +80,7 @@ class _$CrudCollectionDtoCopyWithImpl<$Res, $Val extends CrudCollectionDto>
freezed == avatar
? _value.avatar
: avatar // ignore: cast_nullable_to_non_nullable
as Uint8List?,
as String?,
)
as $Val,
);
@@ -96,7 +96,7 @@ abstract class _$$CrudCollectionDtoImplCopyWith<$Res>
) = __$$CrudCollectionDtoImplCopyWithImpl<$Res>;
@override
@useResult
$Res call({String desc, String title, bool isPublic, Uint8List? avatar});
$Res call({String desc, String title, bool isPublic, String? avatar});
}
/// @nodoc
@@ -139,7 +139,7 @@ class __$$CrudCollectionDtoImplCopyWithImpl<$Res>
freezed == avatar
? _value.avatar
: avatar // ignore: cast_nullable_to_non_nullable
as Uint8List?,
as String?,
),
);
}
@@ -162,7 +162,7 @@ class _$CrudCollectionDtoImpl implements _CrudCollectionDto {
@override
final bool isPublic;
@override
final Uint8List? avatar;
final String? avatar;
@override
String toString() {
@@ -178,17 +178,11 @@ class _$CrudCollectionDtoImpl implements _CrudCollectionDto {
(identical(other.title, title) || other.title == title) &&
(identical(other.isPublic, isPublic) ||
other.isPublic == isPublic) &&
const DeepCollectionEquality().equals(other.avatar, avatar));
(identical(other.avatar, avatar) || other.avatar == avatar));
}
@override
int get hashCode => Object.hash(
runtimeType,
desc,
title,
isPublic,
const DeepCollectionEquality().hash(avatar),
);
int get hashCode => Object.hash(runtimeType, desc, title, isPublic, avatar);
/// Create a copy of CrudCollectionDto
/// with the given fields replaced by the non-null parameter values.
@@ -207,7 +201,7 @@ abstract class _CrudCollectionDto implements CrudCollectionDto {
required final String desc,
required final String title,
required final bool isPublic,
final Uint8List? avatar,
final String? avatar,
}) = _$CrudCollectionDtoImpl;
@override
@@ -217,7 +211,7 @@ abstract class _CrudCollectionDto implements CrudCollectionDto {
@override
bool get isPublic;
@override
Uint8List? get avatar;
String? get avatar;
/// Create a copy of CrudCollectionDto
/// with the given fields replaced by the non-null parameter values.

View File

@@ -1,4 +1,5 @@
import 'dart:convert';
import 'dart:io';
import 'dart:math';
import 'package:auto_route/auto_route.dart';
@@ -152,7 +153,7 @@ class CollectionDetailScreen extends StatelessWidget {
condition: collection.image != null,
builder:
(context) => ClipOval(
child: Image.memory(collection.image!, fit: BoxFit.cover),
child: Image.file(File(collection.image!), fit: BoxFit.cover),
),
fallback:
(context) => Center(

View File

@@ -1,3 +1,5 @@
import 'dart:io';
import 'package:auto_route/auto_route.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
@@ -258,7 +260,7 @@ class _Collection extends StatelessWidget {
condition: collection.image != null,
builder:
(context) => ClipOval(
child: Image.memory(collection.image!, fit: BoxFit.cover),
child: Image.file(File(collection.image!), fit: BoxFit.cover),
),
fallback:
(context) => Center(

View File

@@ -1,4 +1,5 @@
import 'dart:convert';
import 'dart:io';
import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart';
@@ -172,7 +173,7 @@ class CollectionCard extends StatelessWidget {
condition: collection.image != null,
builder:
(context) => ClipOval(
child: Image.memory(collection.image!, fit: BoxFit.cover),
child: Image.file(File(collection.image!), fit: BoxFit.cover),
),
fallback:
(context) => Center(

View File

@@ -1,3 +1,5 @@
import 'dart:io';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_slidable/flutter_slidable.dart';
@@ -181,7 +183,7 @@ class _TicketCardState extends State<TicketCard> {
dimension: 64.r,
child: ClipRRect(
borderRadius: BorderRadius.circular(8).r,
child: Image.memory(imageBytes!, fit: BoxFit.cover),
child: Image.file(File(imageBytes!), fit: BoxFit.cover),
),
),
),

View File

@@ -3,6 +3,7 @@ import 'package:auto_route/auto_route.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'package:remever/common/functions.dart';
import 'package:remever/common/resources.dart';
import 'package:remever/common/utils.dart';
@@ -21,6 +22,7 @@ import 'package:remever/screens/create_card/widgets/crud_ticket.dart';
import 'package:remever/services/tickets/tickets_interface.dart';
import 'package:remever/widgets/debug/app_debug.dart';
import 'package:remever/widgets/primary_button.dart';
import 'package:path/path.dart' as path;
@RoutePage()
class CreateScreen extends StatefulWidget {
@@ -50,13 +52,27 @@ class _CreateScreenState extends State<CreateScreen> {
showErrorToast('Не удалось получить путь к файлу');
return;
}
final file = File(filePath);
final bytes = await file.readAsBytes();
// Получаем директорию документов
final Directory directory = await getApplicationDocumentsDirectory();
final String ticketsDirPath = path.join(directory.path, 'tickets');
final Directory ticketsDir = Directory(ticketsDirPath);
// Создаём директорию рекурсивно
if (!(await ticketsDir.exists())) {
await ticketsDir.create(recursive: true);
}
final String fileName = path.basename(filePath);
final String destinationPath = path.join(ticketsDirPath, fileName);
final copiedFile = await File(filePath).copy(destinationPath);
safeSetState(() {
_dto =
isQuestion
? _dto.copyWith(questionImage: bytes)
: _dto.copyWith(answerImage: bytes);
? _dto.copyWith(questionImage: copiedFile.path)
: _dto.copyWith(answerImage: copiedFile.path);
});
}
@@ -284,7 +300,10 @@ class _CreateScreenState extends State<CreateScreen> {
condition: _dto.collection?.image != null,
builder:
(context) => ClipOval(
child: Image.memory(_dto.collection!.image!, fit: BoxFit.cover),
child: Image.file(
File(_dto.collection!.image!),
fit: BoxFit.cover,
),
),
fallback:
(context) => Center(

View File

@@ -1,3 +1,5 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:readmore/readmore.dart';
import 'package:remever/common/resources.dart';
@@ -100,8 +102,8 @@ class CrudTicket extends StatelessWidget {
builder: (context) {
return ClipRRect(
borderRadius: const BorderRadius.all(Radius.circular(8)).r,
child: Image.memory(
isQuestion ? dto.questionImage! : dto.answerImage!,
child: Image.file(
File(isQuestion ? dto.questionImage! : dto.answerImage!),
fit: BoxFit.cover,
),
);

View File

@@ -5,6 +5,7 @@ import 'package:auto_route/auto_route.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'package:remever/common/functions.dart';
import 'package:remever/common/resources.dart';
import 'package:remever/common/widgets/bottom_safe_space.dart';
@@ -24,6 +25,7 @@ import 'package:remever/services/collection/collections_interface.dart';
import 'package:remever/widgets/primary_button.dart';
import '../../../components/extensions/state.dart';
import 'package:path/path.dart' as path;
@RoutePage()
class CrudCollectionScreen extends StatefulWidget {
@@ -58,10 +60,27 @@ class _CrudCollectionScreenState extends State<CrudCollectionScreen> {
Future<void> _pickImage() async {
final result = await FilePicker.platform.pickFiles();
if (result?.files.single.path case final String? path?) {
if (result?.files.single.path case final String? originPath?) {
try {
final bytes = await File(path!).readAsBytes();
_updateCollection(avatar: bytes);
// Получаем директорию документов
final Directory directory = await getApplicationDocumentsDirectory();
final String collectionsDirPath = path.join(
directory.path,
'collections',
);
final Directory collectionsDir = Directory(collectionsDirPath);
// Создаём директорию рекурсивно
if (!(await collectionsDir.exists())) {
await collectionsDir.create(recursive: true);
}
final String fileName = path.basename(originPath!);
final String destinationPath = path.join(collectionsDirPath, fileName);
await File(originPath).copy(destinationPath);
_updateCollection(avatar: destinationPath);
} catch (e) {
showErrorToast('Не удалось загрузить изображение');
}
@@ -74,7 +93,7 @@ class _CrudCollectionScreenState extends State<CrudCollectionScreen> {
String? title,
String? desc,
bool? isPublic,
Uint8List? avatar,
String? avatar,
}) {
_collection = _collection.copyWith(
title: title ?? _collection.title,
@@ -389,8 +408,8 @@ class _CrudCollectionScreenState extends State<CrudCollectionScreen> {
condition: _collection.avatar != null,
builder:
(_) => ClipOval(
child: Image.memory(
_collection.avatar!,
child: Image.file(
File(_collection.avatar!),
fit: BoxFit.cover,
errorBuilder: (_, __, ___) => _buildPhotoPlaceholder(),
),

View File

@@ -1,4 +1,5 @@
import 'dart:convert';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:remever/common/resources.dart';
@@ -94,7 +95,7 @@ class InfoDialog extends StatelessWidget {
condition: collection.image != null,
builder:
(context) => ClipOval(
child: Image.memory(collection.image!, fit: BoxFit.cover),
child: Image.file(File(collection.image!), fit: BoxFit.cover),
),
fallback:
(context) => Center(

View File

@@ -1,3 +1,5 @@
import 'dart:io';
import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart';
import 'package:remever/common/functions.dart';
@@ -217,7 +219,7 @@ class _ReplaceDialogState extends State<ReplaceDialog> {
condition: collection.image != null,
builder:
(context) => ClipOval(
child: Image.memory(collection.image!, fit: BoxFit.cover),
child: Image.file(File(collection.image!), fit: BoxFit.cover),
),
fallback:
(context) => Center(

View File

@@ -910,7 +910,7 @@ packages:
source: hosted
version: "1.1.0"
path_provider:
dependency: transitive
dependency: "direct main"
description:
name: path_provider
sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd"

View File

@@ -38,6 +38,8 @@ dependencies:
pin_code_fields: ^8.0.1
modal_bottom_sheet: ^3.0.0
file_picker: ^10.0.0
path_provider: ^2.1.5
# logs
talker: ^4.6.11