From 0d7d5a3a5a1f833d0fa349431642b3651cbc7964 Mon Sep 17 00:00:00 2001 From: mso7nueh Date: Fri, 15 Nov 2024 16:11:40 +0300 Subject: [PATCH] feat(feed): image from camera --- lib/app_router.dart | 2 +- .../pages/blog_post_create_screen.dart | 136 +++++++++++------- 2 files changed, 85 insertions(+), 53 deletions(-) diff --git a/lib/app_router.dart b/lib/app_router.dart index 91ab37fd..457c532c 100644 --- a/lib/app_router.dart +++ b/lib/app_router.dart @@ -159,7 +159,7 @@ class AppRouter { GoRoute( path: '/blog-post-create-screen', name: 'blogPostCreateScreen', - builder: (context, state) => BlogPostCreateScreen.builder(context), + builder: (context, state) => BlogPostCreateScreen(), ), GoRoute( path: '/blog-post-screen', diff --git a/lib/features/blog_post_create/presentation/pages/blog_post_create_screen.dart b/lib/features/blog_post_create/presentation/pages/blog_post_create_screen.dart index 74a83a25..d41a1967 100644 --- a/lib/features/blog_post_create/presentation/pages/blog_post_create_screen.dart +++ b/lib/features/blog_post_create/presentation/pages/blog_post_create_screen.dart @@ -1,10 +1,10 @@ import 'dart:async'; import 'dart:io'; import 'package:eatvio_app/old/feed/blog_post_create_screen/bloc/blog_post_create_bloc.dart'; -import 'package:eatvio_app/old/feed/blog_post_create_screen/models/blog_post_create_model.dart'; import 'package:eatvio_app/theme/app_decoration.dart'; import 'package:eatvio_app/theme/theme_helper.dart'; import 'package:eatvio_app/widgets/custom_text_form_field.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart'; @@ -13,22 +13,13 @@ import 'package:image_picker/image_picker.dart'; class BlogPostCreateScreen extends StatefulWidget { const BlogPostCreateScreen({Key? key}) : super(key: key); - static Widget builder(BuildContext context) { - final blog_postID = ModalRoute.of(context)!.settings.arguments; - return BlocProvider( - create: (context) => BlogPostCreateBloc(BlogPostCreateState(blog_postModelObj: BlogPostCreateModel(blog_postID: blog_postID.toString()))) - ..add(BlogPostCreateInitialEvent()), - child: BlogPostCreateScreen(), - ); - } - @override State createState() => _BlogPostCreateScreenState(); } class _BlogPostCreateScreenState extends State { + final blogPostCreateBloc = BlogPostCreateBloc(BlogPostCreateState())..add(BlogPostCreateInitialEvent()); bool shrinkImage = false; - late StreamSubscription keyboardSubscription; @override @@ -49,24 +40,72 @@ class _BlogPostCreateScreenState extends State { } Widget build(BuildContext context) { - return BlocBuilder( - builder: (context, state) { - if (state is BlogPostCreateInitialState) { - // Это начальное состояние, данные ещё не загружены. - return Container( - color: Colors.white, - ); - } else if (state is BlogPostCreateLoadedState) { - // Данные загружены, можно строить экран. - return _buildBlogPostCreate(context, state); - } else if (state is BlogPostCreateErrorState) { - // Произошла ошибка при загрузке данных. - return Center(child: Text(state.errorMessage)); - } else { - // Другие состояния, если они есть. - return Container(); // Пустой контейнер для необработанных состояний. - } - }, + return BlocProvider( + create: (BuildContext context) => blogPostCreateBloc, + child: BlocBuilder( + builder: (context, state) { + if (state is BlogPostCreateInitialState) { + // Это начальное состояние, данные ещё не загружены. + return Container( + color: Colors.white, + ); + } else if (state is BlogPostCreateLoadedState) { + // Данные загружены, можно строить экран. + return _buildBlogPostCreate(context, state); + } else if (state is BlogPostCreateErrorState) { + // Произошла ошибка при загрузке данных. + return Center(child: Text(state.errorMessage)); + } else { + // Другие состояния, если они есть. + return Container(); // Пустой контейнер для необработанных состояний. + } + }, + ), + ); + } + + _showImagePicker() { + showCupertinoModalPopup( + context: context, + builder: (context) => CupertinoActionSheet( + actions: [ + CupertinoActionSheetAction( + onPressed: () async { + final picker = ImagePicker(); + XFile? image = await picker.pickImage(source: ImageSource.camera); + if (image != null) blogPostCreateBloc.add(UploadImages(image)); + Navigator.of(context).pop(); + }, + child: const Row( + children: const [ + Icon(Icons.photo_camera), + SizedBox(width: 8), + Text('Фото'), + ], + ), + ), + CupertinoActionSheetAction( + onPressed: () async { + final picker = ImagePicker(); + XFile? image = await picker.pickImage(source: ImageSource.gallery); + if (image != null) blogPostCreateBloc.add(UploadImages(image)); + Navigator.of(context).pop(); + }, + child: const Row( + children: const [ + Icon(Icons.photo), + SizedBox(width: 8), + Text('Галерея'), + ], + ), + ), + ], + cancelButton: CupertinoActionSheetAction( + onPressed: () => Navigator.of(context).pop(), + isDestructiveAction: true, + child: const Text('Отмена'), + ), + ), ); } @@ -164,18 +203,15 @@ class _BlogPostCreateScreenState extends State { ), ), if (state.image != null) - AnimatedContainer( + Container( width: shrinkImage ? 52 : MediaQuery.of(context).size.width - 32, - curve: Curves.easeIn, - duration: Duration(milliseconds: 150), - child: ConstrainedBox( - constraints: BoxConstraints( - maxWidth: MediaQuery.of(context).size.width - 32, - ), - child: ClipRRect( - borderRadius: BorderRadius.circular(16), - child: Image( - image: FileImage(File(state.image!.path)), + child: ClipRRect( + borderRadius: BorderRadius.circular(16), + child: Image( + image: FileImage( + File( + state.image!.path, + ), ), ), ), @@ -184,6 +220,14 @@ class _BlogPostCreateScreenState extends State { ), ); } + + addImage(BuildContext context, bool isLoading) { + if (!isLoading) { + return () { + _showImagePicker(); + }; + } + } } _submitForm( @@ -194,15 +238,3 @@ _submitForm( ) async { context.read().add(CreateBlogPost()); } - -addImage(BuildContext context, bool isLoading) { - if (!isLoading) { - return () async { - final picker = ImagePicker(); - XFile? image = await picker.pickImage(source: ImageSource.gallery); - if (image != null) { - context.read().add(UploadImages(image)); - } - }; - } -}