workaround for #349
Some checks are pending
Flutter analyze & test / flutter_analyze_and_test (push) Waiting to run

This commit is contained in:
otsmr 2025-12-26 12:12:56 +01:00
parent abd689f1fa
commit 27483bccd6
7 changed files with 43 additions and 12 deletions

View file

@ -50,7 +50,7 @@ final lockRetransStore = Mutex();
/// errors or network changes. /// errors or network changes.
class ApiService { class ApiService {
ApiService(); ApiService();
final String apiHost = kReleaseMode ? 'api.twonly.eu' : '10.99.0.140:3030'; final String apiHost = kReleaseMode ? 'api.twonly.eu' : '192.168.178.88:3030';
// final String apiHost = kReleaseMode ? 'api.twonly.eu' : 'dev.twonly.eu'; // final String apiHost = kReleaseMode ? 'api.twonly.eu' : 'dev.twonly.eu';
final String apiSecure = kReleaseMode ? 's' : ''; final String apiSecure = kReleaseMode ? 's' : '';

View file

@ -397,6 +397,7 @@ class _CameraPreviewViewState extends State<CameraPreviewView> {
sharedFromGallery: sharedFromGallery, sharedFromGallery: sharedFromGallery,
sendToGroup: widget.sendToGroup, sendToGroup: widget.sendToGroup,
mediaFileService: mediaFileService, mediaFileService: mediaFileService,
mainCameraController: mc,
), ),
transitionsBuilder: (context, animation, secondaryAnimation, child) { transitionsBuilder: (context, animation, secondaryAnimation, child) {
return child; return child;

View file

@ -7,6 +7,7 @@ import 'package:twonly/src/views/camera/image_editor/data/image_item.dart';
/// Layer class with some common properties /// Layer class with some common properties
class Layer { class Layer {
Layer({ Layer({
required this.key,
this.offset = Offset.zero, this.offset = Offset.zero,
this.opacity = 1, this.opacity = 1,
this.isEditing = false, this.isEditing = false,
@ -16,6 +17,7 @@ class Layer {
this.rotation = 0, this.rotation = 0,
this.scale = 1, this.scale = 1,
}); });
Key key;
Offset offset; Offset offset;
double rotation; double rotation;
double scale; double scale;
@ -29,18 +31,24 @@ class Layer {
/// Attributes used by [BackgroundLayer] /// Attributes used by [BackgroundLayer]
class BackgroundLayerData extends Layer { class BackgroundLayerData extends Layer {
BackgroundLayerData({ BackgroundLayerData({
required super.key,
required this.image, required this.image,
}); });
ImageItem image; ImageItem image;
} }
class FilterLayerData extends Layer { class FilterLayerData extends Layer {
FilterLayerData({
required super.key,
this.page = 1,
});
int page = 1; int page = 1;
} }
/// Attributes used by [EmojiLayer] /// Attributes used by [EmojiLayer]
class EmojiLayerData extends Layer { class EmojiLayerData extends Layer {
EmojiLayerData({ EmojiLayerData({
required super.key,
this.text = '', this.text = '',
this.size = 64, this.size = 64,
super.offset, super.offset,
@ -56,6 +64,7 @@ class EmojiLayerData extends Layer {
/// Attributes used by [TextLayer] /// Attributes used by [TextLayer]
class TextLayerData extends Layer { class TextLayerData extends Layer {
TextLayerData({ TextLayerData({
required super.key,
required this.textLayersBefore, required this.textLayersBefore,
this.text = '', this.text = '',
super.offset, super.offset,
@ -72,6 +81,7 @@ class TextLayerData extends Layer {
class DrawLayerData extends Layer { class DrawLayerData extends Layer {
// String text; // String text;
DrawLayerData({ DrawLayerData({
required super.key,
super.offset, super.offset,
super.opacity, super.opacity,
super.rotation, super.rotation,

View file

@ -119,6 +119,11 @@ class _EmojiLayerState extends State<EmojiLayer> {
setState(() { setState(() {
twoPointerWhereDown = details.pointerCount >= 2; twoPointerWhereDown = details.pointerCount >= 2;
widget.layerData.size = initialScale * details.scale; widget.layerData.size = initialScale * details.scale;
if (widget.layerData.size > 96) {
// https://github.com/twonlyapp/twonly-app/issues/349
widget.layerData.size = 96;
}
// print(widget.layerData.size);
widget.layerData.rotation = widget.layerData.rotation =
initialRotation + details.rotation; initialRotation + details.rotation;

View file

@ -23,12 +23,14 @@ class LayersViewer extends StatelessWidget {
children: [ children: [
...layers.whereType<BackgroundLayerData>().map((layerItem) { ...layers.whereType<BackgroundLayerData>().map((layerItem) {
return BackgroundLayer( return BackgroundLayer(
key: layerItem.key,
layerData: layerItem, layerData: layerItem,
onUpdate: onUpdate, onUpdate: onUpdate,
); );
}), }),
...layers.whereType<FilterLayerData>().map((layerItem) { ...layers.whereType<FilterLayerData>().map((layerItem) {
return FilterLayer( return FilterLayer(
key: layerItem.key,
layerData: layerItem, layerData: layerItem,
); );
}), }),
@ -40,12 +42,13 @@ class LayersViewer extends StatelessWidget {
.map((layerItem) { .map((layerItem) {
if (layerItem is EmojiLayerData) { if (layerItem is EmojiLayerData) {
return EmojiLayer( return EmojiLayer(
key: GlobalKey(), key: layerItem.key,
layerData: layerItem, layerData: layerItem,
onUpdate: onUpdate, onUpdate: onUpdate,
); );
} else if (layerItem is DrawLayerData) { } else if (layerItem is DrawLayerData) {
return DrawLayer( return DrawLayer(
key: layerItem.key,
layerData: layerItem, layerData: layerItem,
onUpdate: onUpdate, onUpdate: onUpdate,
); );
@ -54,7 +57,7 @@ class LayersViewer extends StatelessWidget {
}), }),
...layers.whereType<TextLayerData>().map((layerItem) { ...layers.whereType<TextLayerData>().map((layerItem) {
return TextLayer( return TextLayer(
// key: GlobalKey(), key: layerItem.key,
layerData: layerItem, layerData: layerItem,
onUpdate: onUpdate, onUpdate: onUpdate,
); );

View file

@ -44,6 +44,7 @@ class EmojiPickerBottom extends StatelessWidget {
Navigator.pop( Navigator.pop(
context, context,
EmojiLayerData( EmojiLayerData(
key: GlobalKey(),
text: emoji.emoji, text: emoji.emoji,
), ),
); );

View file

@ -16,6 +16,7 @@ import 'package:twonly/src/services/mediafiles/mediafile.service.dart';
import 'package:twonly/src/utils/log.dart'; import 'package:twonly/src/utils/log.dart';
import 'package:twonly/src/utils/misc.dart'; import 'package:twonly/src/utils/misc.dart';
import 'package:twonly/src/utils/storage.dart'; import 'package:twonly/src/utils/storage.dart';
import 'package:twonly/src/views/camera/camera_preview_components/main_camera_controller.dart';
import 'package:twonly/src/views/camera/camera_preview_components/save_to_gallery.dart'; import 'package:twonly/src/views/camera/camera_preview_components/save_to_gallery.dart';
import 'package:twonly/src/views/camera/image_editor/action_button.dart'; import 'package:twonly/src/views/camera/image_editor/action_button.dart';
import 'package:twonly/src/views/camera/image_editor/data/image_item.dart'; import 'package:twonly/src/views/camera/image_editor/data/image_item.dart';
@ -32,17 +33,18 @@ List<Layer> undoLayers = [];
List<Layer> removedLayers = []; List<Layer> removedLayers = [];
class ShareImageEditorView extends StatefulWidget { class ShareImageEditorView extends StatefulWidget {
const ShareImageEditorView({ const ShareImageEditorView(
required this.sharedFromGallery, {required this.sharedFromGallery,
required this.mediaFileService, required this.mediaFileService,
super.key, super.key,
this.imageBytesFuture, this.imageBytesFuture,
this.sendToGroup, this.sendToGroup,
}); this.mainCameraController});
final Future<Uint8List?>? imageBytesFuture; final Future<Uint8List?>? imageBytesFuture;
final Group? sendToGroup; final Group? sendToGroup;
final bool sharedFromGallery; final bool sharedFromGallery;
final MediaFileService mediaFileService; final MediaFileService mediaFileService;
final MainCameraController? mainCameraController;
@override @override
State<ShareImageEditorView> createState() => _ShareImageEditorView(); State<ShareImageEditorView> createState() => _ShareImageEditorView();
} }
@ -69,7 +71,7 @@ class _ShareImageEditorView extends State<ShareImageEditorView> {
super.initState(); super.initState();
if (media.type != MediaType.gif) { if (media.type != MediaType.gif) {
layers.add(FilterLayerData()); layers.add(FilterLayerData(key: GlobalKey()));
} }
if (widget.sendToGroup != null) { if (widget.sendToGroup != null) {
@ -147,6 +149,7 @@ class _ShareImageEditorView extends State<ShareImageEditorView> {
removedLayers.clear(); removedLayers.clear();
layers.add( layers.add(
TextLayerData( TextLayerData(
key: GlobalKey(),
textLayersBefore: layers.whereType<TextLayerData>().length, textLayersBefore: layers.whereType<TextLayerData>().length,
), ),
); );
@ -161,7 +164,7 @@ class _ShareImageEditorView extends State<ShareImageEditorView> {
onPressed: () async { onPressed: () async {
undoLayers.clear(); undoLayers.clear();
removedLayers.clear(); removedLayers.clear();
layers.add(DrawLayerData()); layers.add(DrawLayerData(key: GlobalKey()));
setState(() {}); setState(() {});
}, },
), ),
@ -458,9 +461,16 @@ class _ShareImageEditorView extends State<ShareImageEditorView> {
if (!context.mounted) return; if (!context.mounted) return;
Future.delayed(const Duration(milliseconds: 500), () async {
if (context.mounted) {
await widget.mainCameraController?.closeCamera();
}
});
layers.insert( layers.insert(
0, 0,
BackgroundLayerData( BackgroundLayerData(
key: GlobalKey(),
image: currentImage, image: currentImage,
), ),
); );
@ -526,6 +536,7 @@ class _ShareImageEditorView extends State<ShareImageEditorView> {
removedLayers.clear(); removedLayers.clear();
layers.add( layers.add(
TextLayerData( TextLayerData(
key: GlobalKey(),
offset: Offset(0, tabDownPosition), offset: Offset(0, tabDownPosition),
textLayersBefore: layers.whereType<TextLayerData>().length, textLayersBefore: layers.whereType<TextLayerData>().length,
), ),