From 62773ed27eb1fac49b594b625d171d3ab8aa8d5a Mon Sep 17 00:00:00 2001 From: MasoudMaghsodi Date: Fri, 18 Oct 2024 01:07:35 +0330 Subject: [PATCH] final edit --- README.md | 84 +- android/app/build.gradle | 75 +- android/app/src/debug/AndroidManifest.xml | 6 +- android/app/src/main/AndroidManifest.xml | 23 +- .../com/example/tech_blog/MainActivity.kt | 5 + .../app/src/main/res/drawable-hdpi/splash.png | Bin 5266 -> 6113 bytes .../app/src/main/res/drawable-mdpi/splash.png | Bin 2791 -> 3979 bytes .../src/main/res/drawable-v21/background.png | Bin 68 -> 69 bytes .../res/drawable-v21/launch_background.xml | 2 +- .../src/main/res/drawable-xhdpi/splash.png | Bin 6305 -> 8077 bytes .../src/main/res/drawable-xxhdpi/splash.png | Bin 14502 -> 12257 bytes .../app/src/main/res/drawable/background.png | Bin 68 -> 69 bytes .../main/res/drawable/launch_background.xml | 2 +- .../src/main/res/values-night-v31/styles.xml | 7 +- .../app/src/main/res/values-night/styles.xml | 8 +- .../app/src/main/res/values-v31/styles.xml | 7 +- android/app/src/main/res/values/styles.xml | 8 +- android/app/src/profile/AndroidManifest.xml | 6 +- android/build.gradle | 19 +- android/gradle.properties | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- android/settings.gradle | 30 +- devtools_options.yaml | 3 + ios/Flutter/AppFrameworkInfo.plist | 2 +- ios/Podfile | 2 +- ios/Podfile.lock | 159 ++++ ios/Runner.xcodeproj/project.pbxproj | 81 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- .../contents.xcworkspacedata | 3 + ios/Runner/AppDelegate.swift | 2 +- ios/Runner/Info.plist | 8 +- lib/component/dimens.dart | 10 +- lib/component/my_component.dart | 9 +- .../{searchBar.dart => search_bar.dart} | 0 lib/constant/api_constant.dart | 31 +- lib/constant/api_key_constants.dart | 60 +- lib/constant/commands.dart | 9 +- lib/constant/my_colors.dart | 14 +- lib/constant/my_strings.dart | 94 +- lib/constant/storage_const.dart | 10 +- .../article/list_article_controller.dart | 13 +- .../article/manage_article_controller.dart | 13 +- .../article/single_article_controller.dart | 19 +- lib/controller/file_controller.dart | 10 +- .../podcast/manage_podcast_controller.dart | 13 +- .../podcast/single_podcast_cotroller.dart | 14 +- lib/controller/register_controller.dart | 26 +- lib/main.dart | 2 - lib/my_http_overrides.dart | 9 +- lib/route_manager/binding.dart | 16 +- lib/route_manager/pages.dart | 82 +- lib/services/dio_service.dart | 55 +- lib/themes/app_themes.dart | 140 +-- lib/view/articles/articel_list_sceen.dart | 5 +- lib/view/articles/article_content_editor.dart | 60 +- lib/view/articles/manage_article.dart | 29 +- lib/view/articles/single.dart | 10 +- lib/view/articles/single_manage_article.dart | 71 +- lib/view/main_screen/bottom_navigation.dart | 194 ++-- lib/view/main_screen/home_screen.dart | 37 +- lib/view/main_screen/main_screen.dart | 15 +- lib/view/main_screen/profile_screen.dart | 86 +- .../main_screen/see_more_podcast_screen.dart | 15 +- lib/view/my_cats.dart | 37 +- lib/view/podcast/hot_podcast_list.dart | 22 +- lib/view/podcast/manage_podcast.dart | 163 ++-- lib/view/podcast/single_manage_podcast.dart | 15 +- lib/view/podcast/single_podcast.dart | 37 +- lib/view/register/register_intro.dart | 39 +- lib/view/splash_screen.dart | 6 +- lib/view/widgets/article_widgets.dart | 10 +- lib/view/widgets/main_widget.dart | 15 +- lib/view/widgets/podcast_widgets.dart | 455 +++++----- pubspec.lock | 842 +++++++++++------- pubspec.yaml | 17 +- windows/runner/grunner.exe.manifest | 20 - windows/runner/grunner.exe.manifico | 0 77 files changed, 1920 insertions(+), 1478 deletions(-) create mode 100644 android/app/src/main/kotlin/com/example/tech_blog/MainActivity.kt create mode 100644 devtools_options.yaml create mode 100644 ios/Podfile.lock rename lib/component/{searchBar.dart => search_bar.dart} (100%) delete mode 100644 windows/runner/grunner.exe.manifest delete mode 100644 windows/runner/grunner.exe.manifico diff --git a/README.md b/README.md index f92c709..adb25a6 100644 --- a/README.md +++ b/README.md @@ -1,37 +1,75 @@ -
- +--- - -
- +![logo](https://github.com/user-attachments/assets/0e76743b-ff8a-47d5-940a-ad0560ba7f02) ![techBlog](https://github.com/user-attachments/assets/cb328b9f-3c4b-43b9-b235-35d3f2290dd5) -
-## Skills +# Tech Blog -
+A Flutter-based tech blog application that uses GetX for state management and follows the MVC architecture pattern. The app allows users to browse and publish the latest news and podcasts in the world of technology and programming. Users can also create and share their own articles and podcasts. +## Features +- **GetX State Management**: Efficiently manage app state with the GetX package. +- **MVC Architecture**: Structured project following the Model-View-Controller pattern. +- **Tech News and Podcasts**: Browse the latest articles and podcasts related to technology and programming. +- **User-Generated Content**: Users can publish their own articles and podcasts. +- **Responsive UI**: Adaptive and responsive user interface for various devices. -### Client App -
-Flutter -Dart -Firebase -Adobe XD -
+## Installation -
+Follow these steps to set up and run the project locally. +### Prerequisites +Ensure you have the following installed: -### Backend -
-PHP -Python -
-
+- Flutter SDK (version 3.24 or higher) +- Dart SDK +- Android Studio or Visual Studio Code with Flutter and Dart plugins +- A physical device or emulator for testing + +### Steps + +1. **Clone the repository:** + + ```bash + git clone https://github.com/MasoudMaghsodi/tech_blog.git + cd tech_blog + ``` + +2. **Get the dependencies:** + + ```bash + flutter pub get + ``` + +3. **Run the application:** + + ```bash + flutter run + ``` + + This command will build and run the app on the connected device or emulator. + +## Usage + +- **Browse Content**: Explore the latest tech news and podcasts in the app. +- **Publish Content**: Create and share your own articles or podcasts with other users. +- **User Interaction**: Comment on and interact with published content. + +## Contributing + +Contributions are highly appreciated! If you’d like to contribute, please follow these steps: + +1. Fork the repository. +2. Create a new branch (`git checkout -b feature/YourFeature`). +3. Commit your changes (`git commit -m 'Add some feature'`). +4. Push to the branch (`git push origin feature/YourFeature`). +5. Open a pull request. + +Thank you for your time + +--- -
diff --git a/android/app/build.gradle b/android/app/build.gradle index f393760..f2ba669 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -1,75 +1,58 @@ +plugins { + id "com.android.application" + id "kotlin-android" + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id "dev.flutter.flutter-gradle-plugin" +} + def localProperties = new Properties() -def localPropertiesFile = rootProject.file('local.properties') +def localPropertiesFile = rootProject.file("local.properties") if (localPropertiesFile.exists()) { - localPropertiesFile.withReader('UTF-8') { reader -> + localPropertiesFile.withReader("UTF-8") { reader -> localProperties.load(reader) } } -def flutterRoot = localProperties.getProperty('flutter.sdk') -if (flutterRoot == null) { - throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") -} - -def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +def flutterVersionCode = localProperties.getProperty("flutter.versionCode") if (flutterVersionCode == null) { - flutterVersionCode = '1' + flutterVersionCode = "1" } -def flutterVersionName = localProperties.getProperty('flutter.versionName') +def flutterVersionName = localProperties.getProperty("flutter.versionName") if (flutterVersionName == null) { - flutterVersionName = '1.0' + flutterVersionName = "1.0" } -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' -apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" - android { - compileSdkVersion 33 - - lintOptions { - checkReleaseBuilds false - abortOnError false - } - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } + namespace = "com.example.tech_blog" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion - kotlinOptions { - jvmTarget = '1.8' - } - - sourceSets { - main.java.srcDirs += 'src/main/kotlin' + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 } defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId "com.example.tec" - // Required by the Flutter WebView plugin. - minSdkVersion 21 - targetSdkVersion flutter.targetSdkVersion - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - multiDexEnabled true - + applicationId = "com.example.tech_blog" + // You can update the following values to match your application needs. + // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. + minSdk = 21 + targetSdk = flutter.targetSdkVersion + versionCode = flutterVersionCode.toInteger() + versionName = flutterVersionName } - + buildTypes { release { // TODO: Add your own signing config for the release build. // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig signingConfigs.debug + signingConfig = signingConfigs.debug } } } flutter { - source '../..' -} - -dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + source = "../.." } diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml index 40ea015..399f698 100644 --- a/android/app/src/debug/AndroidManifest.xml +++ b/android/app/src/debug/AndroidManifest.xml @@ -1,6 +1,6 @@ - - diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index b32ec03..1f148f6 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,18 +1,14 @@ - - - + - - - + + + + + + + diff --git a/android/app/src/main/kotlin/com/example/tech_blog/MainActivity.kt b/android/app/src/main/kotlin/com/example/tech_blog/MainActivity.kt new file mode 100644 index 0000000..23426bd --- /dev/null +++ b/android/app/src/main/kotlin/com/example/tech_blog/MainActivity.kt @@ -0,0 +1,5 @@ +package com.example.tech_blog + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() diff --git a/android/app/src/main/res/drawable-hdpi/splash.png b/android/app/src/main/res/drawable-hdpi/splash.png index c2b5bdf4a4df0ec56fdf0064a4fe09e338e609ad..021eca2bc78cbe80d9ebed2634af392e0272e134 100644 GIT binary patch literal 6113 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 diff --git a/android/app/src/main/res/drawable-mdpi/splash.png b/android/app/src/main/res/drawable-mdpi/splash.png index 5fb07d5578e9f2da8188d078fef0a64f99a20f9c..fbc818d3c7f7da296b6f9bc3bc46d947a5e0715f 100644 GIT binary patch literal 3979 zcmV;64|MQ}P))CLL!3fkcBPDz3-n$Y=9&L4MNY!$H}>~{C8&Vd^7)Y=VAl~ zbV?X?^Z*P{4+Als6b52CDGbDPQW%Koq%aWENns#HN3ij)C-n8QV-5JUgf2M3hX?WP z+27xS7%M9)wvCOAi87y;mnW{Nsd*)R8v&2%P4$~)NwVW8j(er3TEiW4U}r0c#LYKv9i#Jj!&c4LGe7f%D7+9B7B*Xd!)gj#rDRUnjajC>`XT5FR_E9LT1mZKXbiEg4O?y#}i_4gzNDg$TT-ctMv8-2H z$526+>@KJIpENJmrpgZD<)BJ_6RNh)Nt(rCCC-{PYl^0O9UL4?gMxy>{Qdo3M-na2 zP#49<#vVC&^5n1TjJA)Dk9}ZZVAzNeBYZJyDiVpFUcGwtNOW{Gk#9l-wpUY9QX-Ft zi1^UY&uVMBx}IXJ-!aDsP}6{svT zH#dhFGiJPjp4glnJ9hl9Sr<|)yJ}`;Hdfg_%8gmOcCG)iWy`!DKYpyyT~pW(a9?D} zvLW`v_J!DJ3RX9;@vMaEq?d21DfCKA&z?Pv7c5xti;@%sA5~%w?l5mmTRA#9el&01 zyvqj;95_QN=g*%%4N3W4sX}n|*W%?d<{fZX+&X;taCGxNu+EB*g0l6PCcDYFvD{_) z^y#zq?%jK|#kj!1qYt=!YC)O5i*hez4;cc0>_Ym{H+&}ZzjaU};XzM5aNHDnB?evE z_i)lYNg5|McHO#l(<&+|>W2>>?zDRKYGQ}DqeqWkNQmL_cr4sS+ptVQidZa8-oJl; za6&@D6O`|d>ZzuztW2h+8wTT;!-ozXT82}^+O%m?5>B=gsj#-T_QA_@Vl1JzlQT7B zk1?1|Zj1d;3x=Vk&~W1sowM^PlYLeO(suO@^-7GJn_G}FEs;ompEz-%k1~&w_>}Af zR8xaVe%!cmuH+VF_4)JXmlIM*CMhW?S4%f?Bqajl7_z${BO~LQhlht#V_i2@!D=Yw z%YZF?8B)m3tYyT}`E=&4GAOts19fXf|IjNjxME$EX;fRA$*;K#K4`bDUAq!HLOeXG zu}p>&e7g-@JzuRj=?yCBCIrYqD$io#-}M6jxGofTSX-V2$5c_tR30o~?thCeu~w%- z4h<*|_wcU5w)D~1k=nNPZT#uK`eUl`B2^_6B3}>H%vJh?Mlbb6pjTqhCOkj~Kwh+HI1+P~WPV1V>a)d&e>=)? z8|4+Mh6IjYUS9tCB!(axQV($%V+Tv0$gV=FV|_jzJgbOiW5j z%0+a6s~WTUn&j@>xl@P{_*jhGUq=$AV^nTaTU#qZ7x?zWhYx>>jg2i<%3^zf>T37+ z@#D`SIqzfq;(%$MrL|lSR_m+1Wb0 zhL=Jnb8C|q_&MUPn6FI|xncKaIejmZS3NF--0Q8k{R|f51c|Z<(NvFyRa(eAimHcN zT9b^<#GF2T`VYMPp^GdAl_b{qmHc#(kB^Vf!{0_t_2eBG{&s2@7qM9}>gqHB-Do<4 zx%r_FGs%uaas9Q)k~akd*+Zl2<&rVwP?V!f`(44x&WY{ut)_Yg7)gb!3~=ci#tl2EXF_%UhLOm)8w~&%RwN}Dhn_9`UhH9Wu%@Q{z#CN5_tB? z!x|0t!i^g@+M>r5{IUb+Xw-nP=00U4!pHs=2Q`M~gq`7$CU~(ptmX`L* zrAwERRb|lN+o9oqhXkg$ zyHJ$tF!sc2kK~!50?4@8yxtVLc0-3jrz3f7Xp_5)-jIx@X{El>x}E*}{JbL~A})|~ z4`mq=ux8Y#QEMV2BmYhENSfEeg$v_Qrn^!G;~>SA#4~8{e?VfG5fE|;b%TpiM%Blq znqG;jl~XDO6le%oD7Ed#wLOy(Y>L&tKimDf3%HZF7nNwumG_||2mMGK)_N=2Ury^p zjGLRA@3CXY&T%*#OYD@`9P!z+XIE>IC!ZTFUcC4iAw@2i=c3#DB~JKM+!b$mdU|f1 zHf`Ef3@%gV&Yk;DLP|qJ!{r@2cFe>4%6|R&twi$EFvQtdUS7^Tds;vhLwPhK;aOTG z(_*64FhZ#$npd~wP^IzI(~cs??JaI(w714Uog5mpE&`p1K?lH=%jHgc-Y&z`+1lE= z@p!z;>W+$0Jq^ckEA;HilP6c=B%ekij_=#IFA$5mWA%H47*vOfGjfbue#hNWicZ93 zLJavBg50C>m?FKOM70xayVt_Xx3gj2IVZ?1RR1jt!$6)Ggc@CC0-cB{DJi)e7Z>*l zu6|Dc{{5%m#BM{iwDZxUN9obg(Xq|t&CSgRD9_O|GBOlFAF9DRBve3lh`YOc|Hir- z9v&WJeSCc0N0pX}k^V=G{iUk5R|zFIdw@-=Hm#%K>skgY-pU4Zo*dTAc?c1EhJd8L z2fZ=#;K@1WgRHl3M=%H9PA=a8C;vunmC0l&$B!Rxq9#ir`(O{S{utFmr~FLHh($x_qnY&5KgLCEWU&4??-YU67E2*=&5~dVPTO%2JY|gPu_#& zoH%h}PiAK3^H||eNZi2zUQctdTtVp}fNL`tMvS)3^si5y7#QYK39Cc0p}U#7^FVaN zB}VYH!dNLT7crH4QGD6&8r?7kl5~(;2PEAey4sFaLOxod&v{&sI z7sDINmoN7yD=SkNNg6k02E?qk2k(U5;QTKZuw9$_WbFfdeo+l0KK3VlcY_I74(h{l zTw=~Poif+|vHAQ!0XjzN@5>aJ!ImEfF;6Rv#kGt$rjXA4Iv=vG>DsSWVnRYf-qfX$ zn3$Lc7#KQt>C(kSBoZk;k|646=gytqqU*dDcM}g?;Cl4Fo}W4)fz-^IGk?G&g}Y-U zIsy{hK}M+h=8yFXNts#RQnP@>gi(0I%5IW-o{|&fh$q%Gd%m4KuwuSrWICY zGN$1%Iv%$rP+j}1sJLWkznq7=L;C*I*RsK1{jy-_+xgP(-rLWP5zEpZ2|@Be0%Z;A zB(*_r=P@}sIb>zGcv*%M%iym?Il9HhW@ctX$!mVx9b@wH@~#j^!QS59gVakTlAHPY z`J(3c5!6F1QwsbPOs2f>fM4L_qg_*ZW=FP$)bX6&1DcRs9c)E{I!XzR=IvY!7HSmaeLm zr*8bI;_YuTrP@Bd(it84|1oRUtl5Gw%n=MM$)`m<(5{vi6cnT&3TkU>J920(@O!Q- z%}@O+PA0XW?m*~?s?XAjXuS=(!~b#V?%lgj$giWv(HbISYZJX~IV)y*oBro{A$n?u z?}`^MJtI0=t>@3mJDixm6GEefds6!vjqPW}4S`zu{m|1@?;J_4&uEXn48*hn)pZOL z`eRl2;i+8(GtUY)rxnRsMwNPkftWTTULdb@++Xq1=Pj+lKujlvftXGT12LTx24XrX l48(L&7>MblFc8y8@qY#1K}wAQfgk_?002ovPDHLkV1l)`vw#2q delta 2784 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 C%MJMe delta 48 zcmZ>DnINgn#=yWJFM6aCNO60*IEGX(CjaDTVc_CtVT_n;@((D?;OXk;vd$@?2>|vK B3nu^o diff --git a/android/app/src/main/res/drawable-v21/launch_background.xml b/android/app/src/main/res/drawable-v21/launch_background.xml index 3fe6b2e..3cc4948 100644 --- a/android/app/src/main/res/drawable-v21/launch_background.xml +++ b/android/app/src/main/res/drawable-v21/launch_background.xml @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/android/app/src/main/res/drawable-xhdpi/splash.png b/android/app/src/main/res/drawable-xhdpi/splash.png index f3247984ea52ce27f42153243200a7115a868f73..d52babf12d05ae8405ac85bc882ff26abd5e9118 100644 GIT binary patch literal 8077 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 K(iM_Mf&T+VudSc} literal 6305 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 aj_j<=1V-jyOFe%*yiij3Bwr(I5%M4Mi9_cA diff --git a/android/app/src/main/res/drawable-xxhdpi/splash.png b/android/app/src/main/res/drawable-xxhdpi/splash.png index 86e3ada05ad7c424846ed4a8caebe0f0aa6623be..016ba2d4a15143c4034db35281660432a09e86f3 100644 GIT binary patch literal 12257 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 R{(lG}E2$_^EA~D3e*gtH-yi@0 diff --git a/android/app/src/main/res/drawable/background.png b/android/app/src/main/res/drawable/background.png index e29b3b59f99290135b0cf3745bc9993ce935b27c..3107d37fa533216ce211fdcdd7c9b8633fab4cc4 100644 GIT binary patch delta 49 zcmZ>9ogk^h#K6EXp*;8=kmB)laSW+oO#b=*zdZvRA2SnE+1>|0aRyIUKbLh*2~7Y< C%MJMe delta 48 zcmZ>DnINgn#=yWJFM6aCNO60*IEGX(CjaDTVc_CtVT_n;@((D?;OXk;vd$@?2>|vK B3nu^o diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml index 3fe6b2e..3cc4948 100644 --- a/android/app/src/main/res/drawable/launch_background.xml +++ b/android/app/src/main/res/drawable/launch_background.xml @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/android/app/src/main/res/values-night-v31/styles.xml b/android/app/src/main/res/values-night-v31/styles.xml index 5cb13c8..a3653cb 100644 --- a/android/app/src/main/res/values-night-v31/styles.xml +++ b/android/app/src/main/res/values-night-v31/styles.xml @@ -3,8 +3,9 @@ diff --git a/android/build.gradle b/android/build.gradle index 4256f91..d2ffbff 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,16 +1,3 @@ -buildscript { - ext.kotlin_version = '1.6.10' - repositories { - google() - mavenCentral() - } - - dependencies { - classpath 'com.android.tools.build:gradle:4.1.0' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - allprojects { repositories { google() @@ -18,14 +5,14 @@ allprojects { } } -rootProject.buildDir = '../build' +rootProject.buildDir = "../build" subprojects { project.buildDir = "${rootProject.buildDir}/${project.name}" } subprojects { - project.evaluationDependsOn(':app') + project.evaluationDependsOn(":app") } -task clean(type: Delete) { +tasks.register("clean", Delete) { delete rootProject.buildDir } diff --git a/android/gradle.properties b/android/gradle.properties index 94adc3a..3b5b324 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx1536M +org.gradle.jvmargs=-Xmx4G -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index cc5527d..e1ca574 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,5 @@ -#Fri Jun 23 08:50:38 CEST 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-all.zip diff --git a/android/settings.gradle b/android/settings.gradle index 44e62bc..536165d 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -1,11 +1,25 @@ -include ':app' +pluginManagement { + def flutterSdkPath = { + def properties = new Properties() + file("local.properties").withInputStream { properties.load(it) } + def flutterSdkPath = properties.getProperty("flutter.sdk") + assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + return flutterSdkPath + }() -def localPropertiesFile = new File(rootProject.projectDir, "local.properties") -def properties = new Properties() + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") -assert localPropertiesFile.exists() -localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} -def flutterSdkPath = properties.getProperty("flutter.sdk") -assert flutterSdkPath != null, "flutter.sdk not set in local.properties" -apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "7.3.0" apply false + id "org.jetbrains.kotlin.android" version "1.7.10" apply false +} + +include ":app" diff --git a/devtools_options.yaml b/devtools_options.yaml new file mode 100644 index 0000000..fa0b357 --- /dev/null +++ b/devtools_options.yaml @@ -0,0 +1,3 @@ +description: This file stores settings for Dart & Flutter DevTools. +documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states +extensions: diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist index 8d4492f..7c56964 100644 --- a/ios/Flutter/AppFrameworkInfo.plist +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 9.0 + 12.0 diff --git a/ios/Podfile b/ios/Podfile index 88359b2..2c068c4 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -# platform :ios, '11.0' +platform :ios, '12.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/ios/Podfile.lock b/ios/Podfile.lock new file mode 100644 index 0000000..859d4d7 --- /dev/null +++ b/ios/Podfile.lock @@ -0,0 +1,159 @@ +PODS: + - audio_session (0.0.1): + - Flutter + - DKImagePickerController/Core (4.3.9): + - DKImagePickerController/ImageDataManager + - DKImagePickerController/Resource + - DKImagePickerController/ImageDataManager (4.3.9) + - DKImagePickerController/PhotoGallery (4.3.9): + - DKImagePickerController/Core + - DKPhotoGallery + - DKImagePickerController/Resource (4.3.9) + - DKPhotoGallery (0.0.19): + - DKPhotoGallery/Core (= 0.0.19) + - DKPhotoGallery/Model (= 0.0.19) + - DKPhotoGallery/Preview (= 0.0.19) + - DKPhotoGallery/Resource (= 0.0.19) + - SDWebImage + - SwiftyGif + - DKPhotoGallery/Core (0.0.19): + - DKPhotoGallery/Model + - DKPhotoGallery/Preview + - SDWebImage + - SwiftyGif + - DKPhotoGallery/Model (0.0.19): + - SDWebImage + - SwiftyGif + - DKPhotoGallery/Preview (0.0.19): + - DKPhotoGallery/Model + - DKPhotoGallery/Resource + - SDWebImage + - SwiftyGif + - DKPhotoGallery/Resource (0.0.19): + - SDWebImage + - SwiftyGif + - file_picker (0.0.1): + - DKImagePickerController/PhotoGallery + - Flutter + - Flutter (1.0.0) + - flutter_inappwebview_ios (0.0.1): + - Flutter + - flutter_inappwebview_ios/Core (= 0.0.1) + - OrderedSet (~> 5.0) + - flutter_inappwebview_ios/Core (0.0.1): + - Flutter + - OrderedSet (~> 5.0) + - flutter_keyboard_visibility (0.0.1): + - Flutter + - just_audio (0.0.1): + - Flutter + - OrderedSet (5.0.0) + - package_info_plus (0.4.5): + - Flutter + - path_provider_foundation (0.0.1): + - Flutter + - FlutterMacOS + - pointer_interceptor_ios (0.0.1): + - Flutter + - SDWebImage (5.19.6): + - SDWebImage/Core (= 5.19.6) + - SDWebImage/Core (5.19.6) + - share_plus (0.0.1): + - Flutter + - sqflite (0.0.3): + - Flutter + - FlutterMacOS + - SwiftyGif (5.4.5) + - url_launcher_ios (0.0.1): + - Flutter + - video_player_avfoundation (0.0.1): + - Flutter + - FlutterMacOS + - wakelock_plus (0.0.1): + - Flutter + - webview_flutter_wkwebview (0.0.1): + - Flutter + - FlutterMacOS + +DEPENDENCIES: + - audio_session (from `.symlinks/plugins/audio_session/ios`) + - file_picker (from `.symlinks/plugins/file_picker/ios`) + - Flutter (from `Flutter`) + - flutter_inappwebview_ios (from `.symlinks/plugins/flutter_inappwebview_ios/ios`) + - flutter_keyboard_visibility (from `.symlinks/plugins/flutter_keyboard_visibility/ios`) + - just_audio (from `.symlinks/plugins/just_audio/ios`) + - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) + - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) + - pointer_interceptor_ios (from `.symlinks/plugins/pointer_interceptor_ios/ios`) + - share_plus (from `.symlinks/plugins/share_plus/ios`) + - sqflite (from `.symlinks/plugins/sqflite/darwin`) + - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) + - video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/darwin`) + - wakelock_plus (from `.symlinks/plugins/wakelock_plus/ios`) + - webview_flutter_wkwebview (from `.symlinks/plugins/webview_flutter_wkwebview/darwin`) + +SPEC REPOS: + trunk: + - DKImagePickerController + - DKPhotoGallery + - OrderedSet + - SDWebImage + - SwiftyGif + +EXTERNAL SOURCES: + audio_session: + :path: ".symlinks/plugins/audio_session/ios" + file_picker: + :path: ".symlinks/plugins/file_picker/ios" + Flutter: + :path: Flutter + flutter_inappwebview_ios: + :path: ".symlinks/plugins/flutter_inappwebview_ios/ios" + flutter_keyboard_visibility: + :path: ".symlinks/plugins/flutter_keyboard_visibility/ios" + just_audio: + :path: ".symlinks/plugins/just_audio/ios" + package_info_plus: + :path: ".symlinks/plugins/package_info_plus/ios" + path_provider_foundation: + :path: ".symlinks/plugins/path_provider_foundation/darwin" + pointer_interceptor_ios: + :path: ".symlinks/plugins/pointer_interceptor_ios/ios" + share_plus: + :path: ".symlinks/plugins/share_plus/ios" + sqflite: + :path: ".symlinks/plugins/sqflite/darwin" + url_launcher_ios: + :path: ".symlinks/plugins/url_launcher_ios/ios" + video_player_avfoundation: + :path: ".symlinks/plugins/video_player_avfoundation/darwin" + wakelock_plus: + :path: ".symlinks/plugins/wakelock_plus/ios" + webview_flutter_wkwebview: + :path: ".symlinks/plugins/webview_flutter_wkwebview/darwin" + +SPEC CHECKSUMS: + audio_session: 088d2483ebd1dc43f51d253d4a1c517d9a2e7207 + DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c + DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60 + file_picker: 09aa5ec1ab24135ccd7a1621c46c84134bfd6655 + Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 + flutter_inappwebview_ios: 97215cf7d4677db55df76782dbd2930c5e1c1ea0 + flutter_keyboard_visibility: 0339d06371254c3eb25eeb90ba8d17dca8f9c069 + just_audio: baa7252489dbcf47a4c7cc9ca663e9661c99aafa + OrderedSet: aaeb196f7fef5a9edf55d89760da9176ad40b93c + package_info_plus: 58f0028419748fad15bf008b270aaa8e54380b1c + path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 + pointer_interceptor_ios: 508241697ff0947f853c061945a8b822463947c1 + SDWebImage: a79252b60f4678812d94316c91da69ec83089c9f + share_plus: 8875f4f2500512ea181eef553c3e27dba5135aad + sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec + SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4 + url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe + video_player_avfoundation: 7c6c11d8470e1675df7397027218274b6d2360b3 + wakelock_plus: 78ec7c5b202cab7761af8e2b2b3d0671be6c4ae1 + webview_flutter_wkwebview: 0982481e3d9c78fd5c6f62a002fcd24fc791f1e4 + +PODFILE CHECKSUM: 4e8f8b2be68aeea4c0d5beb6ff1e79fface1d048 + +COCOAPODS: 1.15.2 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 56937a1..a2e88d5 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -3,11 +3,12 @@ archiveVersion = 1; classes = { }; - objectVersion = 50; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 1E99759F9733732E231458BD /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4AA5EE30C2AC9375EB00B994 /* Pods_Runner.framework */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; @@ -29,12 +30,16 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 05CD3041F8910463EDD4E340 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 4AA5EE30C2AC9375EB00B994 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 709807EBA28DDB225AE98A9C /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 7D4D31B4BE19867E9F9F5BDD /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -49,6 +54,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 1E99759F9733732E231458BD /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -72,6 +78,8 @@ 9740EEB11CF90186004384FC /* Flutter */, 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, + F8BA37999CAC219FBB07A0EC /* Pods */, + A08877115AB2591F4F038B9A /* Frameworks */, ); sourceTree = ""; }; @@ -98,6 +106,25 @@ path = Runner; sourceTree = ""; }; + A08877115AB2591F4F038B9A /* Frameworks */ = { + isa = PBXGroup; + children = ( + 4AA5EE30C2AC9375EB00B994 /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + F8BA37999CAC219FBB07A0EC /* Pods */ = { + isa = PBXGroup; + children = ( + 7D4D31B4BE19867E9F9F5BDD /* Pods-Runner.debug.xcconfig */, + 709807EBA28DDB225AE98A9C /* Pods-Runner.release.xcconfig */, + 05CD3041F8910463EDD4E340 /* Pods-Runner.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -105,12 +132,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( + 4DF0E1B0BCF395BAA2C3390D /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + C68376B0BCC92054EF23ACC3 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -127,7 +156,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1300; + LastUpgradeCheck = 1510; ORGANIZATIONNAME = ""; TargetAttributes = { 97C146ED1CF9000F007C117D = { @@ -171,10 +200,12 @@ /* Begin PBXShellScriptBuildPhase section */ 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); name = "Thin Binary"; outputPaths = ( @@ -183,8 +214,31 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; + 4DF0E1B0BCF395BAA2C3390D /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -197,6 +251,23 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; + C68376B0BCC92054EF23ACC3 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -272,7 +343,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -349,7 +420,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -398,7 +469,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index c87d15a..5e31d3d 100644 --- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ + + diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift index 70693e4..b636303 100644 --- a/ios/Runner/AppDelegate.swift +++ b/ios/Runner/AppDelegate.swift @@ -1,7 +1,7 @@ import UIKit import Flutter -@UIApplicationMain +@main @objc class AppDelegate: FlutterAppDelegate { override func application( _ application: UIApplication, diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 1358c4b..1dddffe 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -45,5 +45,9 @@ UIStatusBarHidden - - \ No newline at end of file + CADisableMinimumFrameDurationOnPhone + + UIApplicationSupportsIndirectInputEvents + + + diff --git a/lib/component/dimens.dart b/lib/component/dimens.dart index e8714eb..a5ec53f 100644 --- a/lib/component/dimens.dart +++ b/lib/component/dimens.dart @@ -1,14 +1,14 @@ - import 'package:get/get.dart'; class Dimens { + Dimens._(); + + static double bodyMargin = Get.width / 10; + static double halfBodyMargin = (Get.width / 10) / 2; - static double bodyMargin = Get.width/10; - static double halfBodyMargin = (Get.width/10)/2; - static double small = 8.0; static double medium = 16.0; static double large = 32.0; static double xlarge = 64.0; static double xxlarge = 150.0; -} \ No newline at end of file +} diff --git a/lib/component/my_component.dart b/lib/component/my_component.dart index b41002a..337a4e7 100644 --- a/lib/component/my_component.dart +++ b/lib/component/my_component.dart @@ -121,11 +121,14 @@ PreferredSize appBar(String title) { child: Container( height: 40, width: 40, - decoration: BoxDecoration( - color: SolidColors.primaryColor.withBlue(100), + decoration: const BoxDecoration( + color: SolidColors.primaryColor, shape: BoxShape.circle, ), - child: const Icon(Icons.keyboard_arrow_right_rounded), + child: const Icon( + Icons.keyboard_arrow_right_rounded, + color: Colors.white, + ), ), ), ), diff --git a/lib/component/searchBar.dart b/lib/component/search_bar.dart similarity index 100% rename from lib/component/searchBar.dart rename to lib/component/search_bar.dart diff --git a/lib/constant/api_constant.dart b/lib/constant/api_constant.dart index f539d79..48eb034 100644 --- a/lib/constant/api_constant.dart +++ b/lib/constant/api_constant.dart @@ -1,16 +1,19 @@ -class ApiUrlConstant{ +class ApiUrlConstant { ApiUrlConstant._(); - static const hostDlUrl ="https://techblog.sasansafari.com"; - static const baseUrl ="https://techblog.sasansafari.com/Techblog/api/"; - static const getHomeItems =baseUrl + "home/?command=index"; - static const getArticleList =baseUrl + "article/get.php?command=new&user_id="; - static const publishedByMe =baseUrl + "article/get.php?command=published_by_me&user_id="; - static const getArticleInfo =baseUrl + "article/get.php?command=info&id=1&user_id=1"; - static const postRegister =baseUrl + "register/action.php"; - static const articlePost =baseUrl + "article/post.php"; - static const podcastFiles =baseUrl + "podcast/get.php?command=get_files&podcats_id="; - static const postPodcast = baseUrl + "podcast/post.php"; - static const PublishedByMePodcast = baseUrl + "podcast/get.php?command=published_by_me&user_id="; - + static const hostDlUrl = "https://techblog.sasansafari.com"; + static const baseUrl = "https://techblog.sasansafari.com/Techblog/api/"; + static const getHomeItems = "${baseUrl}home/?command=index"; + static const getArticleList = + "${baseUrl}article/get.php?command=new&user_id="; + static const publishedByMe = + "${baseUrl}article/get.php?command=published_by_me&user_id="; + static const getArticleInfo = + "${baseUrl}article/get.php?command=info&id=1&user_id=1"; + static const postRegister = "${baseUrl}register/action.php"; + static const articlePost = "${baseUrl}article/post.php"; + static const podcastFiles = + "${baseUrl}podcast/get.php?command=get_files&podcats_id="; + static const postPodcast = "${baseUrl}podcast/post.php"; + static const publishedByMePodcast = + "${baseUrl}podcast/get.php?command=published_by_me&user_id="; } - diff --git a/lib/constant/api_key_constants.dart b/lib/constant/api_key_constants.dart index a213bea..ea8b81b 100644 --- a/lib/constant/api_key_constants.dart +++ b/lib/constant/api_key_constants.dart @@ -1,39 +1,39 @@ - -class ApiArticleKeyConstant{ - - static const title ="title"; - static const content ="content"; - static const catId ="cat_id"; - static const userId ="user_id"; - static const image ="image"; - static const command ="command"; - static const tagList ="tag_list"; - +class ApiArticleKeyConstant { + ApiArticleKeyConstant._(); + static const title = "title"; + static const content = "content"; + static const catId = "cat_id"; + static const userId = "user_id"; + static const image = "image"; + static const command = "command"; + static const tagList = "tag_list"; } //storPodcastTitle -class ApiPodcastTitleKyConstants{ - static const userId ="user_id"; - static const title ="title"; - static const catId ="cat_id"; - static const command ="command"; +class ApiPodcastTitleKyConstants { + ApiPodcastTitleKyConstants._(); + static const userId = "user_id"; + static const title = "title"; + static const catId = "cat_id"; + static const command = "command"; } - //storPodcastFile -class ApiPodcastFileKyConstants{ - static const podcastId ="podcast_id"; - static const title ="title"; - static const length ="length"; - static const file ="file"; - static const command ="command"; +class ApiPodcastFileKyConstants { + ApiPodcastFileKyConstants._(); + static const podcastId = "podcast_id"; + static const title = "title"; + static const length = "length"; + static const file = "file"; + static const command = "command"; } //updatePodcastPoster -class ApiPodcastUpdateKyConstants{ - static const userId ="user_id"; - static const podcastId ="podcast_id"; - static const image ="image"; - static const file ="file"; - static const command ="command"; -} \ No newline at end of file +class ApiPodcastUpdateKyConstants { + ApiPodcastUpdateKyConstants._(); + static const userId = "user_id"; + static const podcastId = "podcast_id"; + static const image = "image"; + static const file = "file"; + static const command = "command"; +} diff --git a/lib/constant/commands.dart b/lib/constant/commands.dart index 0cafb5c..83f02d9 100644 --- a/lib/constant/commands.dart +++ b/lib/constant/commands.dart @@ -1,8 +1,7 @@ -class Commands{ - - +class Commands { + Commands._(); static const String store = "store"; - static const String storTitle = "store_title"; + static const String storTitle = "store_title"; static const String storFile = "store_file"; static const String storUpdate = "update_poster"; -} \ No newline at end of file +} diff --git a/lib/constant/my_colors.dart b/lib/constant/my_colors.dart index a2e729e..a4609da 100644 --- a/lib/constant/my_colors.dart +++ b/lib/constant/my_colors.dart @@ -1,6 +1,7 @@ import 'package:flutter/cupertino.dart'; class SolidColors { + SolidColors._(); static const Color posterSubTitle = Color.fromARGB(200, 255, 255, 255); static const Color posterTitle = Color.fromARGB(255, 255, 255, 255); static const Color primaryColor = Color.fromARGB(255, 68, 4, 87); @@ -26,11 +27,11 @@ class SolidColors { static const Color yelowColor = Color.fromARGB(255, 255, 235, 59); static const Color erorColor = Color.fromARGB(255, 227, 10, 10); static const Color lightBackColor = Color.fromARGB(255, 255, 255, 255); - static const Color minutesColorColor = Color.fromARGB(255, 203, 202, 202); - + static const Color minutesColorColor = Color.fromARGB(255, 203, 202, 202); } class GradientColors { + GradientColors._(); static const List bottomNav = [ Color.fromARGB(255, 25, 0, 94), Color.fromARGB(255, 68, 4, 87) @@ -57,13 +58,4 @@ class GradientColors { Color.fromARGB(255, 46, 3, 71), Color.fromARGB(0, 0, 0, 0) ]; - - } - - - - - - - \ No newline at end of file diff --git a/lib/constant/my_strings.dart b/lib/constant/my_strings.dart index 03e4cba..fa58fec 100644 --- a/lib/constant/my_strings.dart +++ b/lib/constant/my_strings.dart @@ -1,6 +1,7 @@ class MyStrings { + MyStrings._(); static const String techBlogGithubUrl = - "https://github.com/sasansafari/techblog"; + "https://github.com/MasoudMaghsodi/tech_blog"; static const String viewHotestBlog = "مشاهده داغ ترین نوشته ها "; static const String viewHotestPodCasts = "مشاهده داغ ترین پادکست ها"; static const String relatedArticle = "نوشته های مرتبط"; @@ -27,7 +28,7 @@ class MyStrings { www.sasansafari.com """; - static const String podcastEmpty = """ + static const String podcastEmpty = """ هنوز هیچ پادکست ای به جامعه گیک های فارسی اضافه نکردی !!! @@ -46,61 +47,60 @@ www.sasansafari.com static String visit = 'بازدید'; static String titleAppBarManageArticle = "مدیریت مقاله ها"; - static String ManagePodcast = "مدیریت پادکست ها"; + static String managePodcast = "مدیریت پادکست ها"; static String titleAppBarArticleContentEditor = "نوشتن/ویرایش مقاله "; static String hintArticleContentEditor = "میتونی مقاله‌تو اینجا بنویسی..."; static String textManageArticle = "بریم برای نوشتن یه مقاله باحال"; - static String titleDialogSingleManageArticle ="عنوان مقاله"; - static String hintTextSingleManageArticle ="اینجا بنویس"; - static String save ="ثبت"; - static String selectImage ="انتخاب تصویر"; - static String editTitleArticle ="ویرایش عنوان مقاله"; - static String editTitlePodcast ="ویرایش عنوان پادکست"; - static String editMainTextArticle ='ویرایش متن اصلی مقاله'; - static String selectCategory ="انتخاب دسته بندی"; - static String noCategorySelected ="هیچ دسته بندی انتخاب نشده"; + static String titleDialogSingleManageArticle = "عنوان مقاله"; + static String hintTextSingleManageArticle = "اینجا بنویس"; + static String save = "ثبت"; + static String selectImage = "انتخاب تصویر"; + static String editTitleArticle = "ویرایش عنوان مقاله"; + static String editTitlePodcast = "ویرایش عنوان پادکست"; + static String editMainTextArticle = 'ویرایش متن اصلی مقاله'; + static String selectCategory = "انتخاب دسته بندی"; + static String noCategorySelected = "هیچ دسته بندی انتخاب نشده"; static String wait = "ٌصبر کنید ..."; static String sendText = "ارسال مطلب"; static String anonymousText = "ناشناس"; static String writePodcast = "write podcast"; static String titleArticleText = "مقالات"; - static String userProfile = "پروفایل کاربری"; - static String aboutTec = "درباره تکبلاگ"; - static String shareTec = "اشتراک گذاری تک بلاگ"; - static String tecIngithub = "تک‌بلاگ در گیت هاب"; - static String shareKnowledge = "دونسته هات رو با بقیه به اشتراک بذار ..."; - static String gigTech = """ + static String userProfile = "پروفایل کاربری"; + static String aboutTec = "درباره تکبلاگ"; + static String shareTec = "اشتراک گذاری تک بلاگ"; + static String tecIngithub = "تک‌بلاگ در گیت هاب"; + static String shareKnowledge = "دونسته هات رو با بقیه به اشتراک بذار ..."; + static String gigTech = """ فکر کن !! اینجا بودنت به این معناست که یک گیک تکنولوژی هستی دونسته هات رو با جامعه‌ی گیک های فارسی زبان به اشتراک بذار.. """; - static String nameFatemeAmiri = "فاطمه امیری"; - static String gmailFatemeAmiri = "fatemeamiri@gmail.com"; - static String exit = "خروج"; - static String cancel = "لغو"; - static String error = "خطا"; - static String errorText = "Eror"; - static String youAlreadyLeft = "قبلا خارج شدی !!"; - static String areYouSureExit ="آیا از خروج خود مطمئن هستید ؟"; - static String addNewPodcast ="اضافه کردن یک پادکست جدید"; - static String addNewFile ="اضافه کردن فایل"; - static String frilance ="بخش چهارم : فریلنسر دیوانه"; - static String meaningFullTitle ="لطفا یک عنوان پرمعنا انتخاب کن"; - static String verification ="تایید"; - static String later="بعدا"; - static String minute="دقیقه"; - static String houre="ساعت"; - static String isEmail="isEmail:"; - static String tecEmail="techblog@gmail.com"; - static String enterEmaile= "لطفا ایمیل خود را به درستی وارد کنید"; - static String formatEmailNotCorrect= "فرمت ایمیل درست نمیباشد, لطفا ایمیل خود را به درستی وارد کنید"; - static String selectAudioFile="انتخاب فابل صوتی"; - static String enterNumber = "Enter Number"; - static String continuation = "ادامه"; - static String letsGo = "بزن بریم"; - static String stars = "******"; - static String nameAndFamilyName = "نام و نام خانوادگی"; - static String addNewTimeFile="لطفا زمان و فایل قسمت جدید پادکست رو وارد کن"; - - + static String nameFatemeAmiri = "مسعود مقصودی"; + static String gmailFatemeAmiri = "magsodi333@gmail.com"; + static String exit = "خروج"; + static String cancel = "لغو"; + static String error = "خطا"; + static String errorText = "Eror"; + static String youAlreadyLeft = "قبلا خارج شدی !!"; + static String areYouSureExit = "آیا از خروج خود مطمئن هستید ؟"; + static String addNewPodcast = "اضافه کردن یک پادکست جدید"; + static String addNewFile = "اضافه کردن فایل"; + static String frilance = "بخش چهارم : فریلنسر دیوانه"; + static String meaningFullTitle = "لطفا یک عنوان پرمعنا انتخاب کن"; + static String verification = "تایید"; + static String later = "بعدا"; + static String minute = "دقیقه"; + static String houre = "ساعت"; + static String isEmail = "isEmail:"; + static String tecEmail = "techblog@gmail.com"; + static String enterEmaile = "لطفا ایمیل خود را به درستی وارد کنید"; + static String formatEmailNotCorrect = + "فرمت ایمیل درست نمیباشد, لطفا ایمیل خود را به درستی وارد کنید"; + static String selectAudioFile = "انتخاب فابل صوتی"; + static String enterNumber = "Enter Number"; + static String continuation = "ادامه"; + static String letsGo = "بزن بریم"; + static String stars = "******"; + static String nameAndFamilyName = "نام و نام خانوادگی"; + static String addNewTimeFile = "لطفا زمان و فایل قسمت جدید پادکست رو وارد کن"; } diff --git a/lib/constant/storage_const.dart b/lib/constant/storage_const.dart index cad8437..72e4e4d 100644 --- a/lib/constant/storage_const.dart +++ b/lib/constant/storage_const.dart @@ -1,12 +1,10 @@ import 'package:get_storage/get_storage.dart'; + class BoxStorage { static GetStorage box = GetStorage(); } -class StorageKey{ - -static String token ="token"; -static String userId ="userId"; +class StorageKey { + static String token = "token"; + static String userId = "userId"; } - - diff --git a/lib/controller/article/list_article_controller.dart b/lib/controller/article/list_article_controller.dart index 24e19d1..0a4c54f 100644 --- a/lib/controller/article/list_article_controller.dart +++ b/lib/controller/article/list_article_controller.dart @@ -1,6 +1,3 @@ -import 'dart:developer'; - -import 'package:flutter/foundation.dart'; import 'package:get/get.dart'; import 'package:tec/constant/api_constant.dart'; import 'package:tec/models/article_model.dart'; @@ -18,8 +15,7 @@ class ListArticleController extends GetxController { getList() async { loading.value = true; - // ignore: todo - //TODO get userid from getStorage ApiConstant.getArticleList+userid + var response = await DioService().getMethod(ApiUrlConstant.getArticleList); if (response.statusCode == 200) { @@ -33,8 +29,6 @@ class ListArticleController extends GetxController { getArticleListWithTagsId(String id) async { articleList.clear(); loading.value = true; - // ignore: todo - //TODO get userid from getStorage ApiConstant.getArticleList+userid final queryParam = { 'command': 'get_articles_with_tag_id', @@ -42,8 +36,9 @@ class ListArticleController extends GetxController { 'user_id': '' }; - final uri = Uri.https(ApiUrlConstant.baseUrl, 'article/get.php?', queryParam); - + final uri = + Uri.https(ApiUrlConstant.baseUrl, 'article/get.php?', queryParam); + var response = await DioService().getMethod(uri.toString()); if (response.statusCode == 200) { diff --git a/lib/controller/article/manage_article_controller.dart b/lib/controller/article/manage_article_controller.dart index d3ef29d..c09dff9 100644 --- a/lib/controller/article/manage_article_controller.dart +++ b/lib/controller/article/manage_article_controller.dart @@ -1,4 +1,3 @@ -import 'dart:developer'; import 'package:dio/dio.dart' as dio; import 'package:flutter/cupertino.dart'; import 'package:get/get.dart'; @@ -23,9 +22,8 @@ class ManageArticleController extends GetxController { Rx articleInfoModel = ArticleInfoModel( MyStrings.titltArrticle, MyStrings.editOrginalTextArticle, - "", - ) - .obs; + "", + ).obs; @override onInit() { @@ -35,11 +33,8 @@ class ManageArticleController extends GetxController { getManagedArticle() async { loading.value = true; - // ignore: todo - //TODO get userid from getStorage ApiConstant.getArticleList+userid - // var response = await DioService().getMethod(ApiConstant.publishedByMe+GetStorage().read(StorageKey.userId)); var response = - await DioService().getMethod(ApiUrlConstant.publishedByMe + "1"); + await DioService().getMethod("${ApiUrlConstant.publishedByMe}1"); if (response.statusCode == 200) { response.data.forEach((element) { @@ -69,9 +64,9 @@ class ManageArticleController extends GetxController { ApiArticleKeyConstant.command: Commands.store, ApiArticleKeyConstant.tagList: "[]" }; + // ignore: unused_local_variable var response = await DioService().postMethod(map, ApiUrlConstant.articlePost); - log(response.data.toString()); loading.value = false; } } diff --git a/lib/controller/article/single_article_controller.dart b/lib/controller/article/single_article_controller.dart index 0fd733a..c318172 100644 --- a/lib/controller/article/single_article_controller.dart +++ b/lib/controller/article/single_article_controller.dart @@ -1,14 +1,12 @@ -import 'package:flutter/widgets.dart'; import 'package:get/get.dart'; import 'package:tec/constant/api_constant.dart'; import 'package:tec/models/article_info_model.dart'; import 'package:tec/models/article_model.dart'; import 'package:tec/models/tags_model.dart'; import 'package:tec/services/dio_service.dart'; -import 'package:tec/view/articles/single.dart'; - + import '../../route_manager/names.dart'; - + class SingleArticleController extends GetxController { RxBool loading = false.obs; RxInt id = RxInt(0); @@ -19,20 +17,13 @@ class SingleArticleController extends GetxController { getArticleInfo(var id) async { articleInfoModel = ArticleInfoModel(null, null, null).obs; - - + Get.toNamed(NamedRoute.routeSingleArticle); - loading.value = true; var userId = ''; - debugPrint(ApiUrlConstant.baseUrl + - 'article/get.php?command=info&id=$id&user_id=$userId'); - // ignore: todo - //TODO user id is hard code - - var response = await DioService().getMethod(ApiUrlConstant.baseUrl + - 'article/get.php?command=info&id=$id&user_id=$userId'); + var response = await DioService().getMethod( + '${ApiUrlConstant.baseUrl}article/get.php?command=info&id=$id&user_id=$userId'); if (response.statusCode == 200) { articleInfoModel.value = ArticleInfoModel.fromJson(response.data); diff --git a/lib/controller/file_controller.dart b/lib/controller/file_controller.dart index f0e553e..05f8bed 100644 --- a/lib/controller/file_controller.dart +++ b/lib/controller/file_controller.dart @@ -1,10 +1,6 @@ - - import 'package:file_picker/file_picker.dart'; import 'package:get/get.dart'; -class FilePickerController extends GetxController{ - - Rx file = PlatformFile(name: "nothing", size: 0).obs ; - -} \ No newline at end of file +class FilePickerController extends GetxController { + Rx file = PlatformFile(name: "nothing", size: 0).obs; +} diff --git a/lib/controller/podcast/manage_podcast_controller.dart b/lib/controller/podcast/manage_podcast_controller.dart index 58ddafc..67697d3 100644 --- a/lib/controller/podcast/manage_podcast_controller.dart +++ b/lib/controller/podcast/manage_podcast_controller.dart @@ -1,8 +1,4 @@ -import 'dart:developer'; -import 'dart:io'; - import 'package:dio/dio.dart' as dio; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; @@ -17,7 +13,7 @@ import '../../constant/storage_const.dart'; class ManagePodcastController extends GetxController { RxList podcastModel = RxList.empty(); -RxInt currentHourValue = 0.obs; + RxInt currentHourValue = 0.obs; RxInt currentMinuteValue = 0.obs; RxInt currentSecondeValue = 0.obs; Rx podcastFileModel = @@ -26,7 +22,6 @@ RxInt currentHourValue = 0.obs; // var selectedTime = TimeOfDay.now().replacing(hour: 0,minute: 0).obs; RxBool loading = false.obs; TextEditingController titleTextEditingController = TextEditingController(); - RxInt? input = 0.obs; var userId = ''; @@ -49,7 +44,7 @@ RxInt currentHourValue = 0.obs; var response = await DioService().postMethod(map, ApiUrlConstant.postPodcast); if (response.statusCode == 200) { - SnackBar( + const SnackBar( content: Text("با موفقیت انجام شد"), ); } @@ -67,11 +62,12 @@ RxInt currentHourValue = 0.obs; ApiPodcastFileKyConstants.command: Commands.storFile, ApiPodcastFileKyConstants.length: podcastFileModel.value.lenght, }; + // ignore: unused_local_variable var response = await DioService().postMethod(map, ApiUrlConstant.postPodcast); } - UpdatePodcast() async { + updatePodcast() async { var fileController = Get.find(); loading.value = true; Map map = { @@ -82,6 +78,7 @@ RxInt currentHourValue = 0.obs; ApiPodcastUpdateKyConstants.command: Commands.storUpdate, ApiPodcastUpdateKyConstants.userId: GetStorage().read(StorageKey.userId), }; + // ignore: unused_local_variable var response = await DioService().postMethod(map, ApiUrlConstant.postPodcast); } diff --git a/lib/controller/podcast/single_podcast_cotroller.dart b/lib/controller/podcast/single_podcast_cotroller.dart index 14013c3..7e04979 100644 --- a/lib/controller/podcast/single_podcast_cotroller.dart +++ b/lib/controller/podcast/single_podcast_cotroller.dart @@ -1,6 +1,4 @@ import 'dart:async'; -import 'dart:developer'; - import 'package:get/get.dart'; import 'package:just_audio/just_audio.dart'; import 'package:tec/constant/api_constant.dart'; @@ -8,6 +6,7 @@ import 'package:tec/models/podcasts_file_model.dart'; import 'package:tec/services/dio_service.dart'; class SinglePodcastController extends GetxController { + // ignore: prefer_typing_uninitialized_variables var id; SinglePodcastController({this.id}); @@ -77,12 +76,19 @@ class SinglePodcastController extends GetxController { progressState.value = player.position; bufferState.value = player.bufferedPosition; - debugPrint('TIMER :: ${progressState.value}'); } }); } - + timerCheck() { + if (player.playing) { + startProgress(); + } else { + timer!.cancel(); + progressState.value = const Duration(seconds: 0); + bufferState.value = const Duration(seconds: 0); + } + } setLoopMode() { if (isLoopAll.value) { diff --git a/lib/controller/register_controller.dart b/lib/controller/register_controller.dart index 7381c7a..77ee0a9 100644 --- a/lib/controller/register_controller.dart +++ b/lib/controller/register_controller.dart @@ -1,17 +1,12 @@ -import 'package:email_validator/email_validator.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; import 'package:tec/constant/api_constant.dart'; -import 'package:tec/gen/assets.gen.dart'; -import 'package:tec/route_manager/names.dart'; import 'package:tec/services/dio_service.dart'; import 'package:tec/view/main_screen/bottom_navigation.dart'; import 'package:tec/view/main_screen/main_screen.dart'; import 'package:tec/view/register/register_intro.dart'; -import '../constant/my_colors.dart'; import '../constant/storage_const.dart'; class RegisterController extends GetxController { @@ -46,18 +41,12 @@ class RegisterController extends GetxController { debugPrint(map.toString()); var response = await DioService().postMethod(map, ApiUrlConstant.postRegister); - debugPrint(response.data.toString()); var status = response.data['response']; switch (status) { case 'verified': - // var box = GetStorage(); BoxStorage.box.write(StorageKey.token, response.data['token']); BoxStorage.box.write(StorageKey.userId, response.data['user_id']); - - debugPrint("read::: " + BoxStorage.box.read(StorageKey.token)); - debugPrint("read::: " + BoxStorage.box.read(StorageKey.userId)); - Get.offAll(const MainScreen()); break; @@ -69,11 +58,12 @@ class RegisterController extends GetxController { break; } } - toggleLogin() { - if (GetStorage().read(StorageKey.token) == null) { - Get.to(RegisterIntro()); - } else { - routeToWriteBottomSheet(); - } - } + + toggleLogin() { + if (GetStorage().read(StorageKey.token) == null) { + Get.to(RegisterIntro()); + } else { + routeToWriteBottomSheet(); + } + } } diff --git a/lib/main.dart b/lib/main.dart index 55b3534..3d25859 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -9,7 +9,6 @@ import 'my_http_overrides.dart'; import 'route_manager/names.dart'; import 'route_manager/pages.dart'; - Future main() async { HttpOverrides.global = MyHttpOverrides(); @@ -29,7 +28,6 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return GetMaterialApp( - locale: const Locale('fa'), theme: AppThemes.lightTheme, debugShowCheckedModeBanner: false, diff --git a/lib/my_http_overrides.dart b/lib/my_http_overrides.dart index bd7897a..36ccf39 100644 --- a/lib/my_http_overrides.dart +++ b/lib/my_http_overrides.dart @@ -1,9 +1,10 @@ import 'dart:io'; -class MyHttpOverrides extends HttpOverrides{ +class MyHttpOverrides extends HttpOverrides { @override - HttpClient createHttpClient(SecurityContext? context){ + HttpClient createHttpClient(SecurityContext? context) { return super.createHttpClient(context) - ..badCertificateCallback = (X509Certificate cert, String host, int port)=> true; + ..badCertificateCallback = + (X509Certificate cert, String host, int port) => true; } -} \ No newline at end of file +} diff --git a/lib/route_manager/binding.dart b/lib/route_manager/binding.dart index 4a8b50d..131b058 100644 --- a/lib/route_manager/binding.dart +++ b/lib/route_manager/binding.dart @@ -8,9 +8,7 @@ import 'package:tec/controller/article/single_article_controller.dart'; class ArticleBinding implements Bindings { @override void dependencies() { - // ignore: todo - // TODO: implement dependencies - Get.put(ListArticleController()); + Get.put(() => ListArticleController()); Get.lazyPut(() => SingleArticleController()); } } @@ -18,9 +16,6 @@ class ArticleBinding implements Bindings { class ArticleManagerBinding implements Bindings { @override void dependencies() { - // ignore: todo - // TODO: implement dependencies - // Get.put(ManageArticleController()); Get.put(ManageArticleController()); } } @@ -28,8 +23,6 @@ class ArticleManagerBinding implements Bindings { class RegisterBinding implements Bindings { @override void dependencies() { - // ignore: todo - // TODO: implement dependencies Get.put(RegisterController()); } } @@ -37,16 +30,13 @@ class RegisterBinding implements Bindings { class SinglePodcastBinding implements Bindings { @override void dependencies() { - // ignore: todo - // TODO: implement dependencies Get.put(SinglePodcastController()); } } -class podcastManagerBinding implements Bindings { +class PodcastManagerBinding implements Bindings { @override void dependencies() { - Get.lazyPut(() => SinglePodcastController()); + Get.lazyPut(() => SinglePodcastController()); } } - diff --git a/lib/route_manager/pages.dart b/lib/route_manager/pages.dart index 3532b4a..7b1c793 100644 --- a/lib/route_manager/pages.dart +++ b/lib/route_manager/pages.dart @@ -10,49 +10,43 @@ import 'package:tec/view/podcast/single_manage_podcast.dart'; import 'package:tec/view/podcast/single_podcast.dart'; import 'package:tec/view/splash_screen.dart'; -class Pages{ - +class Pages { Pages._(); - static List> pages = [ - GetPage( - name: NamedRoute.initialRoute, - page: () => const SplashScreen(), - ), - GetPage( - name: NamedRoute.routeMainScreen, - page: () => const MainScreen(), - binding: RegisterBinding()), - GetPage( - name: NamedRoute.routeSingleArticle, - page: () => Single(), - binding: ArticleBinding()), - GetPage( - name: NamedRoute.manageArticle, - page: () => ManageArticle(), - binding: ArticleManagerBinding()), - GetPage( - name: NamedRoute.singleManageArticle, - page: () => SingleManageArticle(), - binding: ArticleManagerBinding()), - GetPage( - name: NamedRoute.singlePodcast, - page: () => PodcastSingle(), - binding: SinglePodcastBinding() - ), - GetPage( - name: NamedRoute.singleManagePodcast, - page: () => SingleManagePodcast(), - binding: podcastManagerBinding(), - ), - GetPage( - name: NamedRoute.podcastManageList, - page: () => ManagePodcast(), - binding: podcastManagerBinding(), - ), - - - ]; - - -} \ No newline at end of file + static List> pages = [ + GetPage( + name: NamedRoute.initialRoute, + page: () => const SplashScreen(), + ), + GetPage( + name: NamedRoute.routeMainScreen, + page: () => const MainScreen(), + binding: RegisterBinding()), + GetPage( + name: NamedRoute.routeSingleArticle, + page: () => Single(), + binding: ArticleBinding()), + GetPage( + name: NamedRoute.manageArticle, + page: () => ManageArticle(), + binding: ArticleManagerBinding()), + GetPage( + name: NamedRoute.singleManageArticle, + page: () => SingleManageArticle(), + binding: ArticleManagerBinding()), + GetPage( + name: NamedRoute.singlePodcast, + page: () => PodcastSingle(), + binding: SinglePodcastBinding()), + GetPage( + name: NamedRoute.singleManagePodcast, + page: () => SingleManagePodcast(), + binding: PodcastManagerBinding(), + ), + GetPage( + name: NamedRoute.podcastManageList, + page: () => ManagePodcast(), + binding: PodcastManagerBinding(), + ), + ]; +} diff --git a/lib/services/dio_service.dart b/lib/services/dio_service.dart index 96a4e86..9a4c337 100644 --- a/lib/services/dio_service.dart +++ b/lib/services/dio_service.dart @@ -1,6 +1,7 @@ import 'dart:developer'; import 'package:dio/dio.dart'; import 'package:dio/dio.dart' as dio_service; +import 'package:flutter/material.dart'; import 'package:get_storage/get_storage.dart'; import 'package:tec/constant/storage_const.dart'; @@ -12,42 +13,42 @@ class DioService { .get(url, options: Options(responseType: ResponseType.json, method: 'GET')) .then((response) { - log(response.toString()); + // log(response.toString()); return response; + // ignore: body_might_complete_normally_catch_error }).catchError((err) { - if (err is DioError) { + if (err is DioException) { return err.response!; } }); } Future postMethod(Map map, String url) async { - try { - dio.options.headers['content-Type'] = 'application/json'; - var token = GetStorage().read(StorageKey.token); - if (token != null) { - dio.options.headers['authorization'] = '$token'; - } - - return await dio - .post(url, - data: dio_service.FormData.fromMap(map), - options: Options(responseType: ResponseType.json, method: 'POST')) - .then((response) { - log(response.headers.toString()); - log(response.data.toString()); - log(response.statusCode.toString()); - return response; - }).catchError((err) { - log(err.toString()); - if (err is DioError) { - return err.response!; + try { + dio.options.headers['content-Type'] = 'application/json'; + var token = GetStorage().read(StorageKey.token); + if (token != null) { + dio.options.headers['authorization'] = '$token'; } - }); - }catch (e) { - - print(e.toString()); + + return await dio + .post(url, + data: dio_service.FormData.fromMap(map), + options: Options(responseType: ResponseType.json, method: 'POST')) + .then((response) { + // log(response.headers.toString()); + // log(response.data.toString()); + // log(response.statusCode.toString()); + return response; + // ignore: body_might_complete_normally_catch_error + }).catchError((err) { + log(err.toString()); + if (err is DioException) { + return err.response!; + } + }); + } catch (e) { + debugPrint(e.toString()); } } - } diff --git a/lib/themes/app_themes.dart b/lib/themes/app_themes.dart index 25d179e..a81bf05 100644 --- a/lib/themes/app_themes.dart +++ b/lib/themes/app_themes.dart @@ -4,76 +4,76 @@ import '../constant/my_colors.dart'; class AppThemes { static ThemeData lightTheme = ThemeData( - inputDecorationTheme: InputDecorationTheme( - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(16), - borderSide: const BorderSide(width: 2), - ), - filled: true, - fillColor: Colors.white, - ), - elevatedButtonTheme: ElevatedButtonThemeData( - style: ButtonStyle( - textStyle: MaterialStateProperty.resolveWith((states) { - if (states.contains(MaterialState.pressed)) { - return const TextStyle( - fontSize: 16, - fontFamily: 'dana', - fontWeight: FontWeight.w700, - color: SolidColors.posterTitle, - ); - } - return const TextStyle( - fontSize: 15, - fontFamily: 'dana', - fontWeight: FontWeight.w300, - color: SolidColors.posterSubTitle, - ); - }), - backgroundColor: MaterialStateProperty.resolveWith((states) { - if (states.contains(MaterialState.pressed)) { - return SolidColors.seeMore; - } - return SolidColors.primaryColor; - }), - ), - ), - fontFamily: 'dana', - brightness: Brightness.light, - accentColor: SolidColors.primaryColor, - textTheme: const TextTheme( - displayLarge: TextStyle( - fontFamily: 'dana', + inputDecorationTheme: InputDecorationTheme( + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(16), + borderSide: const BorderSide(width: 2), + ), + filled: true, + fillColor: Colors.white, + ), + elevatedButtonTheme: ElevatedButtonThemeData( + style: ButtonStyle( + textStyle: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.pressed)) { + return const TextStyle( fontSize: 16, - fontWeight: FontWeight.w700, - color: SolidColors.posterTitle), - titleMedium: TextStyle( - fontFamily: 'dana', - fontSize: 14, - fontWeight: FontWeight.w300, - color: SolidColors.posterSubTitle), - bodyLarge: TextStyle( - fontFamily: 'dana', fontSize: 13, fontWeight: FontWeight.w300), - displayMedium: TextStyle( fontFamily: 'dana', - fontSize: 14, - color: Colors.white, - fontWeight: FontWeight.w300), - displaySmall: TextStyle( - fontFamily: 'dana', - fontSize: 14, - color: SolidColors.seeMore, - fontWeight: FontWeight.w700), - headlineMedium: TextStyle( - fontFamily: 'dana', - fontSize: 14, - color: Color.fromARGB(255, 70, 70, 70), - fontWeight: FontWeight.w700), - headlineSmall: TextStyle( - fontFamily: 'dana', - fontSize: 14, - color: SolidColors.hintText, - fontWeight: FontWeight.w700), - ), - ); + fontWeight: FontWeight.w700, + color: SolidColors.posterTitle, + ); + } + return const TextStyle( + fontSize: 15, + fontFamily: 'dana', + fontWeight: FontWeight.w300, + color: SolidColors.posterSubTitle, + ); + }), + backgroundColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.pressed)) { + return SolidColors.seeMore; + } + return SolidColors.primaryColor; + }), + ), + ), + fontFamily: 'dana', + brightness: Brightness.light, + // accentColor: SolidColors.primaryColor, + textTheme: const TextTheme( + displayLarge: TextStyle( + fontFamily: 'dana', + fontSize: 16, + fontWeight: FontWeight.w700, + color: SolidColors.posterTitle), + titleMedium: TextStyle( + fontFamily: 'dana', + fontSize: 14, + fontWeight: FontWeight.w300, + color: SolidColors.posterSubTitle), + bodyLarge: TextStyle( + fontFamily: 'dana', fontSize: 13, fontWeight: FontWeight.w300), + displayMedium: TextStyle( + fontFamily: 'dana', + fontSize: 14, + color: Colors.white, + fontWeight: FontWeight.w300), + displaySmall: TextStyle( + fontFamily: 'dana', + fontSize: 14, + color: SolidColors.seeMore, + fontWeight: FontWeight.w700), + headlineMedium: TextStyle( + fontFamily: 'dana', + fontSize: 14, + color: Color.fromARGB(255, 70, 70, 70), + fontWeight: FontWeight.w700), + headlineSmall: TextStyle( + fontFamily: 'dana', + fontSize: 14, + color: SolidColors.hintText, + fontWeight: FontWeight.w700), + ), + ); } diff --git a/lib/view/articles/articel_list_sceen.dart b/lib/view/articles/articel_list_sceen.dart index a300586..1bfd882 100644 --- a/lib/view/articles/articel_list_sceen.dart +++ b/lib/view/articles/articel_list_sceen.dart @@ -54,9 +54,8 @@ class ArticleListScreen extends StatelessWidget { imageBuilder: (((context, imageProvider) { return Container( decoration: BoxDecoration( - borderRadius: - BorderRadius.all( - Radius.circular(Dimens.medium)), + borderRadius: BorderRadius.all( + Radius.circular(Dimens.medium)), image: DecorationImage( image: imageProvider, fit: BoxFit.cover)), diff --git a/lib/view/articles/article_content_editor.dart b/lib/view/articles/article_content_editor.dart index 97744d3..87257fa 100644 --- a/lib/view/articles/article_content_editor.dart +++ b/lib/view/articles/article_content_editor.dart @@ -1,6 +1,3 @@ - -import 'dart:developer'; - import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:html_editor_enhanced/html_editor.dart'; @@ -11,42 +8,39 @@ import 'package:tec/controller/article/manage_article_controller.dart'; // ignore: must_be_immutable class ArticleContentEditor extends StatelessWidget { ArticleContentEditor({Key? key}) : super(key: key); - + final HtmlEditorController controller = HtmlEditorController(); var manageArticleController = Get.put(ManageArticleController()); @override Widget build(BuildContext context) { - return GestureDetector( - onTap: () => controller.clearFocus(), - child: Scaffold( - appBar:appBar(MyStrings.titleAppBarArticleContentEditor), - body: SingleChildScrollView( + onTap: () => controller.clearFocus(), + child: Scaffold( + appBar: appBar(MyStrings.titleAppBarArticleContentEditor), + body: SingleChildScrollView( child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - HtmlEditor( - controller: controller, - htmlEditorOptions: HtmlEditorOptions( - hint: MyStrings.hintArticleContentEditor, - shouldEnsureVisible: true, - initialText: manageArticleController.articleInfoModel.value.content! - ), - callbacks: Callbacks( - onChangeContent: (p0) { - manageArticleController.articleInfoModel.update((val) { - val?.content =p0; - },); - log(manageArticleController.articleInfoModel.value.content.toString()); + mainAxisAlignment: MainAxisAlignment.center, + children: [ + HtmlEditor( + controller: controller, + htmlEditorOptions: HtmlEditorOptions( + hint: MyStrings.hintArticleContentEditor, + shouldEnsureVisible: true, + initialText: + manageArticleController.articleInfoModel.value.content!), + callbacks: Callbacks( + onChangeContent: (p0) { + manageArticleController.articleInfoModel.update( + (val) { + val?.content = p0; }, - ), - - ) - ], - - )), - ), + ); + }, + ), + ) + ], + )), + ), ); - } -} \ No newline at end of file +} diff --git a/lib/view/articles/manage_article.dart b/lib/view/articles/manage_article.dart index c8c6735..a14bc2f 100644 --- a/lib/view/articles/manage_article.dart +++ b/lib/view/articles/manage_article.dart @@ -35,7 +35,7 @@ class ManageArticle extends StatelessWidget { //route to single manage }), child: Padding( - padding: EdgeInsets.all(Dimens.small), + padding: EdgeInsets.all(Dimens.small), child: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ @@ -48,7 +48,7 @@ class ManageArticle extends StatelessWidget { imageBuilder: (((context, imageProvider) { return Container( decoration: BoxDecoration( - borderRadius: BorderRadius.all( + borderRadius: BorderRadius.all( Radius.circular(Dimens.medium)), image: DecorationImage( image: imageProvider, @@ -59,14 +59,14 @@ class ManageArticle extends StatelessWidget { return const Loading(); }), errorWidget: ((context, url, error) { - return Icon( + return Icon( Icons.image_not_supported_outlined, - size: Dimens.xlarge-14, + size: Dimens.xlarge - 14, color: SolidColors.greyColor); }), ), ), - SizedBox( + SizedBox( width: Dimens.medium, ), Column( @@ -81,7 +81,7 @@ class ManageArticle extends StatelessWidget { maxLines: 2, ), ), - SizedBox( + SizedBox( height: Dimens.medium, ), Row( @@ -93,8 +93,8 @@ class ManageArticle extends StatelessWidget { .articleList[index].author!, style: textTheme.bodySmall, ), - SizedBox( - width: Dimens.medium+4, + SizedBox( + width: Dimens.medium + 4, ), Text( articleManageController @@ -112,19 +112,22 @@ class ManageArticle extends StatelessWidget { ); }), ) - : ArticleEmptyState(textTheme:textTheme,), + : ArticleEmptyState( + textTheme: textTheme, + ), ), bottomNavigationBar: Padding( - padding: EdgeInsets.only(top: Dimens.large), + padding: EdgeInsets.only(top: Dimens.large), child: Padding( - padding: EdgeInsets.all(Dimens.small), + padding: EdgeInsets.all(Dimens.small), child: ElevatedButton( style: ButtonStyle( - fixedSize: MaterialStateProperty.all(Size(Get.width / 3, Dimens.xlarge-8))), + fixedSize: WidgetStateProperty.all( + Size(Get.width / 3, Dimens.xlarge - 8))), onPressed: () { Get.toNamed(NamedRoute.singleManageArticle); }, - child: Text(MyStrings.textManageArticle), + child: Text(MyStrings.textManageArticle), ), ), ), diff --git a/lib/view/articles/single.dart b/lib/view/articles/single.dart index 10b94d8..896c89f 100644 --- a/lib/view/articles/single.dart +++ b/lib/view/articles/single.dart @@ -151,11 +151,17 @@ class Single extends StatelessWidget { SizedBox( height: Dimens.medium + 9, ), - Tags(textheme: textTheme, singleArticleController: singleArticleController,), + Tags( + textheme: textTheme, + singleArticleController: singleArticleController, + ), SizedBox( height: Dimens.medium + 9, ), - Similar(textheme: textTheme, singleArticleController: singleArticleController,) + Similar( + textheme: textTheme, + singleArticleController: singleArticleController, + ) ]), ), ), diff --git a/lib/view/articles/single_manage_article.dart b/lib/view/articles/single_manage_article.dart index e9ff2b0..8e88b17 100644 --- a/lib/view/articles/single_manage_article.dart +++ b/lib/view/articles/single_manage_article.dart @@ -17,10 +17,12 @@ import 'article_content_editor.dart'; // ignore: must_be_immutable class SingleManageArticle extends StatelessWidget { - SingleManageArticle({Key? key,}) : super(key: key); + SingleManageArticle({ + Key? key, + }) : super(key: key); var manageArticleController = Get.find(); - HomeScreenController homeScreenController = Get.put(HomeScreenController()); + HomeScreenController homeScreenController = Get.put(HomeScreenController()); FilePickerController filePickerController = Get.put(FilePickerController()); getTitle() { @@ -31,7 +33,8 @@ class SingleManageArticle extends StatelessWidget { controller: manageArticleController.titleTextEditingController, keyboardType: TextInputType.text, style: const TextStyle(color: SolidColors.colorTitle), - decoration: InputDecoration(hintText: MyStrings.hintTextSingleManageArticle), + decoration: + InputDecoration(hintText: MyStrings.hintTextSingleManageArticle), ), backgroundColor: SolidColors.primaryColor, radius: 8, @@ -40,7 +43,7 @@ class SingleManageArticle extends StatelessWidget { manageArticleController.updateTitle(); Get.back(); }), - child: Text(MyStrings.save))); + child: Text(MyStrings.save))); } @override @@ -51,8 +54,7 @@ class SingleManageArticle extends StatelessWidget { body: SingleChildScrollView( physics: const BouncingScrollPhysics(), child: Obx( - () => Column( - children: [ + () => Column(children: [ Stack( children: [ SizedBox( @@ -80,7 +82,7 @@ class SingleManageArticle extends StatelessWidget { left: 0, right: 0, child: Container( - height: Dimens.xlarge-4, + height: Dimens.xlarge - 4, decoration: const BoxDecoration( gradient: LinearGradient( end: Alignment.bottomCenter, @@ -89,17 +91,17 @@ class SingleManageArticle extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.end, children: [ - SizedBox( - width: Dimens.medium+4, + SizedBox( + width: Dimens.medium + 4, ), GestureDetector( onTap: () { Get.back(); }, - child: Icon( + child: Icon( Icons.arrow_back, color: SolidColors.lightIcon, - size: Dimens.medium+8, + size: Dimens.medium + 8, ), ), const Expanded(child: SizedBox()), @@ -117,19 +119,19 @@ class SingleManageArticle extends StatelessWidget { await pickFile(); }, child: Container( - height: Dimens.large-2, + height: Dimens.large - 2, width: Get.width / 3, - decoration: BoxDecoration( + decoration: BoxDecoration( color: SolidColors.primaryColor, borderRadius: BorderRadius.only( - topLeft: Radius.circular(Dimens.small+4), - topRight: Radius.circular(Dimens.small+4), + topLeft: Radius.circular(Dimens.small + 4), + topRight: Radius.circular(Dimens.small + 4), )), child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( - MyStrings.selectImage, + MyStrings.selectImage, style: textheme.displayMedium, ), const Icon( @@ -143,8 +145,8 @@ class SingleManageArticle extends StatelessWidget { )) ], ), - SizedBox( - height: Dimens.medium+8, + SizedBox( + height: Dimens.medium + 8, ), GestureDetector( @@ -176,7 +178,7 @@ class SingleManageArticle extends StatelessWidget { ), Padding( - padding: EdgeInsets.all(Dimens.small), + padding: EdgeInsets.all(Dimens.small), child: HtmlWidget( manageArticleController.articleInfoModel.value.content!, textStyle: textheme.headlineSmall, @@ -185,8 +187,8 @@ class SingleManageArticle extends StatelessWidget { const Loading()), ), ), - SizedBox( - height: Dimens.medium+9, + SizedBox( + height: Dimens.medium + 9, ), GestureDetector( onTap: () { @@ -202,7 +204,7 @@ class SingleManageArticle extends StatelessWidget { padding: EdgeInsets.all(Dimens.halfBodyMargin), child: Text( manageArticleController.articleInfoModel.value.catName == null - ?MyStrings.noCategorySelected + ? MyStrings.noCategorySelected : manageArticleController.articleInfoModel.value.catName!, maxLines: 2, style: textheme.titleLarge, @@ -213,10 +215,10 @@ class SingleManageArticle extends StatelessWidget { onPressed: (() async => await manageArticleController.storeArticle()), child: Padding( - padding: EdgeInsets.all(Dimens.small), + padding: EdgeInsets.all(Dimens.small), child: Text(manageArticleController.loading.value - ?MyStrings.wait - :MyStrings.sendText ), + ? MyStrings.wait + : MyStrings.sendText), )) // tags(textheme), ]), @@ -229,20 +231,25 @@ class SingleManageArticle extends StatelessWidget { Get.bottomSheet( Container( height: Get.height / 1.5, - decoration: BoxDecoration( + decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.only( - topLeft: Radius.circular(Dimens.medium+4), topRight: Radius.circular(Dimens.medium+4)), + topLeft: Radius.circular(Dimens.medium + 4), + topRight: Radius.circular(Dimens.medium + 4)), ), child: Padding( - padding: EdgeInsets.all(Dimens.small), + padding: EdgeInsets.all(Dimens.small), child: SingleChildScrollView( child: Column(children: [ - Text(MyStrings.selectCategory), - SizedBox( + Text(MyStrings.selectCategory), + SizedBox( height: Dimens.small, ), - Cats(textTheme: textTheme, homeScreenController: homeScreenController, manageArticleController: manageArticleController,) + Cats( + textTheme: textTheme, + homeScreenController: homeScreenController, + manageArticleController: manageArticleController, + ) ]), ), ), @@ -251,5 +258,3 @@ class SingleManageArticle extends StatelessWidget { persistent: true); } } - - diff --git a/lib/view/main_screen/bottom_navigation.dart b/lib/view/main_screen/bottom_navigation.dart index 7130b17..f767751 100644 --- a/lib/view/main_screen/bottom_navigation.dart +++ b/lib/view/main_screen/bottom_navigation.dart @@ -1,19 +1,16 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; -import 'package:get_storage/get_storage.dart'; import 'package:tec/component/decrations.dart'; import 'package:tec/component/dimens.dart'; import 'package:tec/constant/my_colors.dart'; import 'package:tec/constant/my_strings.dart'; -import 'package:tec/constant/storage_const.dart'; import 'package:tec/controller/register_controller.dart'; import 'package:tec/gen/assets.gen.dart'; import 'package:tec/route_manager/names.dart'; -import 'package:tec/view/register/register_intro.dart'; import 'package:zoom_tap_animation/zoom_tap_animation.dart'; +// ignore: must_be_immutable class BottomNavigation extends StatelessWidget { BottomNavigation({ Key? key, @@ -33,7 +30,7 @@ class BottomNavigation extends StatelessWidget { @override Widget build(BuildContext context) { return Positioned( - bottom: 0, + bottom: 8, right: 0, left: 0, child: Container( @@ -46,8 +43,8 @@ class BottomNavigation extends StatelessWidget { ), ), child: Padding( - padding: - EdgeInsets.only(right: bodyMargin, left: bodyMargin, bottom: Dimens.small+2), + padding: EdgeInsets.only( + right: bodyMargin, left: bodyMargin, bottom: Dimens.small + 2), child: Container( height: size.height / 8, decoration: MyDecorations.mainGradient, @@ -59,30 +56,32 @@ class BottomNavigation extends StatelessWidget { onTap: () => changeScreen(0), child: ImageIcon( Image.asset(Assets.icons.home.path).image, - size: selectedScreen.value == 0 ? 26 : 24, - color: selectedScreen.value == 0 + size: selectedScreen.value == 0 ? 32 : 26, + color: selectedScreen.value == 1 ? SolidColors.lightIcon : SolidColors.greyColor, ), ), IconButton( - onPressed: (() { - registerController.toggleLogin(); - }), - icon: ImageIcon( - Image.asset(Assets.icons.write.path).image, - color: SolidColors.lightIcon, - size: Dimens.large+3, - )), + onPressed: (() { + registerController.toggleLogin(); + }), + icon: ImageIcon( + Image.asset(Assets.icons.write.path).image, + color: SolidColors.lightIcon, + size: Dimens.large - 2, + ), + ), ZoomTapAnimation( - onTap: () => changeScreen(1), - child: ImageIcon( - Image.asset(Assets.icons.user.path).image, - size: selectedScreen.value == 1 ? 26 : 24, - color: selectedScreen.value == 1 - ? SolidColors.lightIcon + onTap: () => changeScreen(1), + child: ImageIcon( + Image.asset(Assets.icons.user.path).image, + size: selectedScreen.value == 1 ? 32 : 26, + color: selectedScreen.value == 0 + ? SolidColors.lightIcon : SolidColors.greyColor, - )), + ), + ), ], ), ), @@ -93,80 +92,81 @@ class BottomNavigation extends StatelessWidget { } } - routeToWriteBottomSheet() { - Get.bottomSheet(Container( - height: Get.height / 3, - decoration: BoxDecoration( - color: SolidColors.lightText, - borderRadius: BorderRadius.only( - topLeft: Radius.circular(Dimens.medium+4), topRight: Radius.circular(Dimens.medium+4))), - child: Padding( - padding: EdgeInsets.all(Dimens.medium), - child: Column(children: [ - Row( - children: [ - SvgPicture.asset( - Assets.images.tcbot.path, - height: Dimens.large+8, - ), - SizedBox( - width: Dimens.small, - ), - Text(MyStrings.shareKnowledge) - ], - ), - SizedBox( - height: Dimens.small, - ), - Text(MyStrings.gigTech), - Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - GestureDetector( - onTap: (() { - // debugPrint("write article"); - Get.toNamed(NamedRoute.manageArticle); - }), - child: Container( - color: SolidColors.lightIcon, - child: Row( - children: [ - Image.asset( - Assets.icons.writeArticleIcon.path, - height: Dimens.large, - ), - SizedBox( - width: Dimens.small, - ), - Text(MyStrings.titleAppBarManageArticle) - ], - ), +routeToWriteBottomSheet() { + Get.bottomSheet(Container( + height: Get.height / 3, + decoration: BoxDecoration( + color: SolidColors.lightText, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(Dimens.medium + 4), + topRight: Radius.circular(Dimens.medium + 4))), + child: Padding( + padding: EdgeInsets.all(Dimens.medium), + child: Column(children: [ + Row( + children: [ + SvgPicture.asset( + Assets.images.tcbot.path, + height: Dimens.large + 8, + ), + SizedBox( + width: Dimens.small, + ), + Text(MyStrings.shareKnowledge) + ], + ), + SizedBox( + height: Dimens.small, + ), + Text(MyStrings.gigTech), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + GestureDetector( + onTap: (() { + // debugPrint("write article"); + Get.toNamed(NamedRoute.manageArticle); + }), + child: Container( + color: SolidColors.lightIcon, + child: Row( + children: [ + Image.asset( + Assets.icons.writeArticleIcon.path, + height: Dimens.large, + ), + SizedBox( + width: Dimens.small, + ), + Text(MyStrings.titleAppBarManageArticle) + ], ), ), - GestureDetector( - onTap: (() { - Get.toNamed(NamedRoute.podcastManageList); - debugPrint(MyStrings.writePodcast); - }), - child: Container( - color: SolidColors.lightIcon, - child: Row( - children: [ - Image.asset( - Assets.icons.writePodcastIcon.path, - height: Dimens.large, - ), - SizedBox( - width: Dimens.small, - ), - Text(MyStrings.ManagePodcast) - ], - ), + ), + GestureDetector( + onTap: (() { + Get.toNamed(NamedRoute.podcastManageList); + debugPrint(MyStrings.writePodcast); + }), + child: Container( + color: SolidColors.lightIcon, + child: Row( + children: [ + Image.asset( + Assets.icons.writePodcastIcon.path, + height: Dimens.large, + ), + SizedBox( + width: Dimens.small, + ), + Text(MyStrings.managePodcast) + ], ), ), - ], - ) - ]), - ), - )); - } + ), + ], + ) + ]), + ), + )); +} diff --git a/lib/view/main_screen/home_screen.dart b/lib/view/main_screen/home_screen.dart index 021289e..3d433ed 100644 --- a/lib/view/main_screen/home_screen.dart +++ b/lib/view/main_screen/home_screen.dart @@ -1,19 +1,17 @@ - import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:tec/component/dimens.dart'; +import 'package:tec/constant/my_colors.dart'; import 'package:tec/view/widgets/main_widget.dart'; import 'package:tec/component/my_component.dart'; import 'package:tec/constant/my_strings.dart'; import 'package:tec/controller/home_screen_controller.dart'; import 'package:tec/controller/article/single_article_controller.dart'; import 'package:tec/view/articles/articel_list_sceen.dart'; - + import 'see_more_podcast_screen.dart'; - + import '../../controller/article/list_article_controller.dart'; -import '../podcast/hot_podcast_list.dart'; - // ignore: must_be_immutable class HomeScreen extends StatelessWidget { @@ -38,7 +36,7 @@ class HomeScreen extends StatelessWidget { return Obx(() => homeScreenController.loading.value == false ? RefreshIndicator( // ignore: deprecated_member_use - color: Theme.of(context).accentColor, + color: SolidColors.primaryColor, onRefresh: () { return homeScreenController.getHomeItems(); }, @@ -48,11 +46,18 @@ class HomeScreen extends StatelessWidget { padding: EdgeInsets.fromLTRB(0, Dimens.medium, 0, 0), child: Column( children: [ - Poster(homeScreenController: homeScreenController, textTheme: textTheme, size: size,), + Poster( + homeScreenController: homeScreenController, + textTheme: textTheme, + size: size, + ), SizedBox( height: Dimens.medium, ), - Tag(textTheme: textTheme, bodyMargin: bodyMargin,), + Tag( + textTheme: textTheme, + bodyMargin: bodyMargin, + ), SizedBox( height: Dimens.large, ), @@ -65,13 +70,23 @@ class HomeScreen extends StatelessWidget { textTheme: textTheme, title: MyStrings.viewHotestBlog, )), - TopVisited(bodyMargin: bodyMargin, homeScreenController: homeScreenController, singleArticleController: singleArticleController, size: size, textTheme: textTheme,) - , SizedBox( + TopVisited( + bodyMargin: bodyMargin, + homeScreenController: homeScreenController, + singleArticleController: singleArticleController, + size: size, + textTheme: textTheme, + ), + SizedBox( height: Dimens.large, ), SeeMorePodcast( bodyMargin: bodyMargin, textTheme: textTheme), - TopPodcast(bodyMargin: bodyMargin, homeScreenController: homeScreenController, size: size,), + TopPodcast( + bodyMargin: bodyMargin, + homeScreenController: homeScreenController, + size: size, + ), SizedBox( height: Dimens.xlarge + 36, ) diff --git a/lib/view/main_screen/main_screen.dart b/lib/view/main_screen/main_screen.dart index cf151b7..6e3d6d1 100644 --- a/lib/view/main_screen/main_screen.dart +++ b/lib/view/main_screen/main_screen.dart @@ -9,7 +9,7 @@ import 'package:tec/gen/assets.gen.dart'; import 'package:tec/view/main_screen/bottom_navigation.dart'; import 'package:tec/view/main_screen/home_screen.dart'; import 'package:tec/view/main_screen/profile_screen.dart'; -import '../../component/searchBar.dart'; +import '../../component/search_bar.dart'; final GlobalKey _key = GlobalKey(); @@ -47,7 +47,7 @@ class _MainScreenState extends State { )), ListTile( title: Text( - MyStrings.userProfile, + MyStrings.userProfile, style: textTheme.headlineMedium, ), onTap: () { @@ -82,7 +82,7 @@ class _MainScreenState extends State { ), ListTile( title: Text( - MyStrings.tecIngithub, + MyStrings.tecIngithub, style: textTheme.headlineMedium, ), onTap: () { @@ -122,10 +122,12 @@ class _MainScreenState extends State { showSearch( context: context, // delegate to customize the search bar - delegate: CustomSearchDelegate() - ); + delegate: CustomSearchDelegate()); }, - icon: const Icon(Icons.search , color: SolidColors.blackColor,), + icon: const Icon( + Icons.search, + color: SolidColors.blackColor, + ), ) ], ), @@ -159,4 +161,3 @@ class _MainScreenState extends State { ); } } - diff --git a/lib/view/main_screen/profile_screen.dart b/lib/view/main_screen/profile_screen.dart index 1fc15a4..ebcfd86 100644 --- a/lib/view/main_screen/profile_screen.dart +++ b/lib/view/main_screen/profile_screen.dart @@ -22,16 +22,16 @@ class ProfileScreen extends StatelessWidget { return SingleChildScrollView( physics: const BouncingScrollPhysics(), child: Padding( - padding: EdgeInsets.only(top: Dimens.medium+8), + padding: EdgeInsets.only(top: Dimens.medium + 8), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Image.asset( Assets.images.profileAvatar.path, - height: Dimens.xlarge+36, + height: Dimens.xlarge + 36, ), - SizedBox( - height: Dimens.small+4, + SizedBox( + height: Dimens.small + 4, ), Row( mainAxisAlignment: MainAxisAlignment.center, @@ -40,7 +40,7 @@ class ProfileScreen extends StatelessWidget { Image.asset(Assets.icons.bluePen.path).image, color: SolidColors.seeMore, ), - SizedBox( + SizedBox( width: Dimens.small, ), Text( @@ -49,19 +49,19 @@ class ProfileScreen extends StatelessWidget { ) ], ), - SizedBox( - height: Dimens.xlarge-4, + SizedBox( + height: Dimens.xlarge - 4, ), Text( - MyStrings.nameFatemeAmiri, + MyStrings.nameFatemeAmiri, style: textTheme.headlineMedium, ), Text( MyStrings.gmailFatemeAmiri, style: textTheme.headlineMedium, ), - SizedBox( - height: Dimens.large+8, + SizedBox( + height: Dimens.large + 8, ), TechDivider(size: size), InkWell( @@ -70,7 +70,7 @@ class ProfileScreen extends StatelessWidget { }), splashColor: SolidColors.primaryColor, child: SizedBox( - height: Dimens.large+13, + height: Dimens.large + 13, child: Center( child: Text( MyStrings.myFavBlog, @@ -84,7 +84,7 @@ class ProfileScreen extends StatelessWidget { }), splashColor: SolidColors.primaryColor, child: SizedBox( - height: Dimens.large+13, + height: Dimens.large + 13, child: Center( child: Text( MyStrings.myFavPodcast, @@ -94,19 +94,19 @@ class ProfileScreen extends StatelessWidget { TechDivider(size: size), InkWell( onTap: (() { - logOut(); + logOut(); }), splashColor: SolidColors.primaryColor, child: SizedBox( - height: Dimens.large+13, + height: Dimens.large + 13, child: Center( child: Text( MyStrings.logOut, style: textTheme.headlineMedium, ))), ), - SizedBox( - height: Dimens.xlarge-4, + SizedBox( + height: Dimens.xlarge - 4, ), ], ), @@ -114,31 +114,31 @@ class ProfileScreen extends StatelessWidget { } } - logOut() { - Get.defaultDialog( - title: MyStrings.nameFatemeAmiri, - titleStyle: const TextStyle(color: SolidColors.scaffoldBg), - backgroundColor: SolidColors.primaryColor, - content: Text( - MyStrings.areYouSureExit, - style: TextStyle(color: SolidColors.scaffoldBg), - ), - radius: Dimens.small, - cancel: ElevatedButton( - onPressed: () { +logOut() { + Get.defaultDialog( + title: MyStrings.nameFatemeAmiri, + titleStyle: const TextStyle(color: SolidColors.scaffoldBg), + backgroundColor: SolidColors.primaryColor, + content: Text( + MyStrings.areYouSureExit, + style: const TextStyle(color: SolidColors.scaffoldBg), + ), + radius: Dimens.small, + cancel: ElevatedButton( + onPressed: () { + Get.back(); + }, + child: Text(MyStrings.cancel)), + confirm: ElevatedButton( + onPressed: () { + if (GetStorage().read(StorageKey.token) == null) { Get.back(); - }, - child: Text(MyStrings.cancel)), - confirm: ElevatedButton( - onPressed: () { - if (GetStorage().read(StorageKey.token) == null) { - Get.back(); - Get.snackbar(MyStrings.error,MyStrings.youAlreadyLeft); - } else { - BoxStorage.box.erase(); - Get.offNamed(NamedRoute.profileScreen); - } - }, - child: Text(MyStrings.exit)), - ); - } + Get.snackbar(MyStrings.error, MyStrings.youAlreadyLeft); + } else { + BoxStorage.box.erase(); + Get.offNamed(NamedRoute.profileScreen); + } + }, + child: Text(MyStrings.exit)), + ); +} diff --git a/lib/view/main_screen/see_more_podcast_screen.dart b/lib/view/main_screen/see_more_podcast_screen.dart index 1d83799..9450b97 100644 --- a/lib/view/main_screen/see_more_podcast_screen.dart +++ b/lib/view/main_screen/see_more_podcast_screen.dart @@ -1,4 +1,3 @@ - import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:tec/component/dimens.dart'; @@ -28,16 +27,18 @@ class SeeMorePodcast extends StatelessWidget { Image.asset(Assets.icons.microphon.path).image, color: SolidColors.seeMore, ), - SizedBox( + SizedBox( width: Dimens.small, ), - Padding( - padding: EdgeInsets.fromLTRB(0, 0, Dimens.small, 0), + Padding( + padding: EdgeInsets.fromLTRB(0, 0, Dimens.small, 0), child: GestureDetector( - onTap: () => Get.to(HotPodcastList(title: MyStrings.myFavPodcast,)), + onTap: () => Get.to(HotPodcastList( + title: MyStrings.myFavPodcast, + )), child: Text( MyStrings.viewHotestPodCasts, - style: textTheme.headline3, + style: textTheme.displaySmall, ), ), ) @@ -45,4 +46,4 @@ class SeeMorePodcast extends StatelessWidget { ), ); } -} \ No newline at end of file +} diff --git a/lib/view/my_cats.dart b/lib/view/my_cats.dart index d2615d1..0f1072f 100644 --- a/lib/view/my_cats.dart +++ b/lib/view/my_cats.dart @@ -32,14 +32,14 @@ class _MyCatsState extends State { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - SizedBox( + SizedBox( height: Dimens.large, ), SvgPicture.asset( Assets.images.tcbot.path, height: Dimens.xlarge + 36, ), - SizedBox( + SizedBox( height: Dimens.medium, ), Text( @@ -54,8 +54,8 @@ class _MyCatsState extends State { hintStyle: textTheme.headlineMedium, ), ), - SizedBox( - height: Dimens.large, + SizedBox( + height: Dimens.large, ), Text( MyStrings.chooseCats, @@ -63,19 +63,19 @@ class _MyCatsState extends State { ), //taglist Padding( - padding: EdgeInsets.only(top: Dimens.large), + padding: EdgeInsets.only(top: Dimens.large), child: SizedBox( width: double.infinity, - height: Dimens.xlarge+21, + height: Dimens.xlarge + 21, child: GridView.builder( physics: const ClampingScrollPhysics(), itemCount: tagList.length, shrinkWrap: true, scrollDirection: Axis.horizontal, gridDelegate: - SliverGridDelegateWithFixedCrossAxisCount( - crossAxisSpacing: Dimens.small-3, - mainAxisSpacing: Dimens.small-3, + SliverGridDelegateWithFixedCrossAxisCount( + crossAxisSpacing: Dimens.small - 3, + mainAxisSpacing: Dimens.small - 3, crossAxisCount: 2, childAspectRatio: 0.3), itemBuilder: ((context, index) { @@ -95,7 +95,7 @@ class _MyCatsState extends State { })), ), ), - SizedBox( + SizedBox( height: Dimens.medium, ), Image.asset( @@ -104,10 +104,10 @@ class _MyCatsState extends State { ), //selected Tags Padding( - padding: EdgeInsets.only(top: Dimens.large), + padding: EdgeInsets.only(top: Dimens.large), child: SizedBox( width: double.infinity, - height: Dimens.xlarge+21, + height: Dimens.xlarge + 21, child: GridView.builder( physics: const ClampingScrollPhysics(), itemCount: selectedTags.length, @@ -122,19 +122,20 @@ class _MyCatsState extends State { ), itemBuilder: ((context, index) { return Container( - height: Dimens.xlarge-4, - decoration: BoxDecoration( - borderRadius: - BorderRadius.all(Radius.circular(Dimens.medium+8)), + height: Dimens.xlarge - 4, + decoration: BoxDecoration( + borderRadius: BorderRadius.all( + Radius.circular(Dimens.medium + 8)), color: SolidColors.surface, ), child: Padding( - padding: EdgeInsets.fromLTRB(Dimens.medium, Dimens.small, Dimens.small, Dimens.small), + padding: EdgeInsets.fromLTRB(Dimens.medium, + Dimens.small, Dimens.small, Dimens.small), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - SizedBox( + SizedBox( width: Dimens.small, ), Text( diff --git a/lib/view/podcast/hot_podcast_list.dart b/lib/view/podcast/hot_podcast_list.dart index 3b8015f..831e22c 100644 --- a/lib/view/podcast/hot_podcast_list.dart +++ b/lib/view/podcast/hot_podcast_list.dart @@ -1,4 +1,3 @@ - import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -10,6 +9,8 @@ import '../../component/dimens.dart'; import '../../component/my_component.dart'; import '../../models/podcast_model.dart'; import '../../route_manager/names.dart'; + +// ignore: must_be_immutable class HotPodcastList extends StatelessWidget { final String title; @@ -27,31 +28,32 @@ class HotPodcastList extends StatelessWidget { child: Scaffold( appBar: appBar(title), body: Padding( - padding: EdgeInsets.fromLTRB(0, Dimens.medium, Dimens.medium-1, 0), + padding: EdgeInsets.fromLTRB(0, Dimens.medium, Dimens.medium - 1, 0), child: ListView.builder( scrollDirection: Axis.vertical, itemCount: homeScreenController.topPodcasts.length, itemBuilder: ((context, index) { return GestureDetector( onTap: () { - Get.toNamed(NamedRoute.singlePodcast,arguments: homeScreenController.topPodcasts[index] ); + Get.toNamed(NamedRoute.singlePodcast, + arguments: homeScreenController.topPodcasts[index]); }, child: Column( children: [ Row( children: [ SizedBox( - height: Dimens.xlarge+36, - width: Dimens.xlarge+36, + height: Dimens.xlarge + 36, + width: Dimens.xlarge + 36, child: Padding( - padding: EdgeInsets.all(Dimens.small), + padding: EdgeInsets.all(Dimens.small), child: CachedNetworkImage( imageUrl: homeScreenController .topPodcasts[index].poster!, imageBuilder: (context, imageProvider) => Container( decoration: BoxDecoration( - borderRadius: BorderRadius.all( + borderRadius: BorderRadius.all( Radius.circular(Dimens.medium), ), image: DecorationImage( @@ -59,9 +61,9 @@ class HotPodcastList extends StatelessWidget { fit: BoxFit.cover)), ), placeholder: ((context, url) => const Loading()), - errorWidget: (context, url, error) => Icon( + errorWidget: (context, url, error) => Icon( Icons.image_not_supported_outlined, - size: Dimens.xlarge-14, + size: Dimens.xlarge - 14, color: SolidColors.erorColor, ), ), @@ -96,4 +98,4 @@ class HotPodcastList extends StatelessWidget { ), ); } -} \ No newline at end of file +} diff --git a/lib/view/podcast/manage_podcast.dart b/lib/view/podcast/manage_podcast.dart index c881f01..198dbc6 100644 --- a/lib/view/podcast/manage_podcast.dart +++ b/lib/view/podcast/manage_podcast.dart @@ -8,10 +8,10 @@ import 'package:tec/view/widgets/podcast_widgets.dart'; import 'package:tec/constant/my_colors.dart'; import 'package:tec/constant/my_strings.dart'; import 'package:tec/controller/home_screen_controller.dart'; -import 'package:tec/gen/assets.gen.dart'; import '../../controller/podcast/manage_podcast_controller.dart'; import '../../route_manager/names.dart'; +// ignore: must_be_immutable class ManagePodcast extends StatelessWidget { ManagePodcast({Key? key}) : super(key: key); @@ -23,97 +23,94 @@ class ManagePodcast extends StatelessWidget { var textTheme = Theme.of(context).textTheme; return SafeArea( child: Scaffold( - appBar: appBar(MyStrings.ManagePodcast), - body: Obx( - () => managePodcastController.loading.value - ? const Loading() - : managePodcastController.podcastModel.isNotEmpty - ? Padding( - padding: EdgeInsets.fromLTRB( - 0, Dimens.medium, Dimens.medium - 1, 0), - child: ListView.builder( - scrollDirection: Axis.vertical, - itemCount: managePodcastController.podcastModel.length, - itemBuilder: ((context, index) { - // return Text(homeScreenController.topPodcast[index].title!,); - return GestureDetector( - onTap: () { - Get.toNamed(NamedRoute.singlePodcast, - arguments: managePodcastController - .podcastModel[index]); - }, - child: Column( - children: [ - Row( - children: [ - SizedBox( - height: Dimens.xlarge + 36, - width: Dimens.xlarge + 36, - child: Padding( - padding: EdgeInsets.all( - Dimens.small, + appBar: appBar(MyStrings.managePodcast), + body: Obx(() => managePodcastController.loading.value + ? const Loading() + : managePodcastController.podcastModel.isNotEmpty + ? Padding( + padding: EdgeInsets.fromLTRB( + 0, Dimens.medium, Dimens.medium - 1, 0), + child: ListView.builder( + scrollDirection: Axis.vertical, + itemCount: managePodcastController.podcastModel.length, + itemBuilder: ((context, index) { + // return Text(homeScreenController.topPodcast[index].title!,); + return GestureDetector( + onTap: () { + Get.toNamed(NamedRoute.singlePodcast, + arguments: managePodcastController + .podcastModel[index]); + }, + child: Column( + children: [ + Row( + children: [ + SizedBox( + height: Dimens.xlarge + 36, + width: Dimens.xlarge + 36, + child: Padding( + padding: EdgeInsets.all( + Dimens.small, + ), + child: CachedNetworkImage( + imageUrl: managePodcastController + .podcastModel[index].poster!, + imageBuilder: + (context, imageProvider) => + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.all( + Radius.circular(Dimens.medium), + ), + image: DecorationImage( + image: imageProvider, + fit: BoxFit.cover)), ), - child: CachedNetworkImage( - imageUrl: managePodcastController - .podcastModel[index].poster!, - imageBuilder: - (context, imageProvider) => - Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.all( - Radius.circular( - Dimens.medium), - ), - image: DecorationImage( - image: imageProvider, - fit: BoxFit.cover)), - ), - placeholder: ((context, url) => - const Loading()), - errorWidget: (context, url, error) => - Icon( - Icons.image_not_supported_outlined, - size: Dimens.xlarge - 14, - color: SolidColors.erorColor, - ), + placeholder: ((context, url) => + const Loading()), + errorWidget: (context, url, error) => + Icon( + Icons.image_not_supported_outlined, + size: Dimens.xlarge - 14, + color: SolidColors.erorColor, ), ), ), - Padding( - padding: EdgeInsets.fromLTRB( - 0, 0, 0, Dimens.bodyMargin / 1), - child: Column( - children: [ - Text( - managePodcastController - .podcastModel[index].title!, - style: const TextStyle( - fontWeight: FontWeight.bold), - ), - Text( - managePodcastController - .podcastModel[index].publisher!, - style: subTextPodcastList, - ), - ], - ), + ), + Padding( + padding: EdgeInsets.fromLTRB( + 0, 0, 0, Dimens.bodyMargin / 1), + child: Column( + children: [ + Text( + managePodcastController + .podcastModel[index].title!, + style: const TextStyle( + fontWeight: FontWeight.bold), + ), + Text( + managePodcastController + .podcastModel[index].publisher!, + style: subTextPodcastList, + ), + ], ), - ], - ) - ], - ), - ); - }), - ), - ) - : PodcastEmpty(textTheme: textTheme) - ), + ), + ], + ) + ], + ), + ); + }), + ), + ) + : PodcastEmpty(textTheme: textTheme)), bottomNavigationBar: Padding( padding: EdgeInsets.all(Dimens.small), child: ElevatedButton( style: ButtonStyle( - fixedSize: - MaterialStateProperty.all(Size(Get.width / 3, Dimens.xlarge-8))), + fixedSize: WidgetStateProperty.all( + Size(Get.width / 3, Dimens.xlarge - 8))), onPressed: () { Get.toNamed(NamedRoute.singleManagePodcast); }, diff --git a/lib/view/podcast/single_manage_podcast.dart b/lib/view/podcast/single_manage_podcast.dart index 21dfdd2..9052d30 100644 --- a/lib/view/podcast/single_manage_podcast.dart +++ b/lib/view/podcast/single_manage_podcast.dart @@ -4,6 +4,7 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:get/get.dart'; +import 'package:numberpicker/numberpicker.dart'; import 'package:tec/component/decrations.dart'; import 'package:tec/component/dimens.dart'; import 'package:tec/component/my_component.dart'; @@ -15,6 +16,7 @@ import 'package:tec/controller/podcast/single_podcast_cotroller.dart'; import 'package:tec/services/pick_file.dart'; import '../../gen/assets.gen.dart'; +// ignore: must_be_immutable class SingleManagePodcast extends StatelessWidget { SinglePodcastController controller = Get.put(SinglePodcastController()); ManagePodcastController managePodcastController = @@ -121,7 +123,7 @@ class SingleManagePodcast extends StatelessWidget { children: [ Text( MyStrings.selectImage, - style: textheme.headline2, + style: textheme.displayMedium, ), const Icon( Icons.add, @@ -201,11 +203,10 @@ class SingleManagePodcast extends StatelessWidget { ), Text( MyStrings.frilance, - style: textheme.headline4, + style: textheme.headlineMedium, ), ], ), - Text( '${managePodcastController.currentHourValue.value}:${managePodcastController.currentMinuteValue.value}:${managePodcastController.currentSecondeValue.value}', style: const TextStyle( @@ -237,9 +238,9 @@ class SingleManagePodcast extends StatelessWidget { const TextStyle(color: SolidColors.lightText), thumbColor: SolidColors.yelowColor, baseBarColor: SolidColors.lightText, - buffered: controller.bufferedValue.value, + buffered: controller.bufferState.value, progressBarColor: SolidColors.selectedPodCast, - progress: controller.progressValue.value, + progress: controller.progressState.value, onSeek: (position) { controller.player.seek(position); @@ -518,12 +519,12 @@ class SingleManagePodcast extends StatelessWidget { padding: EdgeInsets.only(top: Dimens.large - 2), child: ElevatedButton( style: ButtonStyle( - fixedSize: MaterialStateProperty.all( + fixedSize: WidgetStateProperty.all( Size(Get.width / 3, Dimens.xlarge - 8))), onPressed: (() async { await managePodcastController.titlePodcast(); await managePodcastController.filePodcast(); - await managePodcastController.UpdatePodcast(); + await managePodcastController.updatePodcast(); }), child: Text( MyStrings.verification, diff --git a/lib/view/podcast/single_podcast.dart b/lib/view/podcast/single_podcast.dart index 5fab882..2501a05 100644 --- a/lib/view/podcast/single_podcast.dart +++ b/lib/view/podcast/single_podcast.dart @@ -1,8 +1,6 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; - import 'package:get/get.dart'; - import 'package:tec/component/dimens.dart'; import 'package:tec/view/widgets/podcast_widgets.dart'; import 'package:tec/constant/my_colors.dart'; @@ -23,8 +21,6 @@ class PodcastSingle extends StatelessWidget { @override Widget build(BuildContext context) { - print(controller.id); - var textheme = Theme.of(context).textTheme; return SafeArea( child: Scaffold( @@ -72,15 +68,13 @@ class PodcastSingle extends StatelessWidget { ), GestureDetector( onTap: () async { - await controller.player - .stop(); - controller.startProgress(); - controller.progressValue - .value = const Duration(seconds: 0); - controller - .selectedIndex.value = 0; - Get.back(); - }, + await controller.player.stop(); + controller.startProgress(); + controller.progressState.value = + const Duration(seconds: 0); + controller.selectedIndex.value = 0; + Get.back(); + }, child: Icon( Icons.arrow_back, color: SolidColors.lightIcon, @@ -106,28 +100,23 @@ class PodcastSingle extends StatelessWidget { ), //title - Titlee(podcastModel: podcastModel, textheme: textheme), + Titlee(podcastModel: podcastModel, textheme: textheme), //writer - Writer(podcastModel: podcastModel, textheme: textheme), + Writer(podcastModel: podcastModel, textheme: textheme), //file list - FileList(controller: controller, textheme: textheme), + FileList(controller: controller, textheme: textheme), ]), ), ), //player manager - PlayerManager(controller: controller,) + PlayerManager( + controller: controller, + ) ], )), ); } } - - - - - - - diff --git a/lib/view/register/register_intro.dart b/lib/view/register/register_intro.dart index 630b31f..d12a4ce 100644 --- a/lib/view/register/register_intro.dart +++ b/lib/view/register/register_intro.dart @@ -7,7 +7,6 @@ import 'package:tec/constant/my_colors.dart'; import 'package:tec/controller/register_controller.dart'; import 'package:tec/gen/assets.gen.dart'; import 'package:tec/constant/my_strings.dart'; - import 'package:validators/validators.dart'; // ignore: must_be_immutable @@ -28,10 +27,10 @@ class RegisterIntro extends StatelessWidget { children: [ SvgPicture.asset( Assets.images.tcbot.path, - height: Dimens.xlarge+36, + height: Dimens.xlarge + 36, ), Padding( - padding: EdgeInsets.only(top: Dimens.medium), + padding: EdgeInsets.only(top: Dimens.medium), child: RichText( textAlign: TextAlign.center, text: TextSpan( @@ -41,7 +40,7 @@ class RegisterIntro extends StatelessWidget { ), ), Padding( - padding: EdgeInsets.only(top: Dimens.large), + padding: EdgeInsets.only(top: Dimens.large), child: ElevatedButton( onPressed: () { _showEmailBottomSheet(context, size, textTheme); @@ -57,6 +56,7 @@ class RegisterIntro extends StatelessWidget { Future _showEmailBottomSheet( BuildContext context, Size size, TextTheme textTheme) { + // ignore: prefer_typing_uninitialized_variables var isValidate; return showModalBottomSheet( isScrollControlled: true, @@ -72,8 +72,8 @@ class RegisterIntro extends StatelessWidget { decoration: BoxDecoration( color: SolidColors.lightIcon, borderRadius: BorderRadius.only( - topLeft: Radius.circular(Dimens.large-2), - topRight: Radius.circular(Dimens.large-2), + topLeft: Radius.circular(Dimens.large - 2), + topRight: Radius.circular(Dimens.large - 2), ), ), child: Center( @@ -85,12 +85,13 @@ class RegisterIntro extends StatelessWidget { style: textTheme.headlineMedium, ), Padding( - padding: EdgeInsets.all(Dimens.medium+8), + padding: EdgeInsets.all(Dimens.medium + 8), child: TextFormField( controller: registerController.emailTextEditingController, onChanged: (value) { - debugPrint( - value + MyStrings.isEmail + isEmail(value).toString()); + debugPrint(value + + MyStrings.isEmail + + isEmail(value).toString()); isValidate = EmailValidator.validate( registerController.emailTextEditingController.text); }, @@ -106,19 +107,19 @@ class RegisterIntro extends StatelessWidget { onPressed: (() async { if (registerController .emailTextEditingController.text.isEmpty) { - Get.snackbar( - MyStrings.error,MyStrings.enterEmaile); + Get.snackbar(MyStrings.error, MyStrings.enterEmaile); } else { if (isValidate) { registerController.register(); Navigator.pop(context); _activateCodeBottomSheet(context, size, textTheme); } else { - Get.snackbar( MyStrings.error, MyStrings.formatEmailNotCorrect); + Get.snackbar( + MyStrings.error, MyStrings.formatEmailNotCorrect); } } }), - child: Text(MyStrings.continuation), + child: Text(MyStrings.continuation), ), ], )), @@ -140,11 +141,11 @@ class RegisterIntro extends StatelessWidget { bottom: MediaQuery.of(context).viewInsets.bottom), child: Container( height: size.height / 2, - decoration: BoxDecoration( + decoration: BoxDecoration( color: SolidColors.lightIcon, borderRadius: BorderRadius.only( - topLeft: Radius.circular(Dimens.large-2), - topRight: Radius.circular(Dimens.large-2), + topLeft: Radius.circular(Dimens.large - 2), + topRight: Radius.circular(Dimens.large - 2), ), ), child: Center( @@ -156,13 +157,13 @@ class RegisterIntro extends StatelessWidget { style: textTheme.headlineMedium, ), Padding( - padding: EdgeInsets.all(Dimens.medium+8), + padding: EdgeInsets.all(Dimens.medium + 8), child: TextField( controller: registerController .activeCodeTextEditingController, onChanged: (value) { debugPrint(value + - MyStrings.isEmail+ + MyStrings.isEmail + isEmail(value).toString()); }, style: textTheme.headlineSmall, @@ -176,7 +177,7 @@ class RegisterIntro extends StatelessWidget { onPressed: (() { registerController.verify(); }), - child:Text(MyStrings.continuation)) + child: Text(MyStrings.continuation)) ]), ), ), diff --git a/lib/view/splash_screen.dart b/lib/view/splash_screen.dart index 292911a..755c337 100644 --- a/lib/view/splash_screen.dart +++ b/lib/view/splash_screen.dart @@ -3,7 +3,6 @@ import 'package:flutter_spinkit/flutter_spinkit.dart'; import 'package:get/get.dart'; import 'package:tec/component/dimens.dart'; import 'package:tec/gen/assets.gen.dart'; - import 'package:tec/constant/my_colors.dart'; import 'package:tec/route_manager/names.dart'; @@ -18,7 +17,6 @@ class _SplashScreenState extends State { @override void initState() { Future.delayed(const Duration(seconds: 3)).then((value) { - Get.offAndToNamed(NamedRoute.routeMainScreen); }); super.initState(); @@ -31,10 +29,10 @@ class _SplashScreenState extends State { body: Center( child: Column(mainAxisAlignment: MainAxisAlignment.center, children: [ Image.asset(Assets.images.logo.path, height: Dimens.xlarge), - SizedBox( + SizedBox( height: Dimens.large, ), - SpinKitFadingCube( + SpinKitFadingCube( color: SolidColors.primaryColor, size: Dimens.large, ) diff --git a/lib/view/widgets/article_widgets.dart b/lib/view/widgets/article_widgets.dart index c7f8b1f..89c17e2 100644 --- a/lib/view/widgets/article_widgets.dart +++ b/lib/view/widgets/article_widgets.dart @@ -1,6 +1,5 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; import 'package:get/get.dart'; import 'package:tec/component/dimens.dart'; import 'package:tec/component/my_component.dart'; @@ -47,6 +46,7 @@ class ArticleEmptyState extends StatelessWidget { } } +// ignore: must_be_immutable class Cats extends StatelessWidget { Cats( {Key? key, @@ -87,7 +87,7 @@ class Cats extends StatelessWidget { child: Center( child: Text( homeScreenController.tagsList[index].title!, - style: textTheme.headline2, + style: textTheme.displayMedium, ), )), ), @@ -178,14 +178,14 @@ class Similar extends StatelessWidget { Text( singleArticleController .relatedList[index].author!, - style: textheme.subtitle1, + style: textheme.titleMedium, ), Row( children: [ Text( singleArticleController .relatedList[index].view!, - style: textheme.subtitle1, + style: textheme.titleMedium, ), SizedBox( width: Dimens.small, @@ -262,7 +262,7 @@ class Tags extends StatelessWidget { Dimens.small, Dimens.small), child: Text( singleArticleController.tagList[index].title!, - style: textheme.headline2, + style: textheme.displayMedium, )), ), ), diff --git a/lib/view/widgets/main_widget.dart b/lib/view/widgets/main_widget.dart index dc37eca..cf65959 100644 --- a/lib/view/widgets/main_widget.dart +++ b/lib/view/widgets/main_widget.dart @@ -1,6 +1,5 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; import 'package:flutter_spinkit/flutter_spinkit.dart'; import 'package:get/get.dart'; import 'package:tec/component/dimens.dart'; @@ -259,6 +258,13 @@ class Poster extends StatelessWidget { Container( width: size.width / 1.25, height: size.height / 4.2, + foregroundDecoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(Dimens.medium)), + gradient: const LinearGradient( + colors: GradientColors.homePosterCoverGradiant, + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + )), child: CachedNetworkImage( imageUrl: homeScreenController.poster.value.image!, imageBuilder: ((context, imageProvider) => Container( @@ -278,13 +284,6 @@ class Poster extends StatelessWidget { color: SolidColors.greyColor, )), ), - foregroundDecoration: BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(Dimens.medium)), - gradient: const LinearGradient( - colors: GradientColors.homePosterCoverGradiant, - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - )), ), Positioned( bottom: 8, diff --git a/lib/view/widgets/podcast_widgets.dart b/lib/view/widgets/podcast_widgets.dart index 842b3ea..2ddfb24 100644 --- a/lib/view/widgets/podcast_widgets.dart +++ b/lib/view/widgets/podcast_widgets.dart @@ -1,5 +1,3 @@ - - import 'package:audio_video_progress_bar/audio_video_progress_bar.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -22,30 +20,28 @@ class PodcastEmpty extends StatelessWidget { @override Widget build(BuildContext context) { return Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Image.asset( - Assets.images.emptyState.path, - height: Dimens.xlarge + 36, - ), - Padding( - padding: EdgeInsets.only(top: Dimens.medium), - child: RichText( - textAlign: TextAlign.center, - text: TextSpan( - text: MyStrings.podcastEmpty, - style: textTheme.headline4, - )), - ), - ], - ), - ); + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.asset( + Assets.images.emptyState.path, + height: Dimens.xlarge + 36, + ), + Padding( + padding: EdgeInsets.only(top: Dimens.medium), + child: RichText( + textAlign: TextAlign.center, + text: TextSpan( + text: MyStrings.podcastEmpty, + style: textTheme.headlineMedium, + )), + ), + ], + ), + ); } } - - class PlayerManager extends StatelessWidget { const PlayerManager({ Key? key, @@ -57,116 +53,115 @@ class PlayerManager extends StatelessWidget { @override Widget build(BuildContext context) { return Positioned( - bottom: Dimens.small, - right: Dimens.bodyMargin, - left: Dimens.bodyMargin, - child: Container( - height: Get.height / 7, - decoration: MyDecorations.mainGradient, - child: Padding( - padding: EdgeInsets.all(Dimens.small), - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Obx( - () => ProgressBar( - timeLabelTextStyle: const TextStyle(color: Colors.white), - thumbColor: SolidColors.yelowColor, - baseBarColor: SolidColors.lightIcon, - progressBarColor: SolidColors.selectedPodCast, - buffered: controller.bufferedValue.value, - progress: controller.progressValue.value, - total: - controller.player.duration ?? const Duration(seconds: 0), - onSeek: (position) async { - controller.player.seek(position); + bottom: Dimens.small, + right: Dimens.bodyMargin, + left: Dimens.bodyMargin, + child: Container( + height: Get.height / 7, + decoration: MyDecorations.mainGradient, + child: Padding( + padding: EdgeInsets.all(Dimens.small), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Obx( + () => ProgressBar( + timeLabelTextStyle: const TextStyle(color: Colors.white), + thumbColor: SolidColors.yelowColor, + baseBarColor: SolidColors.lightIcon, + progressBarColor: SolidColors.selectedPodCast, + buffered: controller.bufferState.value, + progress: controller.progressState.value, + total: controller.player.duration ?? + const Duration(seconds: 0), + onSeek: (position) async { + controller.player.seek(position); - if (controller.player.playing) { - controller.startProgress(); - } else if (position <= const Duration(seconds: 0)) { - await controller.player.seekToNext(); - controller.currentFileIndex.value = - controller.player.currentIndex!; - controller.timerCheck(); - } - }, - ), - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - GestureDetector( - onTap: () async { - await controller.player.seekToNext(); - controller.currentFileIndex.value = - controller.player.currentIndex!; - controller.timerCheck(); - }, - child: const Icon( - Icons.skip_next, - color: SolidColors.lightIcon, - ), - ), - GestureDetector( - onTap: () { - controller.player.playing - ? controller.timer!.cancel() - : controller.startProgress(); + if (controller.player.playing) { + controller.startProgress(); + } else if (position <= const Duration(seconds: 0)) { + await controller.player.seekToNext(); + controller.currentFileIndex.value = + controller.player.currentIndex!; + controller.timerCheck(); + } + }, + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + GestureDetector( + onTap: () async { + await controller.player.seekToNext(); + controller.currentFileIndex.value = + controller.player.currentIndex!; + controller.timerCheck(); + }, + child: const Icon( + Icons.skip_next, + color: SolidColors.lightIcon, + ), + ), + GestureDetector( + onTap: () { + controller.player.playing + ? controller.timer!.cancel() + : controller.startProgress(); - controller.player.playing - ? controller.player.pause() - : controller.player.play(); + controller.player.playing + ? controller.player.pause() + : controller.player.play(); - controller.playState.value = controller.player.playing; - controller.currentFileIndex.value = - controller.player.currentIndex!; - }, - child: Obx( - () => Icon( - controller.playState.value - ? Icons.pause_circle_filled - : Icons.play_circle_fill, - color: SolidColors.lightIcon, - size: Dimens.large + 16, - ), - ), - ), - GestureDetector( - onTap: () async { - await controller.player.seekToPrevious(); - controller.currentFileIndex.value = - controller.player.currentIndex!; - controller.timerCheck(); - }, - child: const Icon( - Icons.skip_previous, - color: SolidColors.lightIcon, - ), + controller.playState.value = controller.player.playing; + controller.currentFileIndex.value = + controller.player.currentIndex!; + }, + child: Obx( + () => Icon( + controller.playState.value + ? Icons.pause_circle_filled + : Icons.play_circle_fill, + color: SolidColors.lightIcon, + size: Dimens.large + 16, + ), + ), + ), + GestureDetector( + onTap: () async { + await controller.player.seekToPrevious(); + controller.currentFileIndex.value = + controller.player.currentIndex!; + controller.timerCheck(); + }, + child: const Icon( + Icons.skip_previous, + color: SolidColors.lightIcon, + ), + ), + const SizedBox(), + Obx( + () => GestureDetector( + onTap: () { + controller.setLoopMode(); + }, + child: Icon( + Icons.repeat, + color: controller.isLoopAll.value + ? SolidColors.seeMore + : SolidColors.lightIcon, + ), + ), + ), + ], + ) + ], ), - const SizedBox(), - Obx( - () => GestureDetector( - onTap: () { - controller.setLoopMode(); - }, - child: Icon( - Icons.repeat, - color: controller.isLoopAll.value - ? SolidColors.seeMore - : SolidColors.lightIcon, - ), - ), - ), - ], - ) - ], - ), - ), - )); + ), + )); } } - class Titlee extends StatelessWidget { const Titlee({ Key? key, @@ -180,21 +175,20 @@ class Titlee extends StatelessWidget { @override Widget build(BuildContext context) { return Padding( - padding: EdgeInsets.all(Dimens.small), - child: Align( - alignment: Alignment.centerRight, - child: Text( - podcastModel.title!, - maxLines: 2, - textAlign: TextAlign.start, - style: textheme.titleLarge, + padding: EdgeInsets.all(Dimens.small), + child: Align( + alignment: Alignment.centerRight, + child: Text( + podcastModel.title!, + maxLines: 2, + textAlign: TextAlign.start, + style: textheme.titleLarge, + ), ), - ), - ); + ); } } - class FileList extends StatelessWidget { const FileList({ Key? key, @@ -208,79 +202,80 @@ class FileList extends StatelessWidget { @override Widget build(BuildContext context) { return Padding( - padding: EdgeInsets.all(Dimens.small), - child: Obx( - () => ListView.builder( - itemCount: controller.podcastFileList.length, - shrinkWrap: true, - itemBuilder: ((context, index) { - return index < controller.podcastFileList.length - 1 - ? Padding( - padding: EdgeInsets.all(Dimens.small), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Row( - children: [ - ImageIcon( - Image.asset(Assets.icons.microphon.path).image, - color: SolidColors.seeMore, - ), - SizedBox( - width: Dimens.small, - ), - SizedBox( - width: Get.width / 1.5, - child: Text( - controller.podcastFileList[index].title!, - style: textheme.headline4, - ), - ), - ], - ), - Text(controller.podcastFileList[index].lenght! + ":00") - ], - ), - ) - : Column( - children: [ - Padding( - padding: EdgeInsets.all(Dimens.small), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Row( - children: [ - ImageIcon( - Image.asset(Assets.icons.microphon.path) - .image, - color: SolidColors.seeMore, - ), - const SizedBox( - width: 8, - ), - SizedBox( - width: Get.width / 1.5, - child: Text( - controller.podcastFileList[index].title!, - style: textheme.headline4, - ), - ), - ], - ), - Text(controller.podcastFileList[index].lenght! + - ":00") - ], - ), - ), - SizedBox( - height: Get.height / 1.4, - ) - ], - ); - })), - ), - ); + padding: EdgeInsets.all(Dimens.small), + child: Obx( + () => ListView.builder( + itemCount: controller.podcastFileList.length, + shrinkWrap: true, + itemBuilder: ((context, index) { + return index < controller.podcastFileList.length - 1 + ? Padding( + padding: EdgeInsets.all(Dimens.small), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + ImageIcon( + Image.asset(Assets.icons.microphon.path).image, + color: SolidColors.seeMore, + ), + SizedBox( + width: Dimens.small, + ), + SizedBox( + width: Get.width / 1.5, + child: Text( + controller.podcastFileList[index].title!, + style: textheme.headlineMedium, + ), + ), + ], + ), + Text( + "${controller.podcastFileList[index].lenght!}:00") + ], + ), + ) + : Column( + children: [ + Padding( + padding: EdgeInsets.all(Dimens.small), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + ImageIcon( + Image.asset(Assets.icons.microphon.path) + .image, + color: SolidColors.seeMore, + ), + const SizedBox( + width: 8, + ), + SizedBox( + width: Get.width / 1.5, + child: Text( + controller.podcastFileList[index].title!, + style: textheme.headlineMedium, + ), + ), + ], + ), + Text( + "${controller.podcastFileList[index].lenght!}:00") + ], + ), + ), + SizedBox( + height: Get.height / 1.4, + ) + ], + ); + })), + ), + ); } } @@ -297,25 +292,25 @@ class Writer extends StatelessWidget { @override Widget build(BuildContext context) { return Padding( - padding: EdgeInsets.all(Dimens.small), - child: Row( - children: [ - Image( - image: Image.asset(Assets.images.profileAvatar.path).image, - height: Dimens.xlarge - 14, - ), - SizedBox( - width: Dimens.medium, - ), - Text( - podcastModel.publisher!, - style: textheme.headline4, + padding: EdgeInsets.all(Dimens.small), + child: Row( + children: [ + Image( + image: Image.asset(Assets.images.profileAvatar.path).image, + height: Dimens.xlarge - 14, + ), + SizedBox( + width: Dimens.medium, ), - SizedBox( - width: Dimens.medium, - ) - ], - ), - ); + Text( + podcastModel.publisher!, + style: textheme.headlineMedium, + ), + SizedBox( + width: Dimens.medium, + ) + ], + ), + ); } -} \ No newline at end of file +} diff --git a/pubspec.lock b/pubspec.lock index e3cb1bc..5da8322 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,242 +1,347 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + args: + dependency: transitive + description: + name: args + sha256: "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a" + url: "https://pub.dev" + source: hosted + version: "2.5.0" async: dependency: transitive description: name: async - url: "https://pub.dartlang.org" + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.dev" source: hosted - version: "2.9.0" + version: "2.11.0" audio_session: dependency: transitive description: name: audio_session - url: "https://pub.dartlang.org" + sha256: "343e83bc7809fbda2591a49e525d6b63213ade10c76f15813be9aed6657b3261" + url: "https://pub.dev" source: hosted - version: "0.1.13" + version: "0.1.21" audio_video_progress_bar: dependency: "direct main" description: name: audio_video_progress_bar - url: "https://pub.dartlang.org" + sha256: "552b1f73c56c4c88407999e0a8507176f60c56de3e6d63bc20a0eab48467d4c9" + url: "https://pub.dev" source: hosted - version: "0.11.0" + version: "2.0.3" boolean_selector: dependency: transitive description: name: boolean_selector - url: "https://pub.dartlang.org" + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" cached_network_image: dependency: "direct main" description: name: cached_network_image - url: "https://pub.dartlang.org" + sha256: "7c1183e361e5c8b0a0f21a28401eecdbde252441106a9816400dd4c2b2424916" + url: "https://pub.dev" source: hosted - version: "3.2.3" + version: "3.4.1" cached_network_image_platform_interface: dependency: transitive description: name: cached_network_image_platform_interface - url: "https://pub.dartlang.org" + sha256: "35814b016e37fbdc91f7ae18c8caf49ba5c88501813f73ce8a07027a395e2829" + url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "4.1.1" cached_network_image_web: dependency: transitive description: name: cached_network_image_web - url: "https://pub.dartlang.org" + sha256: "980842f4e8e2535b8dbd3d5ca0b1f0ba66bf61d14cc3a17a9b4788a3685ba062" + url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "1.3.1" characters: dependency: transitive description: name: characters - url: "https://pub.dartlang.org" + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.3.0" chewie: dependency: transitive description: name: chewie - url: "https://pub.dartlang.org" + sha256: "335df378c025588aef400c704bd71f0daea479d4cd57c471c88c056c1144e7cd" + url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.8.5" clock: dependency: transitive description: name: clock - url: "https://pub.dartlang.org" + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" source: hosted version: "1.1.1" collection: dependency: transitive description: name: collection - url: "https://pub.dartlang.org" + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + url: "https://pub.dev" source: hosted - version: "1.16.0" + version: "1.18.0" cross_file: dependency: transitive description: name: cross_file - url: "https://pub.dartlang.org" + sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" + url: "https://pub.dev" source: hosted - version: "0.3.3+4" + version: "0.3.4+2" crypto: dependency: transitive description: name: crypto - url: "https://pub.dartlang.org" + sha256: ec30d999af904f33454ba22ed9a86162b35e52b44ac4807d1d93c288041d7d27 + url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.0.5" csslib: dependency: transitive description: name: csslib - url: "https://pub.dartlang.org" + sha256: "706b5707578e0c1b4b7550f64078f0a0f19dec3f50a178ffae7006b0a9ca58fb" + url: "https://pub.dev" source: hosted - version: "0.17.2" + version: "1.0.0" cupertino_icons: dependency: "direct main" description: name: cupertino_icons - url: "https://pub.dartlang.org" + sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 + url: "https://pub.dev" source: hosted - version: "1.0.5" + version: "1.0.8" + dbus: + dependency: transitive + description: + name: dbus + sha256: "365c771ac3b0e58845f39ec6deebc76e3276aa9922b0cc60840712094d9047ac" + url: "https://pub.dev" + source: hosted + version: "0.7.10" dio: dependency: "direct main" description: name: dio - url: "https://pub.dartlang.org" + sha256: "5598aa796bbf4699afd5c67c0f5f6e2ed542afc956884b9cd58c306966efc260" + url: "https://pub.dev" + source: hosted + version: "5.7.0" + dio_web_adapter: + dependency: transitive + description: + name: dio_web_adapter + sha256: "33259a9276d6cea88774a0000cfae0d861003497755969c92faa223108620dc8" + url: "https://pub.dev" source: hosted - version: "4.0.6" + version: "2.0.0" email_validator: dependency: "direct main" description: name: email_validator - url: "https://pub.dartlang.org" + sha256: b19aa5d92fdd76fbc65112060c94d45ba855105a28bb6e462de7ff03b12fa1fb + url: "https://pub.dev" source: hosted - version: "2.1.17" + version: "3.0.0" fake_async: dependency: transitive description: name: fake_async - url: "https://pub.dartlang.org" + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" source: hosted version: "1.3.1" ffi: dependency: transitive description: name: ffi - url: "https://pub.dartlang.org" + sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" + url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.1.3" file: dependency: transitive description: name: file - url: "https://pub.dartlang.org" + sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" + url: "https://pub.dev" source: hosted - version: "6.1.4" + version: "7.0.0" file_picker: dependency: "direct main" description: name: file_picker - url: "https://pub.dartlang.org" + sha256: "167bb619cdddaa10ef2907609feb8a79c16dfa479d3afaf960f8e223f754bf12" + url: "https://pub.dev" source: hosted - version: "5.2.5" + version: "8.1.2" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + url: "https://pub.dev" + source: hosted + version: "1.1.0" flex_color_picker: dependency: transitive description: name: flex_color_picker - url: "https://pub.dartlang.org" + sha256: "809af4ec82ede3b140ed0219b97d548de99e47aa4b99b14a10f705a2dbbcba5e" + url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.5.1" flex_seed_scheme: dependency: transitive description: name: flex_seed_scheme - url: "https://pub.dartlang.org" + sha256: "7d97ba5c20f0e5cb1e3e2c17c865e1f797d129de31fc1f75d2dcce9470d6373c" + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "3.3.0" flutter: dependency: "direct main" description: flutter source: sdk version: "0.0.0" - flutter_blurhash: - dependency: transitive - description: - name: flutter_blurhash - url: "https://pub.dartlang.org" - source: hosted - version: "0.7.0" flutter_cache_manager: dependency: transitive description: name: flutter_cache_manager - url: "https://pub.dartlang.org" + sha256: "400b6592f16a4409a7f2bb929a9a7e38c72cceb8ffb99ee57bbf2cb2cecf8386" + url: "https://pub.dev" source: hosted - version: "3.3.0" + version: "3.4.1" flutter_inappwebview: dependency: transitive description: name: flutter_inappwebview - url: "https://pub.dartlang.org" + sha256: "3e9a443a18ecef966fb930c3a76ca5ab6a7aafc0c7b5e14a4a850cf107b09959" + url: "https://pub.dev" source: hosted - version: "5.7.2+3" + version: "6.0.0" + flutter_inappwebview_android: + dependency: transitive + description: + name: flutter_inappwebview_android + sha256: d247f6ed417f1f8c364612fa05a2ecba7f775c8d0c044c1d3b9ee33a6515c421 + url: "https://pub.dev" + source: hosted + version: "1.0.13" + flutter_inappwebview_internal_annotations: + dependency: transitive + description: + name: flutter_inappwebview_internal_annotations + sha256: "5f80fd30e208ddded7dbbcd0d569e7995f9f63d45ea3f548d8dd4c0b473fb4c8" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + flutter_inappwebview_ios: + dependency: transitive + description: + name: flutter_inappwebview_ios + sha256: f363577208b97b10b319cd0c428555cd8493e88b468019a8c5635a0e4312bd0f + url: "https://pub.dev" + source: hosted + version: "1.0.13" + flutter_inappwebview_macos: + dependency: transitive + description: + name: flutter_inappwebview_macos + sha256: b55b9e506c549ce88e26580351d2c71d54f4825901666bd6cfa4be9415bb2636 + url: "https://pub.dev" + source: hosted + version: "1.0.11" + flutter_inappwebview_platform_interface: + dependency: transitive + description: + name: flutter_inappwebview_platform_interface + sha256: "545fd4c25a07d2775f7d5af05a979b2cac4fbf79393b0a7f5d33ba39ba4f6187" + url: "https://pub.dev" + source: hosted + version: "1.0.10" + flutter_inappwebview_web: + dependency: transitive + description: + name: flutter_inappwebview_web + sha256: d8c680abfb6fec71609a700199635d38a744df0febd5544c5a020bd73de8ee07 + url: "https://pub.dev" + source: hosted + version: "1.0.8" flutter_keyboard_visibility: dependency: transitive description: name: flutter_keyboard_visibility - url: "https://pub.dartlang.org" + sha256: "98664be7be0e3ffca00de50f7f6a287ab62c763fc8c762e0a21584584a3ff4f8" + url: "https://pub.dev" source: hosted - version: "5.4.0" + version: "6.0.0" flutter_keyboard_visibility_linux: dependency: transitive description: name: flutter_keyboard_visibility_linux - url: "https://pub.dartlang.org" + sha256: "6fba7cd9bb033b6ddd8c2beb4c99ad02d728f1e6e6d9b9446667398b2ac39f08" + url: "https://pub.dev" source: hosted version: "1.0.0" flutter_keyboard_visibility_macos: dependency: transitive description: name: flutter_keyboard_visibility_macos - url: "https://pub.dartlang.org" + sha256: c5c49b16fff453dfdafdc16f26bdd8fb8d55812a1d50b0ce25fc8d9f2e53d086 + url: "https://pub.dev" source: hosted version: "1.0.0" flutter_keyboard_visibility_platform_interface: dependency: transitive description: name: flutter_keyboard_visibility_platform_interface - url: "https://pub.dartlang.org" + sha256: e43a89845873f7be10cb3884345ceb9aebf00a659f479d1c8f4293fcb37022a4 + url: "https://pub.dev" source: hosted version: "2.0.0" flutter_keyboard_visibility_web: dependency: transitive description: name: flutter_keyboard_visibility_web - url: "https://pub.dartlang.org" + sha256: d3771a2e752880c79203f8d80658401d0c998e4183edca05a149f5098ce6e3d1 + url: "https://pub.dev" source: hosted version: "2.0.0" flutter_keyboard_visibility_windows: dependency: transitive description: name: flutter_keyboard_visibility_windows - url: "https://pub.dartlang.org" + sha256: fc4b0f0b6be9b93ae527f3d527fb56ee2d918cd88bbca438c478af7bcfd0ef73 + url: "https://pub.dev" source: hosted version: "1.0.0" flutter_lints: dependency: "direct dev" description: name: flutter_lints - url: "https://pub.dartlang.org" + sha256: "3f41d009ba7172d5ff9be5f6e6e6abb4300e263aab8866d2a0842ed2a70f8f0c" + url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "4.0.0" flutter_localizations: dependency: "direct main" description: flutter @@ -246,23 +351,26 @@ packages: dependency: transitive description: name: flutter_plugin_android_lifecycle - url: "https://pub.dartlang.org" + sha256: "9ee02950848f61c4129af3d6ec84a1cfc0e47931abc746b03e7a3bc3e8ff6eda" + url: "https://pub.dev" source: hosted - version: "2.0.8" + version: "2.0.22" flutter_spinkit: dependency: "direct main" description: name: flutter_spinkit - url: "https://pub.dartlang.org" + sha256: d2696eed13732831414595b98863260e33e8882fc069ee80ec35d4ac9ddb0472 + url: "https://pub.dev" source: hosted - version: "5.1.0" + version: "5.2.1" flutter_svg: dependency: "direct main" description: name: flutter_svg - url: "https://pub.dartlang.org" + sha256: "7b4ca6cf3304575fe9c8ec64813c8d02ee41d2afe60bcfe0678bcb5375d596a2" + url: "https://pub.dev" source: hosted - version: "1.1.6" + version: "2.0.10+1" flutter_test: dependency: "direct dev" description: flutter @@ -277,380 +385,434 @@ packages: dependency: "direct main" description: name: flutter_widget_from_html - url: "https://pub.dartlang.org" + sha256: "9e2a6201c4d2eb910b6b3ebb2a9f5c490fc61c9a1aa35eafdde38f0fc659cf4c" + url: "https://pub.dev" source: hosted - version: "0.8.5" + version: "0.15.2" flutter_widget_from_html_core: dependency: transitive description: name: flutter_widget_from_html_core - url: "https://pub.dartlang.org" + sha256: b1048fd119a14762e2361bd057da608148a895477846d6149109b2151d2f7abf + url: "https://pub.dev" source: hosted - version: "0.8.5+3" + version: "0.15.2" fwfh_cached_network_image: dependency: transitive description: name: fwfh_cached_network_image - url: "https://pub.dartlang.org" + sha256: "8e44226801bfba27930673953afce8af44da7e92573be93f60385d9865a089dd" + url: "https://pub.dev" source: hosted - version: "0.7.0+4" + version: "0.14.3" fwfh_chewie: dependency: transitive description: name: fwfh_chewie - url: "https://pub.dartlang.org" + sha256: "37bde9cedfb6dc5546176f7f0c56af1e814966cb33ec58f16c9565ed93ccb704" + url: "https://pub.dev" source: hosted - version: "0.7.1+1" + version: "0.14.8" fwfh_just_audio: dependency: transitive description: name: fwfh_just_audio - url: "https://pub.dartlang.org" + sha256: "38dc2c55803bd3cef33042c473e0c40b891ad4548078424641a32032f6a1245f" + url: "https://pub.dev" source: hosted - version: "0.6.2+2" - fwfh_selectable_text: - dependency: transitive - description: - name: fwfh_selectable_text - url: "https://pub.dartlang.org" - source: hosted - version: "0.8.3+1" + version: "0.15.2" fwfh_svg: dependency: transitive description: name: fwfh_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.7.2+1" - fwfh_text_style: - dependency: transitive - description: - name: fwfh_text_style - url: "https://pub.dartlang.org" + sha256: "550b1014d12b5528d8bdb6e3b44b58721f3fb1f65d7a852d1623a817008bdfc4" + url: "https://pub.dev" source: hosted - version: "2.22.08+1" + version: "0.8.3" fwfh_url_launcher: dependency: transitive description: name: fwfh_url_launcher - url: "https://pub.dartlang.org" + sha256: b9f5d55a5ae2c2c07243ba33f7ba49ac9544bdb2f4c16d8139df9ccbebe3449c + url: "https://pub.dev" source: hosted - version: "0.6.1+3" + version: "0.9.1" fwfh_webview: dependency: transitive description: name: fwfh_webview - url: "https://pub.dartlang.org" + sha256: f67890bc0d6278da98bd197469ae9511c859f7db327e92299fe0ea0cf46c4057 + url: "https://pub.dev" source: hosted - version: "0.6.2+5" + version: "0.15.2" get: dependency: "direct main" description: name: get - url: "https://pub.dartlang.org" + sha256: e4e7335ede17452b391ed3b2ede016545706c01a02292a6c97619705e7d2a85e + url: "https://pub.dev" source: hosted - version: "4.6.5" + version: "4.6.6" get_storage: dependency: "direct main" description: name: get_storage - url: "https://pub.dartlang.org" + sha256: "39db1fffe779d0c22b3a744376e86febe4ade43bf65e06eab5af707dc84185a2" + url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "2.1.1" html: dependency: transitive description: name: html - url: "https://pub.dartlang.org" + sha256: "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a" + url: "https://pub.dev" source: hosted - version: "0.15.1" + version: "0.15.4" html_editor_enhanced: dependency: "direct main" description: name: html_editor_enhanced - url: "https://pub.dartlang.org" + sha256: "5ae6cd965cca77f7186efccc47ca353799e831b31bd71438687a56131bbcd3a5" + url: "https://pub.dev" source: hosted - version: "2.5.1" + version: "2.6.0" http: dependency: transitive description: name: http - url: "https://pub.dartlang.org" + sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010 + url: "https://pub.dev" source: hosted - version: "0.13.5" + version: "1.2.2" http_parser: dependency: transitive description: name: http_parser - url: "https://pub.dartlang.org" + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" source: hosted version: "4.0.2" infinite_listview: dependency: transitive description: name: infinite_listview - url: "https://pub.dartlang.org" + sha256: f6062c1720eb59be553dfa6b89813d3e8dd2f054538445aaa5edaddfa5195ce6 + url: "https://pub.dev" source: hosted version: "1.1.0" intl: dependency: transitive description: name: intl - url: "https://pub.dartlang.org" + sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf + url: "https://pub.dev" source: hosted - version: "0.17.0" + version: "0.19.0" js: dependency: transitive description: name: js - url: "https://pub.dartlang.org" + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + url: "https://pub.dev" source: hosted - version: "0.6.4" + version: "0.6.7" just_audio: dependency: "direct main" description: name: just_audio - url: "https://pub.dartlang.org" + sha256: d8e8aaf417d33e345299c17f6457f72bd4ba0c549dc34607abb5183a354edc4d + url: "https://pub.dev" source: hosted - version: "0.9.31" + version: "0.9.40" just_audio_platform_interface: dependency: transitive description: name: just_audio_platform_interface - url: "https://pub.dartlang.org" + sha256: "0243828cce503c8366cc2090cefb2b3c871aa8ed2f520670d76fd47aa1ab2790" + url: "https://pub.dev" source: hosted - version: "4.2.0" + version: "4.3.0" just_audio_web: dependency: transitive description: name: just_audio_web - url: "https://pub.dartlang.org" + sha256: b163878529d9b028c53a6972fcd58cae2405bcd11cbfcea620b6fb9f151429d6 + url: "https://pub.dev" + source: hosted + version: "0.4.12" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" + url: "https://pub.dev" + source: hosted + version: "10.0.5" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" + url: "https://pub.dev" source: hosted - version: "0.4.7" + version: "3.0.5" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev" + source: hosted + version: "3.0.1" lints: dependency: transitive description: name: lints - url: "https://pub.dartlang.org" + sha256: "976c774dd944a42e83e2467f4cc670daef7eed6295b10b36ae8c85bcbf828235" + url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "4.0.0" + logging: + dependency: transitive + description: + name: logging + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + url: "https://pub.dev" + source: hosted + version: "1.2.0" matcher: dependency: transitive description: name: matcher - url: "https://pub.dartlang.org" + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + url: "https://pub.dev" source: hosted - version: "0.12.12" + version: "0.12.16+1" material_color_utilities: dependency: transitive description: name: material_color_utilities - url: "https://pub.dartlang.org" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + url: "https://pub.dev" source: hosted - version: "0.1.5" + version: "0.11.1" meta: dependency: transitive description: name: meta - url: "https://pub.dartlang.org" + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + url: "https://pub.dev" source: hosted - version: "1.8.0" + version: "1.15.0" mime: dependency: transitive description: name: mime - url: "https://pub.dartlang.org" + sha256: "801fd0b26f14a4a58ccb09d5892c3fbdeff209594300a542492cf13fba9d247a" + url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "1.0.6" nested: dependency: transitive description: name: nested - url: "https://pub.dartlang.org" + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" source: hosted version: "1.0.0" numberpicker: - dependency: transitive + dependency: "direct main" description: name: numberpicker - url: "https://pub.dartlang.org" + sha256: "4c129154944b0f6b133e693f8749c3f8bfb67c4d07ef9dcab48b595c22d1f156" + url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" octo_image: dependency: transitive description: name: octo_image - url: "https://pub.dartlang.org" + sha256: "34faa6639a78c7e3cbe79be6f9f96535867e879748ade7d17c9b1ae7536293bd" + url: "https://pub.dev" source: hosted - version: "1.0.2" - path: + version: "2.1.0" + package_info_plus: dependency: transitive description: - name: path - url: "https://pub.dartlang.org" + name: package_info_plus + sha256: a75164ade98cb7d24cfd0a13c6408927c6b217fa60dee5a7ff5c116a58f28918 + url: "https://pub.dev" source: hosted - version: "1.8.2" - path_drawing: + version: "8.0.2" + package_info_plus_platform_interface: dependency: transitive description: - name: path_drawing - url: "https://pub.dartlang.org" + name: package_info_plus_platform_interface + sha256: ac1f4a4847f1ade8e6a87d1f39f5d7c67490738642e2542f559ec38c37489a66 + url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "3.0.1" + path: + dependency: transitive + description: + name: path + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + url: "https://pub.dev" + source: hosted + version: "1.9.0" path_parsing: dependency: transitive description: name: path_parsing - url: "https://pub.dartlang.org" + sha256: e3e67b1629e6f7e8100b367d3db6ba6af4b1f0bb80f64db18ef1fbabd2fa9ccf + url: "https://pub.dev" source: hosted version: "1.0.1" path_provider: dependency: transitive description: name: path_provider - url: "https://pub.dartlang.org" + sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378 + url: "https://pub.dev" source: hosted - version: "2.0.13" + version: "2.1.4" path_provider_android: dependency: transitive description: name: path_provider_android - url: "https://pub.dartlang.org" + sha256: "6f01f8e37ec30b07bc424b4deabac37cacb1bc7e2e515ad74486039918a37eb7" + url: "https://pub.dev" source: hosted - version: "2.0.23" + version: "2.2.10" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - url: "https://pub.dartlang.org" + sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16 + url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.4.0" path_provider_linux: dependency: transitive description: name: path_provider_linux - url: "https://pub.dartlang.org" + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" source: hosted - version: "2.1.9" + version: "2.2.1" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface - url: "https://pub.dartlang.org" + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" source: hosted - version: "2.0.6" + version: "2.1.2" path_provider_windows: dependency: transitive description: name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.4" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 + url: "https://pub.dev" source: hosted - version: "1.11.1" + version: "2.3.0" percent_indicator: dependency: "direct main" description: name: percent_indicator - url: "https://pub.dartlang.org" + sha256: c37099ad833a883c9d71782321cb65c3a848c21b6939b6185f0ff6640d05814c + url: "https://pub.dev" source: hosted - version: "4.2.2" + version: "4.2.3" petitparser: dependency: transitive description: name: petitparser - url: "https://pub.dartlang.org" + sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 + url: "https://pub.dev" source: hosted - version: "5.1.0" + version: "6.0.2" platform: dependency: transitive description: name: platform - url: "https://pub.dartlang.org" + sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" + url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.1.5" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface - url: "https://pub.dartlang.org" + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.1.8" pointer_interceptor: dependency: transitive description: name: pointer_interceptor - url: "https://pub.dartlang.org" + sha256: "57210410680379aea8b1b7ed6ae0c3ad349bfd56fe845b8ea934a53344b9d523" + url: "https://pub.dev" source: hosted - version: "0.9.3+4" - process: + version: "0.10.1+2" + pointer_interceptor_ios: dependency: transitive description: - name: process - url: "https://pub.dartlang.org" + name: pointer_interceptor_ios + sha256: a6906772b3205b42c44614fcea28f818b1e5fdad73a4ca742a7bd49818d9c917 + url: "https://pub.dev" source: hosted - version: "4.2.4" + version: "0.10.1" + pointer_interceptor_platform_interface: + dependency: transitive + description: + name: pointer_interceptor_platform_interface + sha256: "0597b0560e14354baeb23f8375cd612e8bd4841bf8306ecb71fcd0bb78552506" + url: "https://pub.dev" + source: hosted + version: "0.10.0+1" + pointer_interceptor_web: + dependency: transitive + description: + name: pointer_interceptor_web + sha256: "7a7087782110f8c1827170660b09f8aa893e0e9a61431dbbe2ac3fc482e8c044" + url: "https://pub.dev" + source: hosted + version: "0.10.2+1" provider: dependency: transitive description: name: provider - url: "https://pub.dartlang.org" + sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c + url: "https://pub.dev" source: hosted - version: "6.0.5" + version: "6.1.2" rxdart: dependency: transitive description: name: rxdart - url: "https://pub.dartlang.org" + sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" + url: "https://pub.dev" source: hosted - version: "0.27.7" + version: "0.28.0" share_plus: dependency: "direct main" description: name: share_plus - url: "https://pub.dartlang.org" + sha256: "468c43f285207c84bcabf5737f33b914ceb8eb38398b91e5e3ad1698d1b72a52" + url: "https://pub.dev" source: hosted - version: "4.5.3" - share_plus_linux: - dependency: transitive - description: - name: share_plus_linux - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - share_plus_macos: - dependency: transitive - description: - name: share_plus_macos - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" + version: "10.0.2" share_plus_platform_interface: dependency: transitive description: name: share_plus_platform_interface - url: "https://pub.dartlang.org" + sha256: "6ababf341050edff57da8b6990f11f4e99eaba837865e2e6defe16d039619db5" + url: "https://pub.dev" source: hosted - version: "3.2.0" - share_plus_web: - dependency: transitive - description: - name: share_plus_web - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" - share_plus_windows: - dependency: transitive - description: - name: share_plus_windows - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" + version: "5.0.0" sky_engine: dependency: transitive description: flutter @@ -660,282 +822,346 @@ packages: dependency: transitive description: name: source_span - url: "https://pub.dartlang.org" + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://pub.dev" source: hosted - version: "1.9.0" + version: "1.10.0" + sprintf: + dependency: transitive + description: + name: sprintf + sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" + url: "https://pub.dev" + source: hosted + version: "7.0.0" sqflite: dependency: transitive description: name: sqflite - url: "https://pub.dartlang.org" + sha256: a43e5a27235518c03ca238e7b4732cf35eabe863a369ceba6cbefa537a66f16d + url: "https://pub.dev" source: hosted - version: "2.2.4+1" + version: "2.3.3+1" sqflite_common: dependency: transitive description: name: sqflite_common - url: "https://pub.dartlang.org" + sha256: "4058172e418eb7e7f2058dcb7657d451a8fc264afa0dea4dbd0f304a57131611" + url: "https://pub.dev" source: hosted - version: "2.4.2+2" + version: "2.5.4+3" stack_trace: dependency: transitive description: name: stack_trace - url: "https://pub.dartlang.org" + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.11.1" stream_channel: dependency: transitive description: name: stream_channel - url: "https://pub.dartlang.org" + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.2" string_scanner: dependency: transitive description: name: string_scanner - url: "https://pub.dartlang.org" + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.2.0" synchronized: dependency: transitive description: name: synchronized - url: "https://pub.dartlang.org" + sha256: "51b08572b9f091f8c3eb4d9d4be253f196ff0075d5ec9b10a884026d5b55d7bc" + url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.3.0+2" term_glyph: dependency: transitive description: name: term_glyph - url: "https://pub.dartlang.org" + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" source: hosted version: "1.2.1" test_api: dependency: transitive description: name: test_api - url: "https://pub.dartlang.org" + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" + url: "https://pub.dev" source: hosted - version: "0.4.12" + version: "0.7.2" typed_data: dependency: transitive description: name: typed_data - url: "https://pub.dartlang.org" + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.3.2" url_launcher: dependency: "direct main" description: name: url_launcher - url: "https://pub.dartlang.org" + sha256: "21b704ce5fa560ea9f3b525b43601c678728ba46725bab9b01187b4831377ed3" + url: "https://pub.dev" source: hosted - version: "6.1.10" + version: "6.3.0" url_launcher_android: dependency: transitive description: name: url_launcher_android - url: "https://pub.dartlang.org" + sha256: e35a698ac302dd68e41f73250bd9517fe3ab5fa4f18fe4647a0872db61bacbab + url: "https://pub.dev" source: hosted - version: "6.0.24" + version: "6.3.10" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - url: "https://pub.dartlang.org" + sha256: e43b677296fadce447e987a2f519dcf5f6d1e527dc35d01ffab4fff5b8a7063e + url: "https://pub.dev" source: hosted - version: "6.1.1" + version: "6.3.1" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - url: "https://pub.dartlang.org" + sha256: e2b9622b4007f97f504cd64c0128309dfb978ae66adbe944125ed9e1750f06af + url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.2.0" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - url: "https://pub.dartlang.org" + sha256: "9a1a42d5d2d95400c795b2914c36fdcb525870c752569438e4ebb09a2b5d90de" + url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.2.0" url_launcher_platform_interface: dependency: transitive description: name: url_launcher_platform_interface - url: "https://pub.dartlang.org" + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" + url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.3.2" url_launcher_web: dependency: transitive description: name: url_launcher_web - url: "https://pub.dartlang.org" + sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e" + url: "https://pub.dev" source: hosted - version: "2.0.15" + version: "2.3.3" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - url: "https://pub.dartlang.org" + sha256: "49c10f879746271804767cb45551ec5592cdab00ee105c06dddde1a98f73b185" + url: "https://pub.dev" source: hosted - version: "3.0.4" + version: "3.1.2" uuid: dependency: transitive description: name: uuid - url: "https://pub.dartlang.org" + sha256: f33d6bb662f0e4f79dcd7ada2e6170f3b3a2530c28fc41f49a411ddedd576a77 + url: "https://pub.dev" source: hosted - version: "3.0.7" + version: "4.5.0" validators: dependency: "direct main" description: name: validators - url: "https://pub.dartlang.org" + sha256: "884515951f831a9c669a41ed6c4d3c61c2a0e8ec6bca761a4480b28e99cecf5d" + url: "https://pub.dev" source: hosted version: "3.0.0" + vector_graphics: + dependency: transitive + description: + name: vector_graphics + sha256: "32c3c684e02f9bc0afb0ae0aa653337a2fe022e8ab064bcd7ffda27a74e288e3" + url: "https://pub.dev" + source: hosted + version: "1.1.11+1" + vector_graphics_codec: + dependency: transitive + description: + name: vector_graphics_codec + sha256: c86987475f162fadff579e7320c7ddda04cd2fdeffbe1129227a85d9ac9e03da + url: "https://pub.dev" + source: hosted + version: "1.1.11+1" + vector_graphics_compiler: + dependency: transitive + description: + name: vector_graphics_compiler + sha256: "12faff3f73b1741a36ca7e31b292ddeb629af819ca9efe9953b70bd63fc8cd81" + url: "https://pub.dev" + source: hosted + version: "1.1.11+1" vector_math: dependency: transitive description: name: vector_math - url: "https://pub.dartlang.org" + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" video_player: dependency: transitive description: name: video_player - url: "https://pub.dartlang.org" + sha256: e30df0d226c4ef82e2c150ebf6834b3522cf3f654d8e2f9419d376cdc071425d + url: "https://pub.dev" source: hosted - version: "2.5.2" + version: "2.9.1" video_player_android: dependency: transitive description: name: video_player_android - url: "https://pub.dartlang.org" + sha256: "38d8fe136c427abdce68b5e8c3c08ea29d7a794b453c7a51b12ecfad4aad9437" + url: "https://pub.dev" source: hosted - version: "2.3.11" + version: "2.7.3" video_player_avfoundation: dependency: transitive description: name: video_player_avfoundation - url: "https://pub.dartlang.org" + sha256: d1e9a824f2b324000dc8fb2dcb2a3285b6c1c7c487521c63306cc5b394f68a7c + url: "https://pub.dev" source: hosted - version: "2.3.9" + version: "2.6.1" video_player_platform_interface: dependency: transitive description: name: video_player_platform_interface - url: "https://pub.dartlang.org" + sha256: "236454725fafcacf98f0f39af0d7c7ab2ce84762e3b63f2cbb3ef9a7e0550bc6" + url: "https://pub.dev" source: hosted - version: "6.0.2" + version: "6.2.2" video_player_web: dependency: transitive description: name: video_player_web - url: "https://pub.dartlang.org" + sha256: "6dcdd298136523eaf7dfc31abaf0dfba9aa8a8dbc96670e87e9d42b6f2caf774" + url: "https://pub.dev" source: hosted - version: "2.0.14" + version: "2.3.2" visibility_detector: dependency: transitive description: name: visibility_detector - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - wakelock: - dependency: transitive - description: - name: wakelock - url: "https://pub.dartlang.org" + sha256: dd5cc11e13494f432d15939c3aa8ae76844c42b723398643ce9addb88a5ed420 + url: "https://pub.dev" source: hosted - version: "0.6.2" - wakelock_macos: + version: "0.4.0+2" + vm_service: dependency: transitive description: - name: wakelock_macos - url: "https://pub.dartlang.org" + name: vm_service + sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" + url: "https://pub.dev" source: hosted - version: "0.4.0" - wakelock_platform_interface: + version: "14.2.5" + wakelock_plus: dependency: transitive description: - name: wakelock_platform_interface - url: "https://pub.dartlang.org" + name: wakelock_plus + sha256: bf4ee6f17a2fa373ed3753ad0e602b7603f8c75af006d5b9bdade263928c0484 + url: "https://pub.dev" source: hosted - version: "0.3.0" - wakelock_web: + version: "1.2.8" + wakelock_plus_platform_interface: dependency: transitive description: - name: wakelock_web - url: "https://pub.dartlang.org" + name: wakelock_plus_platform_interface + sha256: "422d1cdbb448079a8a62a5a770b69baa489f8f7ca21aef47800c726d404f9d16" + url: "https://pub.dev" source: hosted - version: "0.4.0" - wakelock_windows: + version: "1.2.1" + web: dependency: transitive description: - name: wakelock_windows - url: "https://pub.dartlang.org" + name: web + sha256: d43c1d6b787bf0afad444700ae7f4db8827f701bc61c255ac8d328c6f4d52062 + url: "https://pub.dev" source: hosted - version: "0.2.1" + version: "1.0.0" webview_flutter: dependency: transitive description: name: webview_flutter - url: "https://pub.dartlang.org" + sha256: ec81f57aa1611f8ebecf1d2259da4ef052281cb5ad624131c93546c79ccc7736 + url: "https://pub.dev" source: hosted - version: "3.0.4" + version: "4.9.0" webview_flutter_android: dependency: transitive description: name: webview_flutter_android - url: "https://pub.dartlang.org" + sha256: "6e64fcb1c19d92024da8f33503aaeeda35825d77142c01d0ea2aa32edc79fdc8" + url: "https://pub.dev" source: hosted - version: "2.10.4" + version: "3.16.7" webview_flutter_platform_interface: dependency: transitive description: name: webview_flutter_platform_interface - url: "https://pub.dartlang.org" + sha256: d937581d6e558908d7ae3dc1989c4f87b786891ab47bb9df7de548a151779d8d + url: "https://pub.dev" source: hosted - version: "1.9.5" + version: "2.10.0" webview_flutter_wkwebview: dependency: transitive description: name: webview_flutter_wkwebview - url: "https://pub.dartlang.org" + sha256: "1942a12224ab31e9508cf00c0c6347b931b023b8a4f0811e5dec3b06f94f117d" + url: "https://pub.dev" source: hosted - version: "2.9.5" + version: "3.15.0" win32: dependency: transitive description: name: win32 - url: "https://pub.dartlang.org" + sha256: "68d1e89a91ed61ad9c370f9f8b6effed9ae5e0ede22a270bdfa6daf79fc2290a" + url: "https://pub.dev" source: hosted - version: "3.1.3" + version: "5.5.4" xdg_directories: dependency: transitive description: name: xdg_directories - url: "https://pub.dartlang.org" + sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d + url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.0.4" xml: dependency: transitive description: name: xml - url: "https://pub.dartlang.org" + sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 + url: "https://pub.dev" source: hosted - version: "6.1.0" + version: "6.5.0" zoom_tap_animation: dependency: "direct main" description: name: zoom_tap_animation - url: "https://pub.dartlang.org" + sha256: d9f7a73cab65aa1546ba6886b5e21d3c8ccccb34e4e5f770301c306d4868bee0 + url: "https://pub.dev" source: hosted version: "1.1.0" sdks: - dart: ">=2.18.0 <3.0.0" - flutter: ">=3.3.0" + dart: ">=3.5.0 <4.0.0" + flutter: ">=3.24.0" diff --git a/pubspec.yaml b/pubspec.yaml index 39a1ee6..b44df41 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -36,27 +36,28 @@ dependencies: # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.2 - flutter_svg: ^1.0.3 + flutter_svg: ^2.0.10+1 validators: ^3.0.0 get: ^4.6.5 - share_plus: ^4.0.10 + share_plus: ^10.0.2 url_launcher: ^6.1.5 - dio: ^4.0.6 + dio: ^5.6.0 cached_network_image: ^3.2.1 - flutter_widget_from_html: ^0.8.5 + flutter_widget_from_html: ^0.15.2 get_storage: ^2.0.3 - file_picker: ^5.2.5 + file_picker: ^8.1.2 html_editor_enhanced: ^2.5.1 percent_indicator: ^4.2.2 just_audio: ^0.9.30 - audio_video_progress_bar: ^0.11.0 + audio_video_progress_bar: ^2.0.3 zoom_tap_animation: ^1.1.0 - email_validator: ^2.1.17 + email_validator: ^3.0.0 + numberpicker: ^2.1.2 dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^1.0.0 + flutter_lints: ^4.0.0 diff --git a/windows/runner/grunner.exe.manifest b/windows/runner/grunner.exe.manifest deleted file mode 100644 index c977c4a..0000000 --- a/windows/runner/grunner.exe.manifest +++ /dev/null @@ -1,20 +0,0 @@ - - - - - PerMonitorV2 - - - - - - - - - - - - - - - diff --git a/windows/runner/grunner.exe.manifico b/windows/runner/grunner.exe.manifico deleted file mode 100644 index e69de29..0000000