Merge branch 'PHOTO_PICKER_LDE'

FIX_GLOWING_EFFECT_LDE
Lucas Delanier 2 years ago
commit b44e5cceb3

@ -1,5 +1,5 @@
buildscript {
ext.kotlin_version = '1.6.10'
ext.kotlin_version = '1.9.0'
repositories {
google()
mavenCentral()

@ -0,0 +1,120 @@
import 'package:flutter/Material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:ionicons/ionicons.dart';
import '../values/constants.dart';
class PhotoPostComponent extends StatelessWidget {
final bool empty;
const PhotoPostComponent({Key? key, required this.empty}) : super(key: key);
@override
Widget build(BuildContext context) {
return empty
? Container(
padding: EdgeInsets.all(10),
decoration: BoxDecoration(
color: postbutton, borderRadius: BorderRadius.circular(8)),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
Ionicons.camera,
size: 15,
color: Colors.white,
),
SizedBox(
width: 10,
),
Text(
'Prendre un selfie',
style: GoogleFonts.plusJakartaSans(
color: Colors.white, fontSize: 12),
)
]),
)
: Container(
padding: EdgeInsets.all(10),
decoration: BoxDecoration(
color: fillButton, borderRadius: BorderRadius.circular(8)),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
"Selfie enregistré",
style: GoogleFonts.plusJakartaSans(
color: Colors.white, fontSize: 12),
),
SizedBox(
width: 10,
),
Icon(
Icons.close,
size: 12,
color: Colors.white,
),
]),
);
}
}
class LocationPostComponent extends StatelessWidget {
final bool empty;
const LocationPostComponent({Key? key, required this.empty})
: super(key: key);
@override
Widget build(BuildContext context) {
return empty
? Container(
width: double.infinity,
padding: EdgeInsets.all(10),
decoration: BoxDecoration(
color: postbutton, borderRadius: BorderRadius.circular(8)),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
Icons.location_on,
size: 15,
color: Colors.white,
),
SizedBox(
width: 10,
),
Text(
'Ajouter un lieu',
style: GoogleFonts.plusJakartaSans(
color: Colors.white, fontSize: 12),
)
]),
)
: Container(
width: double.infinity,
padding: EdgeInsets.all(10),
decoration: BoxDecoration(
color: fillButton, borderRadius: BorderRadius.circular(8)),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
"Lieu enregistré",
style: GoogleFonts.plusJakartaSans(
color: Colors.white, fontSize: 12),
),
SizedBox(
width: 10,
),
Icon(
Icons.close,
size: 12,
color: Colors.white,
),
]),
);
}
}

@ -1,26 +1,76 @@
import 'dart:io';
import 'package:animated_appear/animated_appear.dart';
import 'package:auto_size_text/auto_size_text.dart';
import 'package:circular_reveal_animation/circular_reveal_animation.dart';
import 'package:flutter/Material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:image_picker/image_picker.dart';
import 'package:insta_image_viewer/insta_image_viewer.dart';
import 'package:justmusic/values/constants.dart';
import 'package:text_scroll/text_scroll.dart';
import '../model/Music.dart';
import 'buttonPostComponent.dart';
class EditablePostComponent extends StatefulWidget {
const EditablePostComponent({Key? key}) : super(key: key);
final Music? music;
const EditablePostComponent({Key? key, this.music}) : super(key: key);
@override
State<EditablePostComponent> createState() => _EditablePostComponentState();
}
class _EditablePostComponentState extends State<EditablePostComponent> {
class _EditablePostComponentState extends State<EditablePostComponent>
with TickerProviderStateMixin {
final ImagePicker picker = ImagePicker();
late Animation<double> animation;
late AnimationController animationController;
File? image;
Future pickImage() async {
try {
final image = await ImagePicker().pickImage(source: ImageSource.gallery);
if (image == null) return;
final imageTemp = File(image.path);
setState(() {
this.image = imageTemp;
});
} on PlatformException catch (e) {
print('Failed to pick image: $e');
}
}
@override
void initState() {
animationController = AnimationController(
vsync: this,
duration: Duration(milliseconds: 400),
);
animation = CurvedAnimation(
parent: animationController,
curve: Curves.easeInOutSine,
);
animationController.forward();
super.initState();
}
@override
Widget build(BuildContext context) {
return ClipRRect(
borderRadius: BorderRadius.circular(25),
child: Container(
constraints: BoxConstraints(maxWidth: 400),
constraints: BoxConstraints(maxWidth: 400, minHeight: 500),
width: double.infinity,
color: warningBttnColor,
child: Column(
children: [
CircularRevealAnimation(
animation: animation,
centerOffset: Offset(30.w, -100),
child: Stack(
children: [
AspectRatio(
aspectRatio: 1 / 1,
@ -34,37 +84,147 @@ class _EditablePostComponentState extends State<EditablePostComponent> {
child: ClipRRect(
borderRadius: BorderRadius.circular(18),
// implement image
child: const Image(
image: AssetImage("assets/images/exemple_cover.png"),
child: widget.music == null
? Container(
color: grayColor,
width: double.infinity,
)
: Image(
image:
NetworkImage(widget.music?.cover ?? ""),
fit: BoxFit.cover,
width: double.infinity,
),
),
),
),
Padding(
padding: EdgeInsets.fromLTRB(15, 25, 15, 25),
image != null
? Positioned(
top: 10,
right: 10,
child: AnimatedAppear(
delay: Duration(milliseconds: 500),
duration: Duration(milliseconds: 400),
child: Container(
width: 110,
height: 110,
decoration: BoxDecoration(
image: DecorationImage(
image: FileImage(image!),
fit: BoxFit.cover,
),
color: grayColor,
borderRadius: BorderRadius.circular(20),
border: Border.all(
style: BorderStyle.solid,
color: Colors.white,
width: 4)),
child: ClipRRect(
borderRadius: BorderRadius.circular(20),
child: InstaImageViewer(
backgroundIsTransparent: true,
child: Image(
image: FileImage(image!),
fit: BoxFit.cover,
),
),
),
),
))
: Container()
],
)),
widget.music != null
? Padding(
padding: const EdgeInsets.all(10),
child: Row(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
AutoSizeText(
"France, Lyon",
Flexible(
flex: 8,
child: TextScroll(
(widget.music?.title)!,
style: GoogleFonts.plusJakartaSans(
color: Colors.white, fontSize: 13.sp),
maxFontSize: 20,
height: 1,
color: Colors.white,
fontWeight: FontWeight.w600,
fontSize: 26.h),
mode: TextScrollMode.endless,
pauseBetween: Duration(milliseconds: 500),
velocity:
Velocity(pixelsPerSecond: Offset(20, 0)),
)),
Padding(
padding: EdgeInsets.only(
bottom: 10.h, right: 5.w, left: 5.w),
child: ClipOval(
child: Container(
width: 5.h,
height: 5.h,
color: Colors.white,
),
Image(
image: AssetImage("assets/images/camera_icon.png"),
width: 30,
),
),
Flexible(
flex: 6,
child: Padding(
padding: EdgeInsets.only(bottom: 2),
child: TextScroll(
(widget.music?.artists[0].name)!,
style: GoogleFonts.plusJakartaSans(
height: 1,
color: Colors.white,
fontWeight: FontWeight.w300,
fontSize: 16.h),
mode: TextScrollMode.endless,
velocity:
Velocity(pixelsPerSecond: Offset(50, 20)),
pauseBetween: Duration(milliseconds: 500),
),
)),
Container(width: 10),
AutoSizeText(
"10 Juil. 2023",
"2013",
style: GoogleFonts.plusJakartaSans(
color: Colors.white, fontSize: 13.sp),
color: Colors.white.withOpacity(0.5),
fontWeight: FontWeight.w300,
fontSize: 16.h),
textAlign: TextAlign.end,
maxFontSize: 20,
),
],
),
)
: Container(),
Container(
padding: EdgeInsets.fromLTRB(15, 15, 15, 25),
width: double.infinity,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
flex: 5,
child: GestureDetector(
onTap: () {
manageImage();
},
child: PhotoPostComponent(
empty: image == null,
),
),
),
SizedBox(
width: 15,
),
Expanded(
flex: 5,
child: LocationPostComponent(
empty: true,
),
),
],
),
),
Padding(
padding: EdgeInsets.fromLTRB(15, 0, 10, 25),
@ -110,4 +270,14 @@ class _EditablePostComponentState extends State<EditablePostComponent> {
),
));
}
void manageImage() {
if (image != null) {
setState(() {
image = null;
});
} else {
pickImage();
}
}
}

@ -9,7 +9,7 @@ class MusicListComponent extends StatelessWidget {
final bool playing;
final int index;
final Function(int) callback;
const MusicListComponent({
MusicListComponent({
Key? key,
required this.music,
required this.playing,

@ -10,8 +10,8 @@ class PlayButtonComponent extends StatefulWidget {
final Music music;
final Function callback;
final int index;
bool playing;
PlayButtonComponent(
final bool playing;
const PlayButtonComponent(
{Key? key,
required this.music,
required this.callback,
@ -63,7 +63,9 @@ class _PlayButtonComponentState extends State<PlayButtonComponent> {
child: AnimatedPlayButton(
stopped: false,
color: Colors.grey.withOpacity(0.3),
onPressed: () {},
onPressed: () {
print("cc");
},
),
));
}

@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:image_picker/image_picker.dart';
import '../components/comment_component.dart';
import '../components/post_component.dart';
import '../components/top_nav_bar_component.dart';

@ -5,6 +5,7 @@ import 'package:justmusic/components/back_button.dart';
import 'package:justmusic/screens/search_song_screen.dart';
import '../components/editable_post_component.dart';
import '../components/post_button_component.dart';
import '../model/Music.dart';
import '../values/constants.dart';
class PostScreen extends StatefulWidget {
@ -18,7 +19,8 @@ class _PostScreenState extends State<PostScreen>
with SingleTickerProviderStateMixin {
final scrollController = ScrollController();
late AnimationController _controller;
late Animation<double> _animation;
Music? selectedMusic;
@override
void initState() {
@ -27,15 +29,16 @@ class _PostScreenState extends State<PostScreen>
duration: const Duration(milliseconds: 400),
);
_animation = Tween<double>(begin: 0.0, end: 400.0).animate(
CurvedAnimation(
parent: _controller,
curve: Curves.easeOut,
),
);
super.initState();
}
void _selectMusic(Music music) {
Navigator.pop(context);
setState(() {
selectedMusic = music;
});
}
void openDetailPost() {
showModalBottomSheet(
transitionAnimationController: _controller,
@ -51,10 +54,10 @@ class _PostScreenState extends State<PostScreen>
borderRadius: BorderRadius.only(
topLeft: Radius.circular(20), topRight: Radius.circular(20))),
builder: ((context) {
return const ClipRRect(
return ClipRRect(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(20), topRight: Radius.circular(20)),
child: SearchSongScreen());
child: SearchSongScreen(callback: _selectMusic));
}),
);
}
@ -90,10 +93,7 @@ class _PostScreenState extends State<PostScreen>
fit: BoxFit.cover,
),
),
child: Stack(
alignment: Alignment.topCenter,
children: [
ScrollConfiguration(
child: ScrollConfiguration(
behavior: ScrollBehavior().copyWith(scrollbars: false),
child: SingleChildScrollView(
controller: scrollController,
@ -105,8 +105,7 @@ class _PostScreenState extends State<PostScreen>
),
GestureDetector(
onTap: openDetailPost,
child: EditablePostComponent(),
),
child: EditablePostComponent(music: selectedMusic)),
SizedBox(
height: 40.h,
),
@ -118,8 +117,6 @@ class _PostScreenState extends State<PostScreen>
),
),
),
],
),
),
);
}

@ -11,7 +11,8 @@ import '../values/constants.dart';
import '../main.dart';
class SearchSongScreen extends StatefulWidget {
const SearchSongScreen({Key? key}) : super(key: key);
final Function callback;
const SearchSongScreen({Key? key, required this.callback}) : super(key: key);
@override
State<SearchSongScreen> createState() => _SearchSongScreenState();
@ -169,25 +170,35 @@ class _SearchSongScreenState extends State<SearchSongScreen> {
itemCount: filteredData.length,
itemBuilder: (context, index) {
if (playingIndex == index) {
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 20),
return InkWell(
onTap: () {
widget.callback(filteredData[index]);
},
child: Padding(
padding:
const EdgeInsets.symmetric(horizontal: 20),
child: MusicListComponent(
music: filteredData[index],
playing: true,
callback: playMusic,
index: index,
),
);
));
}
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 20),
return InkWell(
onTap: () {
widget.callback(filteredData[index]);
},
child: Padding(
padding:
const EdgeInsets.symmetric(horizontal: 20),
child: MusicListComponent(
music: filteredData[index],
playing: false,
callback: playMusic,
index: index,
),
);
));
}),
))
],

@ -20,6 +20,8 @@ const bgAppBar = Color(0xFF181818);
const grayText = Color(0xFF898989);
const settingColor = Color(0xFF232323);
const searchBarColor = Color(0xFF161616);
const postbutton = Color(0xFF1B1B1B);
const fillButton = Color(0xFF633AF4);
// All constants important too us
const defaultPadding = 30.0;

@ -1,6 +1,14 @@
# Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile
packages:
animated_appear:
dependency: "direct main"
description:
name: animated_appear
sha256: "53097d7bb6d5e4a1a3a74c8f3028c47c87101c6ec8903f2002372d1eb5aee991"
url: "https://pub.dev"
source: hosted
version: "0.0.4"
async:
dependency: transitive
description:
@ -113,14 +121,22 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.17.1"
cross_file:
dependency: transitive
description:
name: cross_file
sha256: "0b0036e8cccbfbe0555fd83c1d31a6f30b77a96b598b35a5d36dd41f718695e9"
url: "https://pub.dev"
source: hosted
version: "0.3.3+4"
crypto:
dependency: transitive
description:
name: crypto
sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67
sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab
url: "https://pub.dev"
source: hosted
version: "3.0.2"
version: "3.0.3"
cupertino_icons:
dependency: "direct main"
description:
@ -161,6 +177,38 @@ packages:
url: "https://pub.dev"
source: hosted
version: "6.1.4"
file_selector_linux:
dependency: transitive
description:
name: file_selector_linux
sha256: "770eb1ab057b5ae4326d1c24cc57710758b9a46026349d021d6311bd27580046"
url: "https://pub.dev"
source: hosted
version: "0.9.2"
file_selector_macos:
dependency: transitive
description:
name: file_selector_macos
sha256: "4ada532862917bf16e3adb3891fe3a5917a58bae03293e497082203a80909412"
url: "https://pub.dev"
source: hosted
version: "0.9.3+1"
file_selector_platform_interface:
dependency: transitive
description:
name: file_selector_platform_interface
sha256: "412705a646a0ae90f33f37acfae6a0f7cbc02222d6cd34e479421c3e74d3853c"
url: "https://pub.dev"
source: hosted
version: "2.6.0"
file_selector_windows:
dependency: transitive
description:
name: file_selector_windows
sha256: "1372760c6b389842b77156203308940558a2817360154084368608413835fc26"
url: "https://pub.dev"
source: hosted
version: "0.9.3"
flutter:
dependency: "direct main"
description: flutter
@ -182,14 +230,22 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.0.2"
flutter_plugin_android_lifecycle:
dependency: transitive
description:
name: flutter_plugin_android_lifecycle
sha256: "950e77c2bbe1692bc0874fc7fb491b96a4dc340457f4ea1641443d0a6c1ea360"
url: "https://pub.dev"
source: hosted
version: "2.0.15"
flutter_screenutil:
dependency: "direct main"
description:
name: flutter_screenutil
sha256: "0a122936b450324cbdfd51be0819cc6fcebb093eb65585e9cd92263f7a1a8a39"
sha256: "1b61f8c4cbf965104b6ca7160880ff1af6755aad7fec70b58444245132453745"
url: "https://pub.dev"
source: hosted
version: "5.7.0"
version: "5.8.4"
flutter_signin_button:
dependency: "direct main"
description:
@ -244,10 +300,10 @@ packages:
dependency: "direct main"
description:
name: http
sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482"
sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2"
url: "https://pub.dev"
source: hosted
version: "0.13.5"
version: "0.13.6"
http_parser:
dependency: transitive
description:
@ -256,6 +312,78 @@ packages:
url: "https://pub.dev"
source: hosted
version: "4.0.2"
image_picker:
dependency: "direct main"
description:
name: image_picker
sha256: "6296e98782726d37f59663f0727d0e978eee1ced1ffed45ccaba591786a7f7b3"
url: "https://pub.dev"
source: hosted
version: "1.0.1"
image_picker_android:
dependency: transitive
description:
name: image_picker_android
sha256: "8179b54039b50eee561676232304f487602e2950ffb3e8995ed9034d6505ca34"
url: "https://pub.dev"
source: hosted
version: "0.8.7+4"
image_picker_for_web:
dependency: transitive
description:
name: image_picker_for_web
sha256: "869fe8a64771b7afbc99fc433a5f7be2fea4d1cb3d7c11a48b6b579eb9c797f0"
url: "https://pub.dev"
source: hosted
version: "2.2.0"
image_picker_ios:
dependency: transitive
description:
name: image_picker_ios
sha256: b3e2f21feb28b24dd73a35d7ad6e83f568337c70afab5eabac876e23803f264b
url: "https://pub.dev"
source: hosted
version: "0.8.8"
image_picker_linux:
dependency: transitive
description:
name: image_picker_linux
sha256: "02cbc21fe1706b97942b575966e5fbbeaac535e76deef70d3a242e4afb857831"
url: "https://pub.dev"
source: hosted
version: "0.2.1"
image_picker_macos:
dependency: transitive
description:
name: image_picker_macos
sha256: cee2aa86c56780c13af2c77b5f2f72973464db204569e1ba2dd744459a065af4
url: "https://pub.dev"
source: hosted
version: "0.2.1"
image_picker_platform_interface:
dependency: transitive
description:
name: image_picker_platform_interface
sha256: c1134543ae2187e85299996d21c526b2f403854994026d575ae4cf30d7bb2a32
url: "https://pub.dev"
source: hosted
version: "2.9.0"
image_picker_windows:
dependency: transitive
description:
name: image_picker_windows
sha256: c3066601ea42113922232c7b7b3330a2d86f029f685bba99d82c30e799914952
url: "https://pub.dev"
source: hosted
version: "0.2.1"
insta_image_viewer:
dependency: "direct main"
description:
name: insta_image_viewer
sha256: "9a81432b1ab907ea91c255ec079440afe43f999533422badffaa482dfb7fdfbb"
url: "https://pub.dev"
source: hosted
version: "1.0.2"
ionicons:
dependency: "direct main"
description:
@ -276,10 +404,10 @@ packages:
dependency: transitive
description:
name: lints
sha256: "5e4a9cd06d447758280a8ac2405101e0e2094d2a1dbdd3756aec3fe7775ba593"
sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452"
url: "https://pub.dev"
source: hosted
version: "2.0.1"
version: "2.1.1"
matcher:
dependency: transitive
description:
@ -304,6 +432,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.9.1"
mime:
dependency: transitive
description:
name: mime
sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e
url: "https://pub.dev"
source: hosted
version: "1.0.4"
modal_bottom_sheet:
dependency: "direct main"
description:
@ -368,6 +504,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.1.7"
pinch_zoom:
dependency: "direct main"
description:
name: pinch_zoom
sha256: ad12872281742726afaf03438d99a4572c584a612630768953beb6dfd6f9389a
url: "https://pub.dev"
source: hosted
version: "1.0.0"
platform:
dependency: transitive
description:
@ -397,6 +541,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.1.0"
smooth_list_view:
dependency: "direct main"
description:
name: smooth_list_view
sha256: d6eb3bed78881c50d4574b0dd466ed3321972477688c1c021178f3132155112a
url: "https://pub.dev"
source: hosted
version: "1.0.4"
source_span:
dependency: transitive
description:
@ -497,10 +649,10 @@ packages:
dependency: transitive
description:
name: win32
sha256: "5a751eddf9db89b3e5f9d50c20ab8612296e4e8db69009788d6c8b060a84191c"
sha256: f2add6fa510d3ae152903412227bda57d0d5a8da61d2c39c1fb022c9429a41c0
url: "https://pub.dev"
source: hosted
version: "4.1.4"
version: "5.0.6"
xdg_directories:
dependency: transitive
description:
@ -518,5 +670,5 @@ packages:
source: hosted
version: "1.1.0"
sdks:
dart: ">=3.0.0-0 <4.0.0"
flutter: ">=3.3.0"
dart: ">=3.0.0 <4.0.0"
flutter: ">=3.10.0"

@ -53,6 +53,11 @@ dependencies:
audioplayers: ^4.1.0
ionicons: ^0.2.2
top_snackbar_flutter: ^3.1.0
image_picker: ^1.0.1
insta_image_viewer: ^1.0.2
pinch_zoom: ^1.0.0
smooth_list_view: ^1.0.4
animated_appear: ^0.0.4
dev_dependencies:
flutter_test:

Loading…
Cancel
Save