Feature: Получение данных для тренировки, фоторедактор, изменение хранения изображений на локальный формат файлов а не байтов в бд #8

Merged
Dimkov966 merged 7 commits from feature/training into develop 2025-09-08 19:46:19 +00:00
22 changed files with 191 additions and 155 deletions
Showing only changes of commit 51c4ae4f02 - Show all commits

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

View File

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

View File

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

View File

@@ -6,7 +6,7 @@
/// Locales: 2 /// Locales: 2
/// Strings: 20 (10 per locale) /// 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 // coverage:ignore-file
// ignore_for_file: type=lint, unused_import // ignore_for_file: type=lint, unused_import

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,3 +1,5 @@
import 'dart:io';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_slidable/flutter_slidable.dart'; import 'package:flutter_slidable/flutter_slidable.dart';
@@ -181,7 +183,7 @@ class _TicketCardState extends State<TicketCard> {
dimension: 64.r, dimension: 64.r,
child: ClipRRect( child: ClipRRect(
borderRadius: BorderRadius.circular(8).r, 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:file_picker/file_picker.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'package:remever/common/functions.dart'; import 'package:remever/common/functions.dart';
import 'package:remever/common/resources.dart'; import 'package:remever/common/resources.dart';
import 'package:remever/common/utils.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/services/tickets/tickets_interface.dart';
import 'package:remever/widgets/debug/app_debug.dart'; import 'package:remever/widgets/debug/app_debug.dart';
import 'package:remever/widgets/primary_button.dart'; import 'package:remever/widgets/primary_button.dart';
import 'package:path/path.dart' as path;
@RoutePage() @RoutePage()
class CreateScreen extends StatefulWidget { class CreateScreen extends StatefulWidget {
@@ -50,13 +52,27 @@ class _CreateScreenState extends State<CreateScreen> {
showErrorToast('Не удалось получить путь к файлу'); showErrorToast('Не удалось получить путь к файлу');
return; 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(() { safeSetState(() {
_dto = _dto =
isQuestion isQuestion
? _dto.copyWith(questionImage: bytes) ? _dto.copyWith(questionImage: copiedFile.path)
: _dto.copyWith(answerImage: bytes); : _dto.copyWith(answerImage: copiedFile.path);
}); });
} }
@@ -284,7 +300,10 @@ class _CreateScreenState extends State<CreateScreen> {
condition: _dto.collection?.image != null, condition: _dto.collection?.image != null,
builder: builder:
(context) => ClipOval( (context) => ClipOval(
child: Image.memory(_dto.collection!.image!, fit: BoxFit.cover), child: Image.file(
File(_dto.collection!.image!),
fit: BoxFit.cover,
),
), ),
fallback: fallback:
(context) => Center( (context) => Center(

View File

@@ -1,3 +1,5 @@
import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:readmore/readmore.dart'; import 'package:readmore/readmore.dart';
import 'package:remever/common/resources.dart'; import 'package:remever/common/resources.dart';
@@ -100,8 +102,8 @@ class CrudTicket extends StatelessWidget {
builder: (context) { builder: (context) {
return ClipRRect( return ClipRRect(
borderRadius: const BorderRadius.all(Radius.circular(8)).r, borderRadius: const BorderRadius.all(Radius.circular(8)).r,
child: Image.memory( child: Image.file(
isQuestion ? dto.questionImage! : dto.answerImage!, File(isQuestion ? dto.questionImage! : dto.answerImage!),
fit: BoxFit.cover, 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:file_picker/file_picker.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'package:remever/common/functions.dart'; import 'package:remever/common/functions.dart';
import 'package:remever/common/resources.dart'; import 'package:remever/common/resources.dart';
import 'package:remever/common/widgets/bottom_safe_space.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 'package:remever/widgets/primary_button.dart';
import '../../../components/extensions/state.dart'; import '../../../components/extensions/state.dart';
import 'package:path/path.dart' as path;
@RoutePage() @RoutePage()
class CrudCollectionScreen extends StatefulWidget { class CrudCollectionScreen extends StatefulWidget {
@@ -58,10 +60,27 @@ class _CrudCollectionScreenState extends State<CrudCollectionScreen> {
Future<void> _pickImage() async { Future<void> _pickImage() async {
final result = await FilePicker.platform.pickFiles(); 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 { 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) { } catch (e) {
showErrorToast('Не удалось загрузить изображение'); showErrorToast('Не удалось загрузить изображение');
} }
@@ -74,7 +93,7 @@ class _CrudCollectionScreenState extends State<CrudCollectionScreen> {
String? title, String? title,
String? desc, String? desc,
bool? isPublic, bool? isPublic,
Uint8List? avatar, String? avatar,
}) { }) {
_collection = _collection.copyWith( _collection = _collection.copyWith(
title: title ?? _collection.title, title: title ?? _collection.title,
@@ -389,8 +408,8 @@ class _CrudCollectionScreenState extends State<CrudCollectionScreen> {
condition: _collection.avatar != null, condition: _collection.avatar != null,
builder: builder:
(_) => ClipOval( (_) => ClipOval(
child: Image.memory( child: Image.file(
_collection.avatar!, File(_collection.avatar!),
fit: BoxFit.cover, fit: BoxFit.cover,
errorBuilder: (_, __, ___) => _buildPhotoPlaceholder(), errorBuilder: (_, __, ___) => _buildPhotoPlaceholder(),
), ),

View File

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

View File

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

View File

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

View File

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