From fe763635e271f445908a70ac0bb01adf04bbb2b7 Mon Sep 17 00:00:00 2001 From: JohnSteck9 Date: Tue, 9 Nov 2021 02:22:20 +0200 Subject: [PATCH 1/4] add GestureDetector to CircleAvatar --- lib/screens/user_profile_screen.dart | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/lib/screens/user_profile_screen.dart b/lib/screens/user_profile_screen.dart index 1a49e4d..461306d 100644 --- a/lib/screens/user_profile_screen.dart +++ b/lib/screens/user_profile_screen.dart @@ -1,3 +1,5 @@ +import 'dart:math'; + import 'package:flutter/material.dart'; import 'package:hw_3/data/colors.dart'; @@ -6,6 +8,14 @@ import 'package:hw_3/data/data.dart'; class UserProfilePage extends StatelessWidget { final Channel currentUser; + void randomNumber() { + var random = new Random(); + int min = 10; + int max = 200; + int result = min + random.nextInt(max - min); + print(result); + } + UserProfilePage({required this.currentUser}); @override @@ -30,10 +40,13 @@ class UserProfilePage extends StatelessWidget { padding: EdgeInsets.all(20.0), child: Row( children: [ - CircleAvatar( - backgroundImage: - AssetImage(currentUser.logoImagePath), - radius: 30), + GestureDetector( + onTap: () {}, + child: CircleAvatar( + backgroundImage: + AssetImage(currentUser.logoImagePath), + radius: 30), + ), SizedBox(width: 10.0), Column( crossAxisAlignment: CrossAxisAlignment.start, From 69e5915b51bc5375ecdb77987b00f4d03b03f845 Mon Sep 17 00:00:00 2001 From: JohnSteck9 Date: Tue, 9 Nov 2021 13:38:17 +0200 Subject: [PATCH 2/4] add random avatar changes | global state --- README.md | 2 +- .../6.7/executionHistory/executionHistory.bin | Bin 2055461 -> 2496206 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes android/.gradle/6.7/fileHashes/fileHashes.bin | Bin 228219 -> 229169 bytes .../.gradle/6.7/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes lib/data/data.dart | 2 +- .../userImageManagement.dart | 19 +++++++++++++ lib/main.dart | 15 ++++++++-- lib/screens/user_profile_screen.dart | 25 ++++++++--------- lib/widgets/app_bar.dart | 26 +++++++++++------- lib/widgets/video_card.dart | 10 +++++-- pubspec.lock | 15 ++++++++++ pubspec.yaml | 1 + 14 files changed, 86 insertions(+), 29 deletions(-) create mode 100644 lib/globalStateManagement/userImageManagement.dart diff --git a/README.md b/README.md index 61a0736..ef731b3 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# hw_3 +# hw_4 A new Flutter project. diff --git a/android/.gradle/6.7/executionHistory/executionHistory.bin b/android/.gradle/6.7/executionHistory/executionHistory.bin index d477a92667418b19f1aafdf5bcad6ed6551cb4f9..f6e4b435e8f346d2040d3fe3eff733c7381c72f2 100644 GIT binary patch delta 9555 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 GV$L6_d5cK^ delta 1146 zcmajddq`7J90zdkz3%GK>F#yzJ)Led?LjqJS~N*}sFn5}m_0~R#L(1SD|<1sxMB|< zQ;%jzDv`||mc>bFk>&p$uT`F?+YoM%_6i3{zA zOZ^G&G6_f2T<=Jdm38Y|6>oQn zu}sLuxiPw}b*ly)Y4G^-avfqrz#Dhw>gZH{)nj z^Hom0s;Yu0i<$ z0{xhwE+LqzwA82RGcA>-mzD_I*bX~n$7vb-G%UZ2w$D^w^yHR}$&3gjN(*1gv5Ay{nAZ`a?P2sn4dBN`K-V01Bk+~JuS;ZgO}dy>M6 zNBYniPH7k+RaJZDpQ=VdbrJ30>}y7dbiYnYoVb*yN7J*1YI_jTHj3GAPUY}HJ>5Ax z83)hcnjP3yI&Y+wlulh|FI-y?UKDMv+uE5{?IjCgZ(#3ICQ`GI3&6C@MZ!OfF>3}w5F>o%?t z#`!7h#**%j>V8kpII$NoUj4yNvh8CzrCChUjYX_*P#B)h9RG| z;cA*V2%7>hF{M#0rCOzQ28aMJ@I zrmLr&9~&(3{Ml#G=%%=7^Z$V*#O)(!iJf_-6y;9{cI>h#tLC@Ja-2>N3pk`|s-Dy4 zju;*Mro7LC*-n@XZIze`IN9wXbZ%0SkbPAH4RrUw#M0JxCFHJUnF+rv_MTFd_BPU# zKrLuRt_3wP)C1%8Z}=`(syK_YJbafMrOy&e<-0NC5C_E&$&}2Fl7OOb5fc<}Ox#b} z3`GV&O6EkzfXr+6wrx=))D74{nn3G|Sf3^s+>{SU$MJr&q9L;nEE{0At>cr0Jp$=l z5Qu=fGK{2CvwoOd; z(`Vk_T?a%=)=D4;Hs>mhw*({4VpZv@6()Nt7KNDL0-FIaLIc<>0>MHY7HEK5ue<5e%V^T70R}Y# z61Hl9yQ5;(iH9EE`Uej5&Z+*!zUTn2FOnl@Z|LrglT6?qP=W(H1{4C3IgvGU>7Oeu z`}4-k8LLAeOh|}po3?a>+(c2ehzUChyl}#2UUmKC^L#W$#c0Za4X~N_EYP|_HJ!Uk z+_qFR2Ty~EI3^BardNPud+t;iD5!4+=q^AgddR=-hQ9UuYcAAzVq#`{J-Av71~DN? zn9_>K=$V*lDW`ZBeoPL90gOnwiw$|7k%*!jZcz^2n;6?nERFzST3JC~=(-y3%|w)9 zD+plE=r3a0o`i1ar^RKfUh)(T3`_wZnAjSu&WeazYcbFu`HP>jh7&S@7n7jJDsW;} z!$-%t5#xCIaCki%WWn3b*i4YEl||Yjp^gr0bBt+?3Gj6Uj@Fn810r!TQyqy5xm)2v zEP(nbTr8CwPb%M0y09iV*Y(jJtw&Z)^IXu(16`|=Z0OpJbQfrw!?vO6Ow$hNk?T372jxT#|0wZY>N<2hSC1hH&4 zbL&o7YH{)G(K(_eHXn_1cV}NHN0gRFR@!$32?HUnCI+-22 zXg|Rtt!^GBK_Bw$kAt)APV;F|;SkJu4__y+X+245#LMKy{xxdrjK|+p@o6uhw6gH- zX;1xB-LQ6f?xe6a;o+5zYnSn9ry&Mr3w0#>1!pBL>vfhI?`k=Hc|c+LOdjNoKvKMW z+MrtJ2M+P2g~v-W;+qvW9`Q!5Ach533A(J${`RPNXQk!D++;c4zcTC?VzjK}7?$h_ J=l&(Q{R^Ya#bf{g delta 997 zcmZ`%YeI8yx)^D9SVattin5zYCH0|a zqs#g;jpj|DJzDs`!dVihwobx>AIT!DM=I2*Uoy7=d zZnCjZXf}qbg%6R>1B91R#YEU2ofIInj;k6Zl*bn_kWHT-CSf3)vUv3--W8MQeiis# z=a0To(crhMRIuH%(z8k>JqV299O;YIqUS^%)^-7lrQKi%kiOin^qr>YthhAu(o?n< zHTk&j;W4v<#$gheq~xSxS_*}T$_2>(u@>U) z7r+X4?boN8_FT@f{PZ#l zm}x!2$&zy#$-J-$CngZqbbUat9b8;YF$!; zk!}m;bFrrI?Ct|cDifYuU1XoPsV{4!0=(dmfK2LfH$sLu*HjD95AlT8`xHKcy(dNQ ziYdepB6|B3ulA;}!>ykI!NSpYuSUpu>k1Tt`z|p6RGrGqRSQplG&(>_UF#tU=<5xz z*+4h%g4+xfV%8nvr@eb2e*|hQ3hOh4HPnPo9;9V0+gOdKd58<~8R?Yx4$LTESbDdB(MZRTYh%$@$grmJ{JfSmkP>tik_FEZCQK^c^83r1{XoTfRSi$A3g+xunF`uo$YkIggXtmM|&N|t&ZUfjmC F{033Hal-%r diff --git a/android/.gradle/6.7/fileHashes/fileHashes.lock b/android/.gradle/6.7/fileHashes/fileHashes.lock index 191508c2eca617556b3cc0300c52826e5c9dd849..e9fb1ac263da7904226fbb2df97c3a56397fdf83 100644 GIT binary patch literal 17 UcmZQ>`w$+I8d~*$0Sx#&0W~HBkN^Mx literal 17 VcmZQ>`w$+I8d~*$0StJL001?g1quKF diff --git a/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 734c969eca7d279be0d40a4bb2af31a8429b6712..dbe11878933cdf49d0962a9e8c71628134e02fb3 100644 GIT binary patch literal 17 VcmZR+wXPw diff --git a/lib/data/data.dart b/lib/data/data.dart index 1935fad..4940580 100644 --- a/lib/data/data.dart +++ b/lib/data/data.dart @@ -57,7 +57,7 @@ class VideoComments { Channel currentUser = Channel( 'John Steck', logoImagePath: 'assets/images/profile_screen/avatars/profile.png', - imageUrl: 'https://avatars.githubusercontent.com/u/63707307?v=4', + imageUrl: 'https://avatars.githubusercontent.com/u/63707307', subscribersCounter: 100000, ); diff --git a/lib/globalStateManagement/userImageManagement.dart b/lib/globalStateManagement/userImageManagement.dart new file mode 100644 index 0000000..27caf7e --- /dev/null +++ b/lib/globalStateManagement/userImageManagement.dart @@ -0,0 +1,19 @@ +import 'dart:math'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:hw_3/data/data.dart'; + +class ImageManagement with ChangeNotifier { + String _randomImage = currentUser.imageUrl; + String get randomImage => _randomImage; + + void generateRandomImage() { + var random = new Random(); + int min = 1; + int max = 63707307; + int result = min + random.nextInt(max - min); + _randomImage = 'https://avatars.githubusercontent.com/u/$result'; + notifyListeners(); + } +} diff --git a/lib/main.dart b/lib/main.dart index e09eafc..d195083 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,9 +2,18 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:hw_3/screens/nav_screen.dart'; +import 'package:provider/provider.dart'; + +import 'globalStateManagement/userImageManagement.dart'; void main() { - runApp(MyApp()); + runApp( + MultiProvider( + providers: [ + ChangeNotifierProvider(create: (_)=>ImageManagement()), + ], + child: MyApp() + )); } class MyApp extends StatelessWidget { @@ -12,6 +21,8 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { + // var incrementValue = context.watch().count; + return MaterialApp( title: 'Flutter YouTube UI', debugShowCheckedModeBanner: false, @@ -20,7 +31,7 @@ class MyApp extends StatelessWidget { bottomNavigationBarTheme: const BottomNavigationBarThemeData(selectedItemColor: Colors.white), ), - home: NavScreen(), + home: NavScreen() ); } } diff --git a/lib/screens/user_profile_screen.dart b/lib/screens/user_profile_screen.dart index 461306d..ee0bd1e 100644 --- a/lib/screens/user_profile_screen.dart +++ b/lib/screens/user_profile_screen.dart @@ -4,18 +4,12 @@ import 'package:flutter/material.dart'; import 'package:hw_3/data/colors.dart'; import 'package:hw_3/data/data.dart'; +import 'package:hw_3/globalStateManagement/userImageManagement.dart'; +import 'package:provider/src/provider.dart'; class UserProfilePage extends StatelessWidget { final Channel currentUser; - void randomNumber() { - var random = new Random(); - int min = 10; - int max = 200; - int result = min + random.nextInt(max - min); - print(result); - } - UserProfilePage({required this.currentUser}); @override @@ -41,11 +35,16 @@ class UserProfilePage extends StatelessWidget { child: Row( children: [ GestureDetector( - onTap: () {}, - child: CircleAvatar( - backgroundImage: - AssetImage(currentUser.logoImagePath), - radius: 30), + onTap: () { + context.read().generateRandomImage(); + }, + child: Builder( + builder: (context) { + return CircleAvatar( + backgroundImage: NetworkImage(context.watch().randomImage), + radius: 30); + } + ), ), SizedBox(width: 10.0), Column( diff --git a/lib/widgets/app_bar.dart b/lib/widgets/app_bar.dart index 5d16605..4771388 100644 --- a/lib/widgets/app_bar.dart +++ b/lib/widgets/app_bar.dart @@ -1,8 +1,10 @@ import 'package:flutter/material.dart'; import 'package:hw_3/data/data.dart'; +import 'package:hw_3/globalStateManagement/userImageManagement.dart'; import 'package:hw_3/screens/user_profile_screen.dart'; +import 'package:provider/src/provider.dart'; class CustomAppBar extends StatelessWidget implements PreferredSizeWidget { @@ -32,18 +34,22 @@ class CustomAppBar extends StatelessWidget icon: const Icon(Icons.search), onPressed: () {}, ), - IconButton( - icon: CircleAvatar( - foregroundImage: NetworkImage(currentUser.imageUrl), - ), - onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => UserProfilePage(currentUser: currentUser), + Builder( + builder: (context) { + return IconButton( + icon: CircleAvatar( + foregroundImage: NetworkImage(context.watch().randomImage), ), + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => UserProfilePage(currentUser: currentUser), + ), + ); + }, ); - }, + } ), ], ); diff --git a/lib/widgets/video_card.dart b/lib/widgets/video_card.dart index 378a0e7..bb27200 100644 --- a/lib/widgets/video_card.dart +++ b/lib/widgets/video_card.dart @@ -1,4 +1,6 @@ import 'package:flutter/material.dart'; +import 'package:hw_3/globalStateManagement/userImageManagement.dart'; +import 'package:provider/src/provider.dart'; import 'package:timeago/timeago.dart' as timeago; import 'package:hw_3/data/data.dart'; @@ -59,8 +61,12 @@ class VideoCard extends StatelessWidget { children: [ GestureDetector( onTap: () => print('Navigate to profile'), - child: CircleAvatar( - foregroundImage: NetworkImage(video.channel.imageUrl), + child: Builder( + builder: (context) { + return CircleAvatar( + foregroundImage: NetworkImage(context.watch().randomImage), + ); + } ), ), const SizedBox(width: 8.0), diff --git a/pubspec.lock b/pubspec.lock index a8e5f78..4ba5760 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -95,6 +95,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.7.0" + nested: + dependency: transitive + description: + name: nested + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" path: dependency: transitive description: @@ -102,6 +109,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.8.0" + provider: + dependency: "direct main" + description: + name: provider + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.1" sky_engine: dependency: transitive description: flutter @@ -172,3 +186,4 @@ packages: version: "2.1.0" sdks: dart: ">=2.12.0 <3.0.0" + flutter: ">=1.16.0" diff --git a/pubspec.yaml b/pubspec.yaml index fe03bef..ddeac34 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -35,6 +35,7 @@ dependencies: # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.2 timeago: ^3.1.0 + provider: ^6.0.1 dev_dependencies: flutter_test: From 8016df42155c798a53fc6fa8ca81917980ba160b Mon Sep 17 00:00:00 2001 From: JohnSteck9 Date: Tue, 9 Nov 2021 15:50:40 +0200 Subject: [PATCH 3/4] add local state to video card --- .../6.7/executionHistory/executionHistory.bin | Bin 2496206 -> 2496206 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes android/.gradle/6.7/fileHashes/fileHashes.bin | Bin 229169 -> 229169 bytes .../.gradle/6.7/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes lib/widgets/video_card.dart | 62 ++++++++++++------ 6 files changed, 41 insertions(+), 21 deletions(-) diff --git a/android/.gradle/6.7/executionHistory/executionHistory.bin b/android/.gradle/6.7/executionHistory/executionHistory.bin index f6e4b435e8f346d2040d3fe3eff733c7381c72f2..99df4b12fe1853b9f97caae6e1102762f842f6e7 100644 GIT binary patch delta 756 zcmX@Nb_U})Al|@Mp=45=YE)X7Z=O_?k)D;Ak)CN%S#DC2l$lq`00Dy24I`NUPxhz_ zo&2s+ym@kE`{YVSAZ7w$W*}zSKDm%gYLD3E@CiLoiy z#i}ha#T{Hp45r%+dpTDz3V3gnKmO@>)LebH((= zYSGZ?8|>MXr=PcG6Wz|=!Fh{WAZAYQY>8tETATZ>eSZJ(-J$m zA~zR$@G>*)WSy?~m`!Z@hCNE|oE9d=CWa&HxrynizKMB2GB-7^L@y<=s03(Is_pay zJ3bb$5cMQZ#1KE+Far|0mgHBaAAB3dNiT_Vj}w4ii(HS59FzZ37sZ=Y)@ n-yl8xf}q;O=?w=ZYNq>Fu?bGk6jiI*zTvGZH`{ig)+7!9Yn(i? diff --git a/android/.gradle/6.7/executionHistory/executionHistory.lock b/android/.gradle/6.7/executionHistory/executionHistory.lock index 06bd2d4c850d6e1d15ee49aba512be4bf940a722..1dc2f683f57e8950b7124b4162b09c0bf33db160 100644 GIT binary patch literal 17 VcmZRczbN?j7p<9l8Nh(C4FEmB1#SQU literal 17 VcmZRczbN?j7p<9l8Nh(C3IIK{1!4dI diff --git a/android/.gradle/6.7/fileHashes/fileHashes.bin b/android/.gradle/6.7/fileHashes/fileHashes.bin index b8b61fca46cbd51ae785bfd1922d6d6436c9ffff..1765c3ec0dcd2702d77cfa5a77b7598969a0c035 100644 GIT binary patch delta 650 zcmYk2Ur19?9LMjuM-dlyvhD_PA#(Ib`XgZ?QKLdevemUE8Q$rgl`qo6lqhnpdKgL0 zK}h_lpF<*yLVQ>yYYe>fV6egmAIjd^T((Bg9s;F^{*2B&w};Nl@6Y+3&-wkn^HpiS zDm@GM8dqj7tvtE96zT0A+y1sx-zf;>MvZZ{Rxl5-zl335kQ!aDFjXQ744-tF1^n>= zHB*kijks9X!L(W*vkWk9`>XNR;%l+Tbzu`U_Ya=OFzvF1baXhP?R8&6wxn zoY}t)BXPzUI1Y1W4E4hMxFviH(ge@?yVJ)e`UqX9>`mWK%t_P;@5Yt`qOzrWtLNQ% z<@$pC>6eQ;^;Em%&){9SHpN)sCP?wP3yM=p<6!YoYn$y&^tpaHZW|EVEOFRvS|N`0 zTtUZoBE!C<)0S~=SpHCqJz%|1(q+rI>a1P^E*heIb26EoOp<&Z%{af}&inVpT&M9p6iLhAAW delta 647 zcmYk2UuaTM7{ERED6y3jxe0O0rZ8%-oLCR735yto|L6{Ssx7uf)}C5Kp}W@}Bw}~M z5c$AwPL{J5@nPVQ@S&GE=%HY*5v19&o@5Xhj!{bI-rGax<@{z9@s-} zR_}rsa^aT=ZV<8|9)<#cj?10L8o|IRkoTRZawqm5p_5|-mx(>pDdN7!3E=nhTKNIy z{S0~dQAZzsVraE)KwOJoG5(DR<-L%_Yl`LU_j|Cv>{7F^i0_@;s4-`Ma0Y)n8FE(P z)xp9oh$sxveFa4|9__+sMO%4z2h1yaHe0^BGEJzwI#b?A6wNe7^60t938xNzmH72= zT8Ye$2MVcnRMQhP9Duy$rtWnYY-w>68f$`MEX(zV?GwXi1L>oZSh%iVCY!1WI_YSl zwL^HgkU7~e6+F5git!xl-ObqgrAABdS+M$+<6k5*m1Kt0j?sm=8GMu{@7UIueq#VV z)d3Pkra$asftXZ7^MR4MX8SL!yi$qZv?RwVWYN0 eZFpmers+A$G&Yvlnp7AWA9@C diff --git a/android/.gradle/6.7/fileHashes/fileHashes.lock b/android/.gradle/6.7/fileHashes/fileHashes.lock index e9fb1ac263da7904226fbb2df97c3a56397fdf83..364c6f6a75277ecd67e49afad2a58a8b1393ce5b 100644 GIT binary patch literal 17 VcmZQ>`w$+I8d~*$0Sx%2001>{1ls@r literal 17 UcmZQ>`w$+I8d~*$0Sx#&0W~HBkN^Mx diff --git a/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock index dbe11878933cdf49d0962a9e8c71628134e02fb3..8bab98bcab58cf76d1d8ab857c42801916e7d4e8 100644 GIT binary patch literal 17 VcmZR+w + _VideoCardState(views: this.video.viewsCounter); +} + +class _VideoCardState extends State { + int views; + + _VideoCardState({required this.views}); + + void _incrementViews() { + setState(() { + views += 1000; + }); + } + @override Widget build(BuildContext context) { return Column( @@ -30,7 +46,7 @@ class VideoCard extends StatelessWidget { ); }, child: Image.network( - video.miniatureImagePath, + widget.video.miniatureImagePath, height: 220.0, width: double.infinity, fit: BoxFit.cover, @@ -43,7 +59,7 @@ class VideoCard extends StatelessWidget { padding: const EdgeInsets.all(4.0), color: Colors.black, child: Text( - video.duration, + widget.video.duration, style: Theme.of(context) .textTheme .caption! @@ -61,13 +77,12 @@ class VideoCard extends StatelessWidget { children: [ GestureDetector( onTap: () => print('Navigate to profile'), - child: Builder( - builder: (context) { - return CircleAvatar( - foregroundImage: NetworkImage(context.watch().randomImage), - ); - } - ), + child: Builder(builder: (context) { + return CircleAvatar( + foregroundImage: NetworkImage( + context.watch().randomImage), + ); + }), ), const SizedBox(width: 8.0), Expanded( @@ -77,7 +92,7 @@ class VideoCard extends StatelessWidget { children: [ Flexible( child: Text( - video.title, + widget.video.title, maxLines: 2, overflow: TextOverflow.ellipsis, style: Theme.of(context) @@ -87,16 +102,21 @@ class VideoCard extends StatelessWidget { ), ), Flexible( - child: Text( - '${video.channel.name} • ' - '${formatNumber(video.viewsCounter)} • ' - '${timeago.format(video.timestamp)}', - maxLines: 2, - overflow: TextOverflow.ellipsis, - style: Theme.of(context) - .textTheme - .caption! - .copyWith(fontSize: 14.0), + child: GestureDetector( + onTap: () { + _incrementViews(); + }, + child: Text( + '${widget.video.channel.name} • ' + '${formatNumber(views)} • ' + '${timeago.format(widget.video.timestamp)}', + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: Theme.of(context) + .textTheme + .caption! + .copyWith(fontSize: 14.0), + ), ), ), ], From 8853342183bd86a6e24c7995c558d6929a7fe432 Mon Sep 17 00:00:00 2001 From: maksymbudzin Date: Tue, 9 Nov 2021 16:22:51 +0200 Subject: [PATCH 4/4] Added global state(change the color oh theme) and added local state library --- .../themeManagement.dart | 14 ++ lib/globalStateManagement/themes.dart | 15 +++ lib/main.dart | 25 ++-- lib/screens/library_screen.dart | 122 +++++++++++++++--- lib/widgets/app_bar.dart | 37 +++--- 5 files changed, 163 insertions(+), 50 deletions(-) create mode 100644 lib/globalStateManagement/themeManagement.dart create mode 100644 lib/globalStateManagement/themes.dart diff --git a/lib/globalStateManagement/themeManagement.dart b/lib/globalStateManagement/themeManagement.dart new file mode 100644 index 0000000..c8fd24a --- /dev/null +++ b/lib/globalStateManagement/themeManagement.dart @@ -0,0 +1,14 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'themes.dart'; + +class ThemeManagement with ChangeNotifier { + ThemeData _currentTheme = mainTheme; + + ThemeData get currentTheme => _currentTheme; + + void toggleTheme() { + _currentTheme = _currentTheme == mainTheme ? secondTheme : mainTheme; + notifyListeners(); + } +} diff --git a/lib/globalStateManagement/themes.dart b/lib/globalStateManagement/themes.dart new file mode 100644 index 0000000..994b5e1 --- /dev/null +++ b/lib/globalStateManagement/themes.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; + +ThemeData mainTheme = ThemeData( + brightness: Brightness.dark, + bottomNavigationBarTheme: + const BottomNavigationBarThemeData(selectedItemColor: Colors.white), +); + +ThemeData secondTheme = ThemeData( + + brightness: Brightness.light, + bottomNavigationBarTheme: + const BottomNavigationBarThemeData(selectedItemColor: Colors.black), + +); diff --git a/lib/main.dart b/lib/main.dart index d195083..5b5adae 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:hw_3/globalStateManagement/themeManagement.dart'; import 'package:hw_3/screens/nav_screen.dart'; import 'package:provider/provider.dart'; @@ -7,13 +8,10 @@ import 'package:provider/provider.dart'; import 'globalStateManagement/userImageManagement.dart'; void main() { - runApp( - MultiProvider( - providers: [ - ChangeNotifierProvider(create: (_)=>ImageManagement()), - ], - child: MyApp() - )); + runApp(MultiProvider(providers: [ + ChangeNotifierProvider(create: (_) => ImageManagement()), + ChangeNotifierProvider(create: (_) => ThemeManagement()), + ], child: MyApp())); } class MyApp extends StatelessWidget { @@ -24,14 +22,9 @@ class MyApp extends StatelessWidget { // var incrementValue = context.watch().count; return MaterialApp( - title: 'Flutter YouTube UI', - debugShowCheckedModeBanner: false, - theme: ThemeData( - brightness: Brightness.dark, - bottomNavigationBarTheme: - const BottomNavigationBarThemeData(selectedItemColor: Colors.white), - ), - home: NavScreen() - ); + title: 'Flutter YouTube UI', + debugShowCheckedModeBanner: false, + theme: context.watch().currentTheme, + home: NavScreen()); } } diff --git a/lib/screens/library_screen.dart b/lib/screens/library_screen.dart index 953f987..fcab645 100644 --- a/lib/screens/library_screen.dart +++ b/lib/screens/library_screen.dart @@ -4,7 +4,28 @@ import 'package:hw_3/data/colors.dart'; import 'package:hw_3/widgets/app_bar.dart'; -class LibraryTab extends StatelessWidget { +class LibraryTab extends StatefulWidget { + LibraryState createState() => LibraryState(); +} + +class LibraryState extends State { + late String temp; + List playList = []; + int likeCounter = 0; + + @override + void initState() { + super.initState(); + + playList.addAll(['maks_playlist', 'vika_playlist', 'mykhailo_playlist']); + } + + void _incrementCounter() { + setState(() { + likeCounter++; + }); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -19,61 +40,124 @@ class LibraryTab extends StatelessWidget { leading: Icon(Icons.history, color: suvaGrey), title: Text( 'History', - style: TextStyle(color: Colors.white), ), ), ListTile( leading: Icon(Icons.file_download, color: suvaGrey), - title: Text('Downloads', style: TextStyle(color: Colors.white)), + title: Text( + 'Downloads', + ), subtitle: Text('2 recommendations', style: TextStyle(color: suvaGrey, fontSize: 12.0)), ), ListTile( leading: Icon(Icons.video_library, color: suvaGrey), - title: - Text('Your videos', style: TextStyle(color: Colors.white)), + title: Text( + 'Your videos', + ), ), ListTile( leading: Icon(Icons.attach_money, color: suvaGrey), - title: Text('Purchases', style: TextStyle(color: Colors.white)), + title: Text('Purchases'), ), ListTile( leading: Icon(Icons.watch_later, color: suvaGrey), - title: - Text('Watch later', style: TextStyle(color: Colors.white)), + title: Text( + 'Watch later', + ), subtitle: Text('Videos you save for later', style: TextStyle(color: suvaGrey, fontSize: 12.0)), ), - Divider(color: Colors.white), + Divider(color: suvaGrey), Padding( - padding: EdgeInsets.symmetric(horizontal: 20.0, vertical: 10.0), + padding: + EdgeInsets.symmetric(horizontal: 20.0, vertical: 10.0), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text('Playlists', - style: TextStyle(color: Colors.white, fontSize: 16.0)), + Text('Playlists', style: TextStyle(fontSize: 16.0)), Row( children: [ Text('Recently added', - style: - TextStyle(color: Colors.white, fontSize: 16.0)), - Icon(Icons.arrow_drop_down, color: Colors.white) + style: TextStyle(fontSize: 16.0)), + Icon(Icons.arrow_drop_down, color: suvaGrey) ], ) ], ), ), ListTile( + onTap: () { + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + title: Text('Add playlist'), + content: TextField( + onChanged: (String value) { + temp = value; + }, + ), + actions: [ + ElevatedButton( + onPressed: () { + setState(() { + playList.add(temp); + }); + Navigator.of(context).pop(); + }, + child: Text('Add')) + ], + ); + }); + }, leading: Icon(Icons.add, color: linkBlue), - title: Text('New Playlist', style: TextStyle(color: linkBlue)), + title: + Text('New Playlist', style: TextStyle(color: linkBlue)), ), ListTile( + onTap: _incrementCounter, leading: Icon(Icons.thumb_up, color: suvaGrey), - title: - Text('Liked videos', style: TextStyle(color: Colors.white)), - subtitle: Text('4 Videos', + title: Text( + 'Liked videos', + ), + subtitle: Text('$likeCounter Videos', style: TextStyle(color: suvaGrey, fontSize: 12.0)), ), + ListView.builder( + shrinkWrap: true, + itemCount: playList.length, + itemBuilder: (BuildContext context, int index) { + return Dismissible( + key: Key(playList[index]), + child: Card( + child: ListTile( + subtitle: Text('$likeCounter Videos', + style: + TextStyle(color: suvaGrey, fontSize: 12.0)), + leading: + Icon(Icons.featured_play_list, color: suvaGrey), + title: Text(playList[index]), + trailing: IconButton( + icon: Icon( + Icons.delete_sweep, + color: Colors.red, + ), + onPressed: () { + setState(() { + playList.removeAt(index); + }); + }, + ), + ), + ), + onDismissed: (direction) { + setState(() { + playList.removeAt(index); + }); + }, + ); + }), ], ), ), diff --git a/lib/widgets/app_bar.dart b/lib/widgets/app_bar.dart index 4771388..d77fac6 100644 --- a/lib/widgets/app_bar.dart +++ b/lib/widgets/app_bar.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:hw_3/data/data.dart'; +import 'package:hw_3/globalStateManagement/themeManagement.dart'; import 'package:hw_3/globalStateManagement/userImageManagement.dart'; import 'package:hw_3/screens/user_profile_screen.dart'; @@ -22,6 +23,12 @@ class CustomAppBar extends StatelessWidget child: Image.asset('assets/images/home_screen/logos/logo_dark.png'), ), actions: [ + IconButton( + icon: const Icon(Icons.phonelink_setup), + onPressed: () { + context.read().toggleTheme(); + }, + ), IconButton( icon: const Icon(Icons.cast), onPressed: () {}, @@ -35,21 +42,21 @@ class CustomAppBar extends StatelessWidget onPressed: () {}, ), Builder( - builder: (context) { - return IconButton( - icon: CircleAvatar( - foregroundImage: NetworkImage(context.watch().randomImage), - ), - onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => UserProfilePage(currentUser: currentUser), - ), - ); - }, - ); - } + builder: (context) { + return IconButton( + icon: CircleAvatar( + foregroundImage: NetworkImage(context.watch().randomImage), + ), + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => UserProfilePage(currentUser: currentUser), + ), + ); + }, + ); + } ), ], );