├── .gitignore ├── .metadata ├── README.md ├── analysis_options.yaml ├── android ├── .gitignore ├── app │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── AndroidManifest.xml │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── kotlin │ │ │ └── com │ │ │ │ └── example │ │ │ │ └── day60 │ │ │ │ └── MainActivity.kt │ │ └── res │ │ │ ├── drawable-v21 │ │ │ └── launch_background.xml │ │ │ ├── drawable │ │ │ └── launch_background.xml │ │ │ ├── mipmap-hdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-mdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xhdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxhdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxxhdpi │ │ │ └── ic_launcher.png │ │ │ ├── values-night │ │ │ └── styles.xml │ │ │ └── values │ │ │ └── styles.xml │ │ └── profile │ │ └── AndroidManifest.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties └── settings.gradle ├── assets └── screenshots │ ├── chat-list-page.png │ └── chat-page.png ├── ios ├── .gitignore ├── Flutter │ ├── AppFrameworkInfo.plist │ ├── Debug.xcconfig │ └── Release.xcconfig ├── Podfile ├── Runner.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── WorkspaceSettings.xcsettings │ └── xcshareddata │ │ └── xcschemes │ │ └── Runner.xcscheme ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── WorkspaceSettings.xcsettings └── Runner │ ├── AppDelegate.swift │ ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── Icon-App-1024x1024@1x.png │ │ ├── Icon-App-20x20@1x.png │ │ ├── Icon-App-20x20@2x.png │ │ ├── Icon-App-20x20@3x.png │ │ ├── Icon-App-29x29@1x.png │ │ ├── Icon-App-29x29@2x.png │ │ ├── Icon-App-29x29@3x.png │ │ ├── Icon-App-40x40@1x.png │ │ ├── Icon-App-40x40@2x.png │ │ ├── Icon-App-40x40@3x.png │ │ ├── Icon-App-60x60@2x.png │ │ ├── Icon-App-60x60@3x.png │ │ ├── Icon-App-76x76@1x.png │ │ ├── Icon-App-76x76@2x.png │ │ └── Icon-App-83.5x83.5@2x.png │ └── LaunchImage.imageset │ │ ├── Contents.json │ │ ├── LaunchImage.png │ │ ├── LaunchImage@2x.png │ │ ├── LaunchImage@3x.png │ │ └── README.md │ ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard │ ├── Info.plist │ └── Runner-Bridging-Header.h ├── lib ├── data │ ├── chat.dart │ └── user.dart ├── main.dart ├── models │ ├── chat │ │ └── chat.dart │ ├── message │ │ └── message.dart │ ├── story │ │ └── story.dart │ └── user │ │ └── user.dart ├── pages │ ├── call │ │ └── video │ │ │ └── video_call_page.dart │ ├── home │ │ ├── home_page.dart │ │ └── tabs │ │ │ ├── chat_tab.dart │ │ │ ├── components │ │ │ ├── chat_widget.dart │ │ │ ├── message_widget.dart │ │ │ ├── story_list.dart │ │ │ └── story_widget.dart │ │ │ ├── explore_tab.dart │ │ │ ├── notification_tab.dart │ │ │ └── user_tab.dart │ ├── message_page.dart │ └── story │ │ └── story_page.dart └── shared │ └── constants │ └── color_constants.dart ├── pubspec.lock ├── pubspec.yaml └── test └── widget_test.dart /.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | migrate_working_dir/ 12 | 13 | # IntelliJ related 14 | *.iml 15 | *.ipr 16 | *.iws 17 | .idea/ 18 | 19 | # The .vscode folder contains launch configuration and tasks you configure in 20 | # VS Code which you may wish to be included in version control, so this line 21 | # is commented out by default. 22 | #.vscode/ 23 | 24 | # Flutter/Dart/Pub related 25 | **/doc/api/ 26 | **/ios/Flutter/.last_build_id 27 | .dart_tool/ 28 | .flutter-plugins 29 | .flutter-plugins-dependencies 30 | .packages 31 | .pub-cache/ 32 | .pub/ 33 | /build/ 34 | 35 | # Web related 36 | lib/generated_plugin_registrant.dart 37 | 38 | # Symbolication related 39 | app.*.symbols 40 | 41 | # Obfuscation related 42 | app.*.map.json 43 | 44 | # Android Studio will place build artifacts here 45 | /android/app/debug 46 | /android/app/profile 47 | /android/app/release 48 | -------------------------------------------------------------------------------- /.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled. 5 | 6 | version: 7 | revision: 85684f9300908116a78138ea4c6036c35c9a1236 8 | channel: stable 9 | 10 | project_type: app 11 | 12 | # Tracks metadata for the flutter migrate command 13 | migration: 14 | platforms: 15 | - platform: root 16 | create_revision: 85684f9300908116a78138ea4c6036c35c9a1236 17 | base_revision: 85684f9300908116a78138ea4c6036c35c9a1236 18 | - platform: android 19 | create_revision: 85684f9300908116a78138ea4c6036c35c9a1236 20 | base_revision: 85684f9300908116a78138ea4c6036c35c9a1236 21 | - platform: ios 22 | create_revision: 85684f9300908116a78138ea4c6036c35c9a1236 23 | base_revision: 85684f9300908116a78138ea4c6036c35c9a1236 24 | - platform: linux 25 | create_revision: 85684f9300908116a78138ea4c6036c35c9a1236 26 | base_revision: 85684f9300908116a78138ea4c6036c35c9a1236 27 | - platform: macos 28 | create_revision: 85684f9300908116a78138ea4c6036c35c9a1236 29 | base_revision: 85684f9300908116a78138ea4c6036c35c9a1236 30 | - platform: web 31 | create_revision: 85684f9300908116a78138ea4c6036c35c9a1236 32 | base_revision: 85684f9300908116a78138ea4c6036c35c9a1236 33 | - platform: windows 34 | create_revision: 85684f9300908116a78138ea4c6036c35c9a1236 35 | base_revision: 85684f9300908116a78138ea4c6036c35c9a1236 36 | 37 | # User provided section 38 | 39 | # List of Local paths (relative to this file) that should be 40 | # ignored by the migrate tool. 41 | # 42 | # Files that are not part of the templates will be ignored by default. 43 | unmanaged_files: 44 | - 'lib/main.dart' 45 | - 'ios/Runner.xcodeproj/project.pbxproj' 46 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Flutter Simple Chat App 2 | 3 | Hey Flutter lovers, here is a simple chat app built with Flutter. It's just a UI and some animations. It has basic functionality like send message and voice message, and image, etc. There is also a page for video/audio call. 4 | 5 | 6 | ## Development Setup 7 | Clone the repository and run the following commands: 8 | ``` 9 | flutter pub get 10 | flutter run 11 | ``` 12 | 13 | ## Screenshots 14 | 15 | ### Chat List Page 16 | 17 | 18 | ### Chat Page 19 | 20 | 21 | 22 | ## Links 23 | 24 | * [Website](https://afgprogrammer.com) 25 | * [Youtube channel](https://youtube.com/afgprogrammer) 26 | * [Instagram](https://instagram.com/theflutterlover) 27 | -------------------------------------------------------------------------------- /analysis_options.yaml: -------------------------------------------------------------------------------- 1 | # This file configures the analyzer, which statically analyzes Dart code to 2 | # check for errors, warnings, and lints. 3 | # 4 | # The issues identified by the analyzer are surfaced in the UI of Dart-enabled 5 | # IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be 6 | # invoked from the command line by running `flutter analyze`. 7 | 8 | # The following line activates a set of recommended lints for Flutter apps, 9 | # packages, and plugins designed to encourage good coding practices. 10 | # include: package:flutter_lints/flutter.yaml 11 | 12 | linter: 13 | # The lint rules applied to this project can be customized in the 14 | # section below to disable rules from the `package:flutter_lints/flutter.yaml` 15 | # included above or to enable additional rules. A list of all available lints 16 | # and their documentation is published at 17 | # https://dart-lang.github.io/linter/lints/index.html. 18 | # 19 | # Instead of disabling a lint rule for the entire project in the 20 | # section below, it can also be suppressed for a single line of code 21 | # or a specific dart file by using the `// ignore: name_of_lint` and 22 | # `// ignore_for_file: name_of_lint` syntax on the line or in the file 23 | # producing the lint. 24 | rules: 25 | # avoid_print: false # Uncomment to disable the `avoid_print` rule 26 | # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule 27 | 28 | # Additional information about this file can be found at 29 | # https://dart.dev/guides/language/analysis-options 30 | -------------------------------------------------------------------------------- /android/.gitignore: -------------------------------------------------------------------------------- 1 | gradle-wrapper.jar 2 | /.gradle 3 | /captures/ 4 | /gradlew 5 | /gradlew.bat 6 | /local.properties 7 | GeneratedPluginRegistrant.java 8 | 9 | # Remember to never publicly share your keystore. 10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app 11 | key.properties 12 | **/*.keystore 13 | **/*.jks 14 | -------------------------------------------------------------------------------- /android/app/build.gradle: -------------------------------------------------------------------------------- 1 | def localProperties = new Properties() 2 | def localPropertiesFile = rootProject.file('local.properties') 3 | if (localPropertiesFile.exists()) { 4 | localPropertiesFile.withReader('UTF-8') { reader -> 5 | localProperties.load(reader) 6 | } 7 | } 8 | 9 | def flutterRoot = localProperties.getProperty('flutter.sdk') 10 | if (flutterRoot == null) { 11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") 12 | } 13 | 14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode') 15 | if (flutterVersionCode == null) { 16 | flutterVersionCode = '1' 17 | } 18 | 19 | def flutterVersionName = localProperties.getProperty('flutter.versionName') 20 | if (flutterVersionName == null) { 21 | flutterVersionName = '1.0' 22 | } 23 | 24 | apply plugin: 'com.android.application' 25 | apply plugin: 'kotlin-android' 26 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" 27 | 28 | android { 29 | compileSdkVersion flutter.compileSdkVersion 30 | ndkVersion flutter.ndkVersion 31 | 32 | compileOptions { 33 | sourceCompatibility JavaVersion.VERSION_1_8 34 | targetCompatibility JavaVersion.VERSION_1_8 35 | } 36 | 37 | kotlinOptions { 38 | jvmTarget = '1.8' 39 | } 40 | 41 | sourceSets { 42 | main.java.srcDirs += 'src/main/kotlin' 43 | } 44 | 45 | defaultConfig { 46 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 47 | applicationId "com.example.day60" 48 | // You can update the following values to match your application needs. 49 | // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration. 50 | minSdkVersion flutter.minSdkVersion 51 | targetSdkVersion flutter.targetSdkVersion 52 | versionCode flutterVersionCode.toInteger() 53 | versionName flutterVersionName 54 | } 55 | 56 | buildTypes { 57 | release { 58 | // TODO: Add your own signing config for the release build. 59 | // Signing with the debug keys for now, so `flutter run --release` works. 60 | signingConfig signingConfigs.debug 61 | } 62 | } 63 | } 64 | 65 | flutter { 66 | source '../..' 67 | } 68 | 69 | dependencies { 70 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 71 | } 72 | -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 7 | 15 | 19 | 23 | 24 | 25 | 26 | 27 | 28 | 30 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /android/app/src/main/kotlin/com/example/day60/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.example.day60 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | class MainActivity: FlutterActivity() { 6 | } 7 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-v21/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/afgprogrammer/Flutter-simple-chat-app/ccd42bb9d9e5d6aca41d5a9ae7136a6debb179b2/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/afgprogrammer/Flutter-simple-chat-app/ccd42bb9d9e5d6aca41d5a9ae7136a6debb179b2/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/afgprogrammer/Flutter-simple-chat-app/ccd42bb9d9e5d6aca41d5a9ae7136a6debb179b2/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/afgprogrammer/Flutter-simple-chat-app/ccd42bb9d9e5d6aca41d5a9ae7136a6debb179b2/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/afgprogrammer/Flutter-simple-chat-app/ccd42bb9d9e5d6aca41d5a9ae7136a6debb179b2/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/values-night/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | ext.kotlin_version = '1.6.10' 3 | repositories { 4 | google() 5 | mavenCentral() 6 | } 7 | 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:7.1.2' 10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 11 | } 12 | } 13 | 14 | allprojects { 15 | repositories { 16 | google() 17 | mavenCentral() 18 | } 19 | } 20 | 21 | rootProject.buildDir = '../build' 22 | subprojects { 23 | project.buildDir = "${rootProject.buildDir}/${project.name}" 24 | } 25 | subprojects { 26 | project.evaluationDependsOn(':app') 27 | } 28 | 29 | task clean(type: Delete) { 30 | delete rootProject.buildDir 31 | } 32 | -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Jun 23 08:50:38 CEST 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip 7 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | 3 | def localPropertiesFile = new File(rootProject.projectDir, "local.properties") 4 | def properties = new Properties() 5 | 6 | assert localPropertiesFile.exists() 7 | localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } 8 | 9 | def flutterSdkPath = properties.getProperty("flutter.sdk") 10 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties" 11 | apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" 12 | -------------------------------------------------------------------------------- /assets/screenshots/chat-list-page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/afgprogrammer/Flutter-simple-chat-app/ccd42bb9d9e5d6aca41d5a9ae7136a6debb179b2/assets/screenshots/chat-list-page.png -------------------------------------------------------------------------------- /assets/screenshots/chat-page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/afgprogrammer/Flutter-simple-chat-app/ccd42bb9d9e5d6aca41d5a9ae7136a6debb179b2/assets/screenshots/chat-page.png -------------------------------------------------------------------------------- /ios/.gitignore: -------------------------------------------------------------------------------- 1 | **/dgph 2 | *.mode1v3 3 | *.mode2v3 4 | *.moved-aside 5 | *.pbxuser 6 | *.perspectivev3 7 | **/*sync/ 8 | .sconsign.dblite 9 | .tags* 10 | **/.vagrant/ 11 | **/DerivedData/ 12 | Icon? 13 | **/Pods/ 14 | **/.symlinks/ 15 | profile 16 | xcuserdata 17 | **/.generated/ 18 | Flutter/App.framework 19 | Flutter/Flutter.framework 20 | Flutter/Flutter.podspec 21 | Flutter/Generated.xcconfig 22 | Flutter/ephemeral/ 23 | Flutter/app.flx 24 | Flutter/app.zip 25 | Flutter/flutter_assets/ 26 | Flutter/flutter_export_environment.sh 27 | ServiceDefinitions.json 28 | Runner/GeneratedPluginRegistrant.* 29 | 30 | # Exceptions to above rules. 31 | !default.mode1v3 32 | !default.mode2v3 33 | !default.pbxuser 34 | !default.perspectivev3 35 | -------------------------------------------------------------------------------- /ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | App 9 | CFBundleIdentifier 10 | io.flutter.flutter.app 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | App 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | MinimumOSVersion 24 | 9.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /ios/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment this line to define a global platform for your project 2 | # platform :ios, '9.0' 3 | 4 | # CocoaPods analytics sends network stats synchronously affecting flutter build latency. 5 | ENV['COCOAPODS_DISABLE_STATS'] = 'true' 6 | 7 | project 'Runner', { 8 | 'Debug' => :debug, 9 | 'Profile' => :release, 10 | 'Release' => :release, 11 | } 12 | 13 | def flutter_root 14 | generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) 15 | unless File.exist?(generated_xcode_build_settings_path) 16 | raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" 17 | end 18 | 19 | File.foreach(generated_xcode_build_settings_path) do |line| 20 | matches = line.match(/FLUTTER_ROOT\=(.*)/) 21 | return matches[1].strip if matches 22 | end 23 | raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" 24 | end 25 | 26 | require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) 27 | 28 | flutter_ios_podfile_setup 29 | 30 | target 'Runner' do 31 | use_frameworks! 32 | use_modular_headers! 33 | 34 | flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) 35 | end 36 | 37 | post_install do |installer| 38 | installer.pods_project.targets.each do |target| 39 | flutter_additional_ios_build_settings(target) 40 | end 41 | end 42 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 11 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 12 | 5A7D43D65FF27CA409A1D1EC /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8DC9AF968C78966BF9E9BD2 /* Pods_Runner.framework */; }; 13 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 14 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 15 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 16 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 17 | /* End PBXBuildFile section */ 18 | 19 | /* Begin PBXCopyFilesBuildPhase section */ 20 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = { 21 | isa = PBXCopyFilesBuildPhase; 22 | buildActionMask = 2147483647; 23 | dstPath = ""; 24 | dstSubfolderSpec = 10; 25 | files = ( 26 | ); 27 | name = "Embed Frameworks"; 28 | runOnlyForDeploymentPostprocessing = 0; 29 | }; 30 | /* End PBXCopyFilesBuildPhase section */ 31 | 32 | /* Begin PBXFileReference section */ 33 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 34 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 35 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 36 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 37 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 38 | 79B18084C8954EFE62C1F32A /* 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 = ""; }; 39 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 40 | 7FD979A45E3779423EC892AC /* 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 = ""; }; 41 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 42 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 43 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 44 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 45 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 46 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 47 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 48 | F505C8D9D97C201474DE54BE /* 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 = ""; }; 49 | F8DC9AF968C78966BF9E9BD2 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 50 | /* End PBXFileReference section */ 51 | 52 | /* Begin PBXFrameworksBuildPhase section */ 53 | 97C146EB1CF9000F007C117D /* Frameworks */ = { 54 | isa = PBXFrameworksBuildPhase; 55 | buildActionMask = 2147483647; 56 | files = ( 57 | 5A7D43D65FF27CA409A1D1EC /* Pods_Runner.framework in Frameworks */, 58 | ); 59 | runOnlyForDeploymentPostprocessing = 0; 60 | }; 61 | /* End PBXFrameworksBuildPhase section */ 62 | 63 | /* Begin PBXGroup section */ 64 | 32A912D792C1C7B292FC6625 /* Frameworks */ = { 65 | isa = PBXGroup; 66 | children = ( 67 | F8DC9AF968C78966BF9E9BD2 /* Pods_Runner.framework */, 68 | ); 69 | name = Frameworks; 70 | sourceTree = ""; 71 | }; 72 | 9740EEB11CF90186004384FC /* Flutter */ = { 73 | isa = PBXGroup; 74 | children = ( 75 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 76 | 9740EEB21CF90195004384FC /* Debug.xcconfig */, 77 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 78 | 9740EEB31CF90195004384FC /* Generated.xcconfig */, 79 | ); 80 | name = Flutter; 81 | sourceTree = ""; 82 | }; 83 | 97C146E51CF9000F007C117D = { 84 | isa = PBXGroup; 85 | children = ( 86 | 9740EEB11CF90186004384FC /* Flutter */, 87 | 97C146F01CF9000F007C117D /* Runner */, 88 | 97C146EF1CF9000F007C117D /* Products */, 89 | C1FF0B1DCB558FCEBE34607C /* Pods */, 90 | 32A912D792C1C7B292FC6625 /* Frameworks */, 91 | ); 92 | sourceTree = ""; 93 | }; 94 | 97C146EF1CF9000F007C117D /* Products */ = { 95 | isa = PBXGroup; 96 | children = ( 97 | 97C146EE1CF9000F007C117D /* Runner.app */, 98 | ); 99 | name = Products; 100 | sourceTree = ""; 101 | }; 102 | 97C146F01CF9000F007C117D /* Runner */ = { 103 | isa = PBXGroup; 104 | children = ( 105 | 97C146FA1CF9000F007C117D /* Main.storyboard */, 106 | 97C146FD1CF9000F007C117D /* Assets.xcassets */, 107 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 108 | 97C147021CF9000F007C117D /* Info.plist */, 109 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 110 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 111 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, 112 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, 113 | ); 114 | path = Runner; 115 | sourceTree = ""; 116 | }; 117 | C1FF0B1DCB558FCEBE34607C /* Pods */ = { 118 | isa = PBXGroup; 119 | children = ( 120 | F505C8D9D97C201474DE54BE /* Pods-Runner.debug.xcconfig */, 121 | 7FD979A45E3779423EC892AC /* Pods-Runner.release.xcconfig */, 122 | 79B18084C8954EFE62C1F32A /* Pods-Runner.profile.xcconfig */, 123 | ); 124 | name = Pods; 125 | path = Pods; 126 | sourceTree = ""; 127 | }; 128 | /* End PBXGroup section */ 129 | 130 | /* Begin PBXNativeTarget section */ 131 | 97C146ED1CF9000F007C117D /* Runner */ = { 132 | isa = PBXNativeTarget; 133 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; 134 | buildPhases = ( 135 | 0245B335AACB119B33FB95D1 /* [CP] Check Pods Manifest.lock */, 136 | 9740EEB61CF901F6004384FC /* Run Script */, 137 | 97C146EA1CF9000F007C117D /* Sources */, 138 | 97C146EB1CF9000F007C117D /* Frameworks */, 139 | 97C146EC1CF9000F007C117D /* Resources */, 140 | 9705A1C41CF9048500538489 /* Embed Frameworks */, 141 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 142 | 0BB442277A9FF46B9F355001 /* [CP] Embed Pods Frameworks */, 143 | ); 144 | buildRules = ( 145 | ); 146 | dependencies = ( 147 | ); 148 | name = Runner; 149 | productName = Runner; 150 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */; 151 | productType = "com.apple.product-type.application"; 152 | }; 153 | /* End PBXNativeTarget section */ 154 | 155 | /* Begin PBXProject section */ 156 | 97C146E61CF9000F007C117D /* Project object */ = { 157 | isa = PBXProject; 158 | attributes = { 159 | LastUpgradeCheck = 1300; 160 | ORGANIZATIONNAME = ""; 161 | TargetAttributes = { 162 | 97C146ED1CF9000F007C117D = { 163 | CreatedOnToolsVersion = 7.3.1; 164 | LastSwiftMigration = 1100; 165 | }; 166 | }; 167 | }; 168 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; 169 | compatibilityVersion = "Xcode 9.3"; 170 | developmentRegion = en; 171 | hasScannedForEncodings = 0; 172 | knownRegions = ( 173 | en, 174 | Base, 175 | ); 176 | mainGroup = 97C146E51CF9000F007C117D; 177 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */; 178 | projectDirPath = ""; 179 | projectRoot = ""; 180 | targets = ( 181 | 97C146ED1CF9000F007C117D /* Runner */, 182 | ); 183 | }; 184 | /* End PBXProject section */ 185 | 186 | /* Begin PBXResourcesBuildPhase section */ 187 | 97C146EC1CF9000F007C117D /* Resources */ = { 188 | isa = PBXResourcesBuildPhase; 189 | buildActionMask = 2147483647; 190 | files = ( 191 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 192 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 193 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 194 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, 195 | ); 196 | runOnlyForDeploymentPostprocessing = 0; 197 | }; 198 | /* End PBXResourcesBuildPhase section */ 199 | 200 | /* Begin PBXShellScriptBuildPhase section */ 201 | 0245B335AACB119B33FB95D1 /* [CP] Check Pods Manifest.lock */ = { 202 | isa = PBXShellScriptBuildPhase; 203 | buildActionMask = 2147483647; 204 | files = ( 205 | ); 206 | inputFileListPaths = ( 207 | ); 208 | inputPaths = ( 209 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 210 | "${PODS_ROOT}/Manifest.lock", 211 | ); 212 | name = "[CP] Check Pods Manifest.lock"; 213 | outputFileListPaths = ( 214 | ); 215 | outputPaths = ( 216 | "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", 217 | ); 218 | runOnlyForDeploymentPostprocessing = 0; 219 | shellPath = /bin/sh; 220 | 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"; 221 | showEnvVarsInLog = 0; 222 | }; 223 | 0BB442277A9FF46B9F355001 /* [CP] Embed Pods Frameworks */ = { 224 | isa = PBXShellScriptBuildPhase; 225 | buildActionMask = 2147483647; 226 | files = ( 227 | ); 228 | inputFileListPaths = ( 229 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", 230 | ); 231 | name = "[CP] Embed Pods Frameworks"; 232 | outputFileListPaths = ( 233 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", 234 | ); 235 | runOnlyForDeploymentPostprocessing = 0; 236 | shellPath = /bin/sh; 237 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; 238 | showEnvVarsInLog = 0; 239 | }; 240 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 241 | isa = PBXShellScriptBuildPhase; 242 | buildActionMask = 2147483647; 243 | files = ( 244 | ); 245 | inputPaths = ( 246 | ); 247 | name = "Thin Binary"; 248 | outputPaths = ( 249 | ); 250 | runOnlyForDeploymentPostprocessing = 0; 251 | shellPath = /bin/sh; 252 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; 253 | }; 254 | 9740EEB61CF901F6004384FC /* Run Script */ = { 255 | isa = PBXShellScriptBuildPhase; 256 | buildActionMask = 2147483647; 257 | files = ( 258 | ); 259 | inputPaths = ( 260 | ); 261 | name = "Run Script"; 262 | outputPaths = ( 263 | ); 264 | runOnlyForDeploymentPostprocessing = 0; 265 | shellPath = /bin/sh; 266 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; 267 | }; 268 | /* End PBXShellScriptBuildPhase section */ 269 | 270 | /* Begin PBXSourcesBuildPhase section */ 271 | 97C146EA1CF9000F007C117D /* Sources */ = { 272 | isa = PBXSourcesBuildPhase; 273 | buildActionMask = 2147483647; 274 | files = ( 275 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 276 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, 277 | ); 278 | runOnlyForDeploymentPostprocessing = 0; 279 | }; 280 | /* End PBXSourcesBuildPhase section */ 281 | 282 | /* Begin PBXVariantGroup section */ 283 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = { 284 | isa = PBXVariantGroup; 285 | children = ( 286 | 97C146FB1CF9000F007C117D /* Base */, 287 | ); 288 | name = Main.storyboard; 289 | sourceTree = ""; 290 | }; 291 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { 292 | isa = PBXVariantGroup; 293 | children = ( 294 | 97C147001CF9000F007C117D /* Base */, 295 | ); 296 | name = LaunchScreen.storyboard; 297 | sourceTree = ""; 298 | }; 299 | /* End PBXVariantGroup section */ 300 | 301 | /* Begin XCBuildConfiguration section */ 302 | 249021D3217E4FDB00AE95B9 /* Profile */ = { 303 | isa = XCBuildConfiguration; 304 | buildSettings = { 305 | ALWAYS_SEARCH_USER_PATHS = NO; 306 | CLANG_ANALYZER_NONNULL = YES; 307 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 308 | CLANG_CXX_LIBRARY = "libc++"; 309 | CLANG_ENABLE_MODULES = YES; 310 | CLANG_ENABLE_OBJC_ARC = YES; 311 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 312 | CLANG_WARN_BOOL_CONVERSION = YES; 313 | CLANG_WARN_COMMA = YES; 314 | CLANG_WARN_CONSTANT_CONVERSION = YES; 315 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 316 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 317 | CLANG_WARN_EMPTY_BODY = YES; 318 | CLANG_WARN_ENUM_CONVERSION = YES; 319 | CLANG_WARN_INFINITE_RECURSION = YES; 320 | CLANG_WARN_INT_CONVERSION = YES; 321 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 322 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 323 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 324 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 325 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 326 | CLANG_WARN_STRICT_PROTOTYPES = YES; 327 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 328 | CLANG_WARN_UNREACHABLE_CODE = YES; 329 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 330 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 331 | COPY_PHASE_STRIP = NO; 332 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 333 | ENABLE_NS_ASSERTIONS = NO; 334 | ENABLE_STRICT_OBJC_MSGSEND = YES; 335 | GCC_C_LANGUAGE_STANDARD = gnu99; 336 | GCC_NO_COMMON_BLOCKS = YES; 337 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 338 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 339 | GCC_WARN_UNDECLARED_SELECTOR = YES; 340 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 341 | GCC_WARN_UNUSED_FUNCTION = YES; 342 | GCC_WARN_UNUSED_VARIABLE = YES; 343 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 344 | MTL_ENABLE_DEBUG_INFO = NO; 345 | SDKROOT = iphoneos; 346 | SUPPORTED_PLATFORMS = iphoneos; 347 | TARGETED_DEVICE_FAMILY = "1,2"; 348 | VALIDATE_PRODUCT = YES; 349 | }; 350 | name = Profile; 351 | }; 352 | 249021D4217E4FDB00AE95B9 /* Profile */ = { 353 | isa = XCBuildConfiguration; 354 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 355 | buildSettings = { 356 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 357 | CLANG_ENABLE_MODULES = YES; 358 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 359 | DEVELOPMENT_TEAM = 4KUZY6G2FC; 360 | ENABLE_BITCODE = NO; 361 | INFOPLIST_FILE = Runner/Info.plist; 362 | LD_RUNPATH_SEARCH_PATHS = ( 363 | "$(inherited)", 364 | "@executable_path/Frameworks", 365 | ); 366 | PRODUCT_BUNDLE_IDENTIFIER = com.example.day60; 367 | PRODUCT_NAME = "$(TARGET_NAME)"; 368 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 369 | SWIFT_VERSION = 5.0; 370 | VERSIONING_SYSTEM = "apple-generic"; 371 | }; 372 | name = Profile; 373 | }; 374 | 97C147031CF9000F007C117D /* Debug */ = { 375 | isa = XCBuildConfiguration; 376 | buildSettings = { 377 | ALWAYS_SEARCH_USER_PATHS = NO; 378 | CLANG_ANALYZER_NONNULL = YES; 379 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 380 | CLANG_CXX_LIBRARY = "libc++"; 381 | CLANG_ENABLE_MODULES = YES; 382 | CLANG_ENABLE_OBJC_ARC = YES; 383 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 384 | CLANG_WARN_BOOL_CONVERSION = YES; 385 | CLANG_WARN_COMMA = YES; 386 | CLANG_WARN_CONSTANT_CONVERSION = YES; 387 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 388 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 389 | CLANG_WARN_EMPTY_BODY = YES; 390 | CLANG_WARN_ENUM_CONVERSION = YES; 391 | CLANG_WARN_INFINITE_RECURSION = YES; 392 | CLANG_WARN_INT_CONVERSION = YES; 393 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 394 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 395 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 396 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 397 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 398 | CLANG_WARN_STRICT_PROTOTYPES = YES; 399 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 400 | CLANG_WARN_UNREACHABLE_CODE = YES; 401 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 402 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 403 | COPY_PHASE_STRIP = NO; 404 | DEBUG_INFORMATION_FORMAT = dwarf; 405 | ENABLE_STRICT_OBJC_MSGSEND = YES; 406 | ENABLE_TESTABILITY = YES; 407 | GCC_C_LANGUAGE_STANDARD = gnu99; 408 | GCC_DYNAMIC_NO_PIC = NO; 409 | GCC_NO_COMMON_BLOCKS = YES; 410 | GCC_OPTIMIZATION_LEVEL = 0; 411 | GCC_PREPROCESSOR_DEFINITIONS = ( 412 | "DEBUG=1", 413 | "$(inherited)", 414 | ); 415 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 416 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 417 | GCC_WARN_UNDECLARED_SELECTOR = YES; 418 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 419 | GCC_WARN_UNUSED_FUNCTION = YES; 420 | GCC_WARN_UNUSED_VARIABLE = YES; 421 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 422 | MTL_ENABLE_DEBUG_INFO = YES; 423 | ONLY_ACTIVE_ARCH = YES; 424 | SDKROOT = iphoneos; 425 | TARGETED_DEVICE_FAMILY = "1,2"; 426 | }; 427 | name = Debug; 428 | }; 429 | 97C147041CF9000F007C117D /* Release */ = { 430 | isa = XCBuildConfiguration; 431 | buildSettings = { 432 | ALWAYS_SEARCH_USER_PATHS = NO; 433 | CLANG_ANALYZER_NONNULL = YES; 434 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 435 | CLANG_CXX_LIBRARY = "libc++"; 436 | CLANG_ENABLE_MODULES = YES; 437 | CLANG_ENABLE_OBJC_ARC = YES; 438 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 439 | CLANG_WARN_BOOL_CONVERSION = YES; 440 | CLANG_WARN_COMMA = YES; 441 | CLANG_WARN_CONSTANT_CONVERSION = YES; 442 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 443 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 444 | CLANG_WARN_EMPTY_BODY = YES; 445 | CLANG_WARN_ENUM_CONVERSION = YES; 446 | CLANG_WARN_INFINITE_RECURSION = YES; 447 | CLANG_WARN_INT_CONVERSION = YES; 448 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 449 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 450 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 451 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 452 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 453 | CLANG_WARN_STRICT_PROTOTYPES = YES; 454 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 455 | CLANG_WARN_UNREACHABLE_CODE = YES; 456 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 457 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 458 | COPY_PHASE_STRIP = NO; 459 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 460 | ENABLE_NS_ASSERTIONS = NO; 461 | ENABLE_STRICT_OBJC_MSGSEND = YES; 462 | GCC_C_LANGUAGE_STANDARD = gnu99; 463 | GCC_NO_COMMON_BLOCKS = YES; 464 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 465 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 466 | GCC_WARN_UNDECLARED_SELECTOR = YES; 467 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 468 | GCC_WARN_UNUSED_FUNCTION = YES; 469 | GCC_WARN_UNUSED_VARIABLE = YES; 470 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 471 | MTL_ENABLE_DEBUG_INFO = NO; 472 | SDKROOT = iphoneos; 473 | SUPPORTED_PLATFORMS = iphoneos; 474 | SWIFT_COMPILATION_MODE = wholemodule; 475 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 476 | TARGETED_DEVICE_FAMILY = "1,2"; 477 | VALIDATE_PRODUCT = YES; 478 | }; 479 | name = Release; 480 | }; 481 | 97C147061CF9000F007C117D /* Debug */ = { 482 | isa = XCBuildConfiguration; 483 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 484 | buildSettings = { 485 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 486 | CLANG_ENABLE_MODULES = YES; 487 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 488 | DEVELOPMENT_TEAM = 4KUZY6G2FC; 489 | ENABLE_BITCODE = NO; 490 | INFOPLIST_FILE = Runner/Info.plist; 491 | LD_RUNPATH_SEARCH_PATHS = ( 492 | "$(inherited)", 493 | "@executable_path/Frameworks", 494 | ); 495 | PRODUCT_BUNDLE_IDENTIFIER = com.example.day60; 496 | PRODUCT_NAME = "$(TARGET_NAME)"; 497 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 498 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 499 | SWIFT_VERSION = 5.0; 500 | VERSIONING_SYSTEM = "apple-generic"; 501 | }; 502 | name = Debug; 503 | }; 504 | 97C147071CF9000F007C117D /* Release */ = { 505 | isa = XCBuildConfiguration; 506 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 507 | buildSettings = { 508 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 509 | CLANG_ENABLE_MODULES = YES; 510 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 511 | DEVELOPMENT_TEAM = 4KUZY6G2FC; 512 | ENABLE_BITCODE = NO; 513 | INFOPLIST_FILE = Runner/Info.plist; 514 | LD_RUNPATH_SEARCH_PATHS = ( 515 | "$(inherited)", 516 | "@executable_path/Frameworks", 517 | ); 518 | PRODUCT_BUNDLE_IDENTIFIER = com.example.day60; 519 | PRODUCT_NAME = "$(TARGET_NAME)"; 520 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 521 | SWIFT_VERSION = 5.0; 522 | VERSIONING_SYSTEM = "apple-generic"; 523 | }; 524 | name = Release; 525 | }; 526 | /* End XCBuildConfiguration section */ 527 | 528 | /* Begin XCConfigurationList section */ 529 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { 530 | isa = XCConfigurationList; 531 | buildConfigurations = ( 532 | 97C147031CF9000F007C117D /* Debug */, 533 | 97C147041CF9000F007C117D /* Release */, 534 | 249021D3217E4FDB00AE95B9 /* Profile */, 535 | ); 536 | defaultConfigurationIsVisible = 0; 537 | defaultConfigurationName = Release; 538 | }; 539 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { 540 | isa = XCConfigurationList; 541 | buildConfigurations = ( 542 | 97C147061CF9000F007C117D /* Debug */, 543 | 97C147071CF9000F007C117D /* Release */, 544 | 249021D4217E4FDB00AE95B9 /* Profile */, 545 | ); 546 | defaultConfigurationIsVisible = 0; 547 | defaultConfigurationName = Release; 548 | }; 549 | /* End XCConfigurationList section */ 550 | }; 551 | rootObject = 97C146E61CF9000F007C117D /* Project object */; 552 | } 553 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 37 | 38 | 39 | 40 | 41 | 42 | 52 | 54 | 60 | 61 | 62 | 63 | 69 | 71 | 77 | 78 | 79 | 80 | 82 | 83 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import Flutter 3 | 4 | @UIApplicationMain 5 | @objc class AppDelegate: FlutterAppDelegate { 6 | override func application( 7 | _ application: UIApplication, 8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? 9 | ) -> Bool { 10 | GeneratedPluginRegistrant.register(with: self) 11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-App-20x20@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-App-20x20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-App-29x29@1x.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-App-29x29@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "29x29", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-App-29x29@3x.png", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-App-40x40@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "40x40", 41 | "idiom" : "iphone", 42 | "filename" : "Icon-App-40x40@3x.png", 43 | "scale" : "3x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "Icon-App-60x60@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "60x60", 53 | "idiom" : "iphone", 54 | "filename" : "Icon-App-60x60@3x.png", 55 | "scale" : "3x" 56 | }, 57 | { 58 | "size" : "20x20", 59 | "idiom" : "ipad", 60 | "filename" : "Icon-App-20x20@1x.png", 61 | "scale" : "1x" 62 | }, 63 | { 64 | "size" : "20x20", 65 | "idiom" : "ipad", 66 | "filename" : "Icon-App-20x20@2x.png", 67 | "scale" : "2x" 68 | }, 69 | { 70 | "size" : "29x29", 71 | "idiom" : "ipad", 72 | "filename" : "Icon-App-29x29@1x.png", 73 | "scale" : "1x" 74 | }, 75 | { 76 | "size" : "29x29", 77 | "idiom" : "ipad", 78 | "filename" : "Icon-App-29x29@2x.png", 79 | "scale" : "2x" 80 | }, 81 | { 82 | "size" : "40x40", 83 | "idiom" : "ipad", 84 | "filename" : "Icon-App-40x40@1x.png", 85 | "scale" : "1x" 86 | }, 87 | { 88 | "size" : "40x40", 89 | "idiom" : "ipad", 90 | "filename" : "Icon-App-40x40@2x.png", 91 | "scale" : "2x" 92 | }, 93 | { 94 | "size" : "76x76", 95 | "idiom" : "ipad", 96 | "filename" : "Icon-App-76x76@1x.png", 97 | "scale" : "1x" 98 | }, 99 | { 100 | "size" : "76x76", 101 | "idiom" : "ipad", 102 | "filename" : "Icon-App-76x76@2x.png", 103 | "scale" : "2x" 104 | }, 105 | { 106 | "size" : "83.5x83.5", 107 | "idiom" : "ipad", 108 | "filename" : "Icon-App-83.5x83.5@2x.png", 109 | "scale" : "2x" 110 | }, 111 | { 112 | "size" : "1024x1024", 113 | "idiom" : "ios-marketing", 114 | "filename" : "Icon-App-1024x1024@1x.png", 115 | "scale" : "1x" 116 | } 117 | ], 118 | "info" : { 119 | "version" : 1, 120 | "author" : "xcode" 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/afgprogrammer/Flutter-simple-chat-app/ccd42bb9d9e5d6aca41d5a9ae7136a6debb179b2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/afgprogrammer/Flutter-simple-chat-app/ccd42bb9d9e5d6aca41d5a9ae7136a6debb179b2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/afgprogrammer/Flutter-simple-chat-app/ccd42bb9d9e5d6aca41d5a9ae7136a6debb179b2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/afgprogrammer/Flutter-simple-chat-app/ccd42bb9d9e5d6aca41d5a9ae7136a6debb179b2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/afgprogrammer/Flutter-simple-chat-app/ccd42bb9d9e5d6aca41d5a9ae7136a6debb179b2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/afgprogrammer/Flutter-simple-chat-app/ccd42bb9d9e5d6aca41d5a9ae7136a6debb179b2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/afgprogrammer/Flutter-simple-chat-app/ccd42bb9d9e5d6aca41d5a9ae7136a6debb179b2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/afgprogrammer/Flutter-simple-chat-app/ccd42bb9d9e5d6aca41d5a9ae7136a6debb179b2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/afgprogrammer/Flutter-simple-chat-app/ccd42bb9d9e5d6aca41d5a9ae7136a6debb179b2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/afgprogrammer/Flutter-simple-chat-app/ccd42bb9d9e5d6aca41d5a9ae7136a6debb179b2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/afgprogrammer/Flutter-simple-chat-app/ccd42bb9d9e5d6aca41d5a9ae7136a6debb179b2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/afgprogrammer/Flutter-simple-chat-app/ccd42bb9d9e5d6aca41d5a9ae7136a6debb179b2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/afgprogrammer/Flutter-simple-chat-app/ccd42bb9d9e5d6aca41d5a9ae7136a6debb179b2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/afgprogrammer/Flutter-simple-chat-app/ccd42bb9d9e5d6aca41d5a9ae7136a6debb179b2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/afgprogrammer/Flutter-simple-chat-app/ccd42bb9d9e5d6aca41d5a9ae7136a6debb179b2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LaunchImage.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "LaunchImage@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "LaunchImage@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/afgprogrammer/Flutter-simple-chat-app/ccd42bb9d9e5d6aca41d5a9ae7136a6debb179b2/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/afgprogrammer/Flutter-simple-chat-app/ccd42bb9d9e5d6aca41d5a9ae7136a6debb179b2/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/afgprogrammer/Flutter-simple-chat-app/ccd42bb9d9e5d6aca41d5a9ae7136a6debb179b2/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md: -------------------------------------------------------------------------------- 1 | # Launch Screen Assets 2 | 3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory. 4 | 5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | Day60 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | day60 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | $(FLUTTER_BUILD_NAME) 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | $(FLUTTER_BUILD_NUMBER) 25 | LSRequiresIPhoneOS 26 | 27 | UILaunchStoryboardName 28 | LaunchScreen 29 | UIMainStoryboardFile 30 | Main 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UISupportedInterfaceOrientations~ipad 38 | 39 | UIInterfaceOrientationPortrait 40 | UIInterfaceOrientationPortraitUpsideDown 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | UIViewControllerBasedStatusBarAppearance 45 | 46 | CADisableMinimumFrameDurationOnPhone 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" 2 | -------------------------------------------------------------------------------- /lib/data/chat.dart: -------------------------------------------------------------------------------- 1 | library data; 2 | 3 | import 'package:day60/models/chat/chat.dart'; 4 | import 'package:day60/models/message/message.dart'; 5 | import 'package:day60/models/user/user.dart'; 6 | 7 | List getChats() { 8 | return [ 9 | Chat( 10 | id: 1, 11 | unReadCount: 3, 12 | lastMessageAt: "2:30 PM", 13 | user: User( 14 | id: 1, 15 | email: "blalb@gmail.com", 16 | name: 'Olivia', 17 | profile: 'https://images.pexels.com/photos/1855582/pexels-photo-1855582.jpeg?auto=compress&cs=tinysrgb&crop=faces&fit=crop&h=200&w=200', 18 | ), 19 | messages: [ 20 | Message( 21 | id: 1, 22 | text: 'Hello', 23 | isMe: false, 24 | createdAt: '2:30 PM', 25 | ), 26 | Message( 27 | id: 2, 28 | text: 'Hey, How are you?', 29 | isMe: true, 30 | createdAt: '2:31 PM', 31 | ), 32 | Message( 33 | id: 3, 34 | text: 'I am fine', 35 | isMe: false, 36 | createdAt: '2:32 PM', 37 | ), 38 | Message( 39 | id: 4, 40 | text: 'And you?', 41 | isMe: false, 42 | createdAt: '2:33 PM', 43 | ), 44 | Message( 45 | id: 5, 46 | text: 'I am fine too', 47 | isMe: true, 48 | createdAt: '2:34 PM', 49 | ), 50 | Message( 51 | id: 6, 52 | text: 'Did you finished the task?', 53 | isMe: true, 54 | createdAt: '2:35 PM', 55 | ), 56 | Message( 57 | id: 7, 58 | text: 'ahh, I finished it', 59 | isMe: false, 60 | createdAt: '2:36 PM', 61 | ), 62 | Message( 63 | id: 8, 64 | text: 'no, I am still working on it', 65 | isMe: false, 66 | createdAt: '2:37 PM', 67 | ), 68 | Message( 69 | id: 9, 70 | text: 'maybe you can help me 🥹', 71 | isMe: false, 72 | createdAt: '2:38 PM', 73 | ), 74 | ], 75 | ), 76 | Chat( 77 | id: 2, 78 | unReadCount: 1, 79 | lastMessageAt: "10:30 PM", 80 | user: User( 81 | id: 2, 82 | email: "blalb@gmail.com", 83 | name: 'Emma', 84 | profile: 'https://images.pexels.com/photos/1758845/pexels-photo-1758845.jpeg?auto=compress&cs=tinysrgb&crop=faces&fit=crop&h=200&w=200', 85 | ), 86 | messages: [ 87 | Message( 88 | id: 1, 89 | text: 'Hello', 90 | isMe: false, 91 | createdAt: '2:30 PM', 92 | ), 93 | Message( 94 | id: 2, 95 | text: 'How are you?', 96 | isMe: true, 97 | createdAt: '2:31 PM', 98 | ), 99 | Message( 100 | id: 3, 101 | text: 'I am fine', 102 | isMe: false, 103 | createdAt: '2:32 PM', 104 | ), 105 | ], 106 | ), 107 | Chat( 108 | id: 3, 109 | unReadCount: 0, 110 | lastMessageAt: "05:30 AM", 111 | user: User( 112 | id: 2, 113 | email: "blalb@gmail.com", 114 | name: 'Alex', 115 | profile: 'https://images.unsplash.com/photo-1503593245033-a040be3f3c82?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=200&fit=max&s=ca8c652b62b1f14c9c4c969289a8b33c', 116 | ), 117 | messages: [ 118 | Message( 119 | id: 1, 120 | text: 'Hello', 121 | isMe: false, 122 | createdAt: '2:30 PM', 123 | ), 124 | Message( 125 | id: 2, 126 | text: 'How are you?', 127 | isMe: true, 128 | createdAt: '2:31 PM', 129 | ), 130 | Message( 131 | id: 3, 132 | text: 'great', 133 | isMe: false, 134 | createdAt: '2:32 PM', 135 | ), 136 | ], 137 | ), 138 | Chat( 139 | id: 4, 140 | unReadCount: 0, 141 | lastMessageAt: "03:30 PM", 142 | user: User( 143 | id: 2, 144 | email: "blalb@gmail.com", 145 | name: 'Amelia', 146 | profile: 'https://images.unsplash.com/photo-1502033303885-c6e0280a4f5c?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=200&fit=max&s=9be99762d86ae47ab59690f72d984be6', 147 | ), 148 | messages: [ 149 | Message( 150 | id: 1, 151 | text: 'Hello', 152 | isMe: false, 153 | createdAt: '2:30 PM', 154 | ), 155 | Message( 156 | id: 2, 157 | text: 'How are you?', 158 | isMe: true, 159 | createdAt: '2:31 PM', 160 | ), 161 | Message( 162 | id: 3, 163 | text: 'ok, cool 😀', 164 | isMe: false, 165 | createdAt: '2:32 PM', 166 | ), 167 | ], 168 | ), 169 | Chat( 170 | id: 5, 171 | unReadCount: 0, 172 | lastMessageAt: "00:30 AM", 173 | user: User( 174 | id: 2, 175 | email: "blalb@gmail.com", 176 | name: 'Ericson', 177 | profile: 'https://randomuser.me/api/portraits/men/16.jpg', 178 | ), 179 | messages: [ 180 | Message( 181 | id: 1, 182 | text: 'Hello', 183 | isMe: false, 184 | createdAt: '2:30 PM', 185 | ), 186 | Message( 187 | id: 2, 188 | text: 'How are you?', 189 | isMe: true, 190 | createdAt: '2:31 PM', 191 | ), 192 | Message( 193 | id: 3, 194 | text: 'bro, did you take the test?', 195 | isMe: false, 196 | createdAt: '2:32 PM', 197 | ), 198 | ], 199 | ), 200 | Chat( 201 | id: 6, 202 | unReadCount: 0, 203 | lastMessageAt: "00:30 AM", 204 | user: User( 205 | id: 2, 206 | email: "blalb@gmail.com", 207 | name: 'Izaak', 208 | profile: 'https://images.unsplash.com/photo-1505503693641-1926193e8d57?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=200&fit=max&s=3422df4a46d2c81c35bf4687a2fa9c52', 209 | ), 210 | messages: [ 211 | Message( 212 | id: 1, 213 | text: 'Hello', 214 | isMe: false, 215 | createdAt: '2:30 PM', 216 | ), 217 | Message( 218 | id: 2, 219 | text: 'How are you?', 220 | isMe: true, 221 | createdAt: '2:31 PM', 222 | ), 223 | Message( 224 | id: 3, 225 | text: 'bro, did you take the test?', 226 | isMe: false, 227 | createdAt: '2:32 PM', 228 | ), 229 | ], 230 | ), 231 | Chat( 232 | id: 7, 233 | unReadCount: 0, 234 | lastMessageAt: "01:30 AM", 235 | user: User( 236 | id: 2, 237 | email: "blalb@gmail.com", 238 | name: 'Sophia', 239 | profile: 'https://images.pexels.com/photos/590415/pexels-photo-590415.jpeg?h=350&auto=compress&cs=tinysrgb', 240 | ), 241 | messages: [ 242 | Message( 243 | id: 1, 244 | text: 'Hello', 245 | isMe: false, 246 | createdAt: '2:30 PM', 247 | ), 248 | Message( 249 | id: 2, 250 | text: 'How are you?', 251 | isMe: true, 252 | createdAt: '2:31 PM', 253 | ), 254 | Message( 255 | id: 3, 256 | text: '❤️', 257 | isMe: false, 258 | createdAt: '2:32 PM', 259 | ), 260 | ], 261 | ), 262 | Chat( 263 | id: 8, 264 | unReadCount: 0, 265 | lastMessageAt: "yesterday", 266 | user: User( 267 | id: 2, 268 | email: "blalb@gmail.com", 269 | name: 'Mia', 270 | profile: 'https://api.uifaces.co/our-content/donated/AVQ0V28X.jpg', 271 | ), 272 | messages: [ 273 | Message( 274 | id: 1, 275 | text: 'Hello', 276 | isMe: false, 277 | createdAt: '2:30 PM', 278 | ), 279 | Message( 280 | id: 2, 281 | text: 'How are you?', 282 | isMe: true, 283 | createdAt: '2:31 PM', 284 | ), 285 | Message( 286 | id: 3, 287 | text: 'I am really happy to see you 😀', 288 | isMe: false, 289 | createdAt: '2:32 PM', 290 | ), 291 | ], 292 | ), 293 | Chat( 294 | id: 8, 295 | unReadCount: 0, 296 | lastMessageAt: "yesterday", 297 | user: User( 298 | id: 2, 299 | email: "blalb@gmail.com", 300 | name: 'Ava', 301 | profile: 'https://images.pexels.com/photos/247206/pexels-photo-247206.jpeg?auto=compress&cs=tinysrgb&crop=faces&fit=crop&h=200&w=200', 302 | ), 303 | messages: [ 304 | Message( 305 | id: 1, 306 | text: 'Hello', 307 | isMe: false, 308 | createdAt: '2:30 PM', 309 | ), 310 | Message( 311 | id: 2, 312 | text: 'How are you?', 313 | isMe: true, 314 | createdAt: '2:31 PM', 315 | ), 316 | Message( 317 | id: 3, 318 | text: 'I am really happy to see you 😀', 319 | isMe: false, 320 | createdAt: '2:32 PM', 321 | ), 322 | ], 323 | ), 324 | ]; 325 | } 326 | -------------------------------------------------------------------------------- /lib/data/user.dart: -------------------------------------------------------------------------------- 1 | library data; 2 | 3 | import 'package:day60/models/story/story.dart'; 4 | import 'package:day60/models/user/user.dart'; 5 | 6 | User getUser() { 7 | return User( 8 | id: 1, 9 | name: 'Olivia', 10 | email: '', 11 | stories: [ 12 | Story(url: 'https://images.unsplash.com/photo-1658121901015-6de110fb0653?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHx0b3BpYy1mZWVkfDV8NnNNVmpUTFNrZVF8fGVufDB8fHx8&auto=format&fit=crop&w=800&q=60'), 13 | Story(url: 'https://images.unsplash.com/photo-1658171402485-d7b2d4d776db?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHx0b3BpYy1mZWVkfDE0fDZzTVZqVExTa2VRfHxlbnwwfHx8fA%3D%3D&auto=format&fit=crop&w=800&q=60'), 14 | Story(url: 'https://images.unsplash.com/photo-1657904433191-02608d17b567?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHx0b3BpYy1mZWVkfDMzfDZzTVZqVExTa2VRfHxlbnwwfHx8fA%3D%3D&auto=format&fit=crop&w=800&q=60'), 15 | Story(url: 'https://images.unsplash.com/photo-1657918225993-93320b8533e0?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHx0b3BpYy1mZWVkfDMyfDZzTVZqVExTa2VRfHxlbnwwfHx8fA%3D%3D&auto=format&fit=crop&w=800&q=60') 16 | ], 17 | profile: 'https://images.pexels.com/photos/1855582/pexels-photo-1855582.jpeg?auto=compress&cs=tinysrgb&crop=faces&fit=crop&h=200&w=200', 18 | ); 19 | } 20 | -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:day60/pages/call/video/video_call_page.dart'; 2 | import 'package:day60/pages/home/home_page.dart'; 3 | import 'package:day60/pages/message_page.dart'; 4 | import 'package:day60/pages/story/story_page.dart'; 5 | import 'package:flutter/material.dart'; 6 | 7 | void main() { 8 | runApp(MaterialApp( 9 | debugShowCheckedModeBanner: false, 10 | home: HomePage(), 11 | routes: { 12 | '/message': (context) => MessagePage(), 13 | '/story': (context) => StoryPage(), 14 | '/video-call':(context) => VideoCallPage(), 15 | }, 16 | )); 17 | } 18 | -------------------------------------------------------------------------------- /lib/models/chat/chat.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | 3 | import 'package:day60/models/message/message.dart'; 4 | import 'package:day60/models/user/user.dart'; 5 | 6 | Chat chatFromJson(String str) => Chat.fromJson(json.decode(str)); 7 | 8 | String chatToJson(Chat data) => json.encode(data.toJson()); 9 | 10 | class Chat { 11 | Chat({ 12 | required this.id, 13 | required this.user, 14 | required this.messages, 15 | required this.unReadCount, 16 | required this.lastMessageAt, 17 | }); 18 | 19 | int id; 20 | User user; 21 | List messages; 22 | int unReadCount; 23 | String lastMessageAt; 24 | 25 | Chat copy() => Chat( 26 | id: id, 27 | user: user, 28 | messages: messages, 29 | unReadCount: unReadCount, 30 | lastMessageAt: lastMessageAt, 31 | ); 32 | 33 | Chat copyWith({ 34 | required int id, 35 | required User user, 36 | required List messages, 37 | required int unReadCount, 38 | required String lastMessageAt, 39 | }) => 40 | Chat( 41 | id: id, 42 | user: user, 43 | messages: messages, 44 | unReadCount: unReadCount, 45 | lastMessageAt: lastMessageAt 46 | ); 47 | 48 | factory Chat.fromJson(Map json) => Chat( 49 | id: json["id"], 50 | user: User.fromJson(json["user"]), 51 | unReadCount: json["unReadCount"], 52 | lastMessageAt: json["lastMessageAt"], 53 | messages: List.from(json["messages"].map((x) => Message.fromJson(x))), 54 | ); 55 | 56 | Map toJson() => { 57 | "id": id, 58 | "user": user.toJson(), 59 | "unReadCount": unReadCount, 60 | "lastMessageAt": lastMessageAt, 61 | "messages": List.from(messages.map((x) => x.toJson())), 62 | }; 63 | } 64 | -------------------------------------------------------------------------------- /lib/models/message/message.dart: -------------------------------------------------------------------------------- 1 | 2 | class Message { 3 | Message({ 4 | required this.id, 5 | this.text, 6 | this.type, 7 | this.attachment, 8 | this.voice, 9 | required this.createdAt, 10 | required this.isMe, 11 | }); 12 | 13 | int id; 14 | String? text; 15 | String? type; 16 | String? attachment; 17 | String? voice; 18 | String createdAt; 19 | bool isMe; 20 | 21 | Message copyWith({ 22 | required int id, 23 | String? text, 24 | String? type, 25 | String? attachment, 26 | String? voice, 27 | required String createdAt, 28 | required bool isMe, 29 | }) => 30 | Message( 31 | id: id, 32 | text: text, 33 | type: type, 34 | attachment: attachment, 35 | voice: voice, 36 | isMe: isMe, 37 | createdAt: createdAt, 38 | ); 39 | 40 | factory Message.fromJson(Map json) => Message( 41 | id: json["id"], 42 | text: json["text"], 43 | type: json["type"], 44 | attachment: json["attachment"], 45 | voice: json["voice"], 46 | isMe: json["isMe"], 47 | createdAt: json["createdAt"], 48 | ); 49 | 50 | Map toJson() => { 51 | "id": id, 52 | "text": text, 53 | "type": type, 54 | "attachment": attachment, 55 | "voice": voice, 56 | "isMe": isMe, 57 | "createdAt": createdAt, 58 | }; 59 | } 60 | -------------------------------------------------------------------------------- /lib/models/story/story.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | 3 | Story storyFromJson(String str) => Story.fromJson(json.decode(str)); 4 | 5 | String storyToJson(Story data) => json.encode(data.toJson()); 6 | 7 | class Story { 8 | Story({ 9 | required this.url, 10 | }); 11 | 12 | String url; 13 | 14 | Story copyWith({required String url}) => Story(url: url); 15 | 16 | factory Story.fromJson(Map json) => Story( 17 | url: json["url"], 18 | ); 19 | 20 | Map toJson() => { 21 | "url": url, 22 | }; 23 | } 24 | -------------------------------------------------------------------------------- /lib/models/user/user.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | 3 | import 'package:day60/models/story/story.dart'; 4 | 5 | User userFromJson(String str) => User.fromJson(json.decode(str)); 6 | 7 | String userToJson(User data) => json.encode(data.toJson()); 8 | 9 | class User { 10 | User({ 11 | required this.id, 12 | required this.name, 13 | required this.email, 14 | required this.profile, 15 | this.stories, 16 | }); 17 | 18 | int id; 19 | String name; 20 | String email; 21 | String profile; 22 | List? stories; 23 | 24 | User copyWith({ 25 | required int id, 26 | required String name, 27 | required String email, 28 | required String profile, 29 | List? stories, 30 | }) => 31 | User( 32 | id: id, 33 | name: name, 34 | email: email, 35 | profile: profile, 36 | stories: stories, 37 | ); 38 | 39 | factory User.fromJson(Map json) => User( 40 | id: json["id"], 41 | name: json["name"], 42 | email: json["email"], 43 | profile: json["profile"], 44 | stories: List.from(json["stories"].map((x) => Story.fromJson(x))), 45 | ); 46 | 47 | Map toJson() => { 48 | "id": id, 49 | "name": name, 50 | "email": email, 51 | "profile": profile, 52 | "stories": List.from(stories!.map((x) => x.toJson())), 53 | }; 54 | } 55 | -------------------------------------------------------------------------------- /lib/pages/call/video/video_call_page.dart: -------------------------------------------------------------------------------- 1 | import 'dart:ui'; 2 | 3 | import 'package:animated_text_kit/animated_text_kit.dart'; 4 | import 'package:avatar_glow/avatar_glow.dart'; 5 | import 'package:cached_network_image/cached_network_image.dart'; 6 | import 'package:day60/models/chat/chat.dart'; 7 | import 'package:flutter/material.dart'; 8 | import 'package:flutter_hooks/flutter_hooks.dart'; 9 | 10 | class VideoCallPage extends HookWidget { 11 | VideoCallPage({Key? key}) : super(key: key); 12 | 13 | final String image = 'https://images.unsplash.com/photo-1627087820883-7a102b79179a?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1974&q=80'; 14 | 15 | @override 16 | Widget build(BuildContext context) { 17 | final theme = Theme.of(context); 18 | 19 | final Chat chat = ModalRoute.of(context)!.settings.arguments as Chat; 20 | 21 | return Scaffold( 22 | backgroundColor: Colors.black, 23 | // body: SafeArea( 24 | // child: Container( 25 | // height: double.infinity, 26 | // width: double.infinity, 27 | // padding: EdgeInsets.symmetric(horizontal: 8), 28 | // child: Column( 29 | // children: [ 30 | // Expanded( 31 | // child: Container( 32 | // width: double.infinity, 33 | // clipBehavior: Clip.hardEdge, 34 | // decoration: BoxDecoration( 35 | // borderRadius: BorderRadius.circular(16) 36 | // ), 37 | // child: CachedNetworkImage( 38 | // imageUrl: image, 39 | // fit: BoxFit.cover, 40 | // ), 41 | // ), 42 | // ), 43 | // SizedBox(height: 16,), 44 | // Expanded( 45 | // child: Container( 46 | // width: double.infinity, 47 | // clipBehavior: Clip.hardEdge, 48 | // decoration: BoxDecoration( 49 | // borderRadius: BorderRadius.circular(16) 50 | // ), 51 | // child: CachedNetworkImage( 52 | // imageUrl: chat.user.profile, 53 | // fit: BoxFit.cover, 54 | // ), 55 | // ), 56 | // ), 57 | // SizedBox(height: 20,), 58 | // Row( 59 | // children: [ 60 | // MaterialButton( 61 | // onPressed: () {}, 62 | // color: Colors.grey.shade700, 63 | // child: Icon(Icons.videocam, color: Colors.white,), 64 | // ) 65 | // ], 66 | // ), 67 | // SizedBox(height: 20,), 68 | // ], 69 | // ), 70 | // ), 71 | // ), 72 | body: Container( 73 | width: double.infinity, 74 | height: double.infinity, 75 | decoration: BoxDecoration( 76 | image: DecorationImage( 77 | image: CachedNetworkImageProvider(chat.user.profile), 78 | fit: BoxFit.cover, 79 | ), 80 | ), 81 | child: BackdropFilter( 82 | filter: ImageFilter.blur(sigmaX: 20, sigmaY: 20), 83 | child: Container( 84 | decoration: BoxDecoration( 85 | gradient: LinearGradient( 86 | begin: Alignment.bottomCenter, 87 | end: Alignment.topCenter, 88 | colors: [ 89 | Colors.black.withOpacity(1), 90 | Colors.black.withOpacity(0.3), 91 | Colors.black.withOpacity(0), 92 | ] 93 | ) 94 | ), 95 | child: Column( 96 | mainAxisAlignment: MainAxisAlignment.spaceEvenly, 97 | children: [ 98 | Column( 99 | children: [ 100 | AvatarGlow( 101 | startDelay: Duration(milliseconds: 0), 102 | glowColor: Colors.white, 103 | endRadius: 80, 104 | duration: Duration(milliseconds: 2000), 105 | repeatPauseDuration: Duration(milliseconds: 0), 106 | showTwoGlows: true, 107 | repeat: true, 108 | child: Container( 109 | width: 100, 110 | height: 100, 111 | clipBehavior: Clip.hardEdge, 112 | decoration: BoxDecoration( 113 | borderRadius: BorderRadius.circular(80), 114 | boxShadow: [ 115 | BoxShadow( 116 | color: Colors.black12, 117 | blurRadius: 10, 118 | offset: Offset(0, 10), 119 | ), 120 | ] 121 | ), 122 | child: CachedNetworkImage( 123 | imageUrl: chat.user.profile, 124 | placeholder: (context, url) => CircularProgressIndicator(), 125 | errorWidget: (context, url, error) => Icon(Icons.error), 126 | ), 127 | ), 128 | ), 129 | SizedBox(height: 10), 130 | Text(chat.user.name, style: theme.textTheme.headline5?.copyWith(color: Colors.white, fontWeight: FontWeight.bold)), 131 | SizedBox(height: 8), 132 | Row( 133 | mainAxisAlignment: MainAxisAlignment.center, 134 | children: [ 135 | Text('Calling', style: theme.textTheme.bodySmall?.copyWith(color: Colors.grey.shade200)), 136 | DefaultTextStyle( 137 | style: TextStyle( 138 | fontSize: 12.0, 139 | ), 140 | child: AnimatedTextKit( 141 | animatedTexts: [ 142 | TyperAnimatedText('.....', speed: Duration(milliseconds: 500)), 143 | ], 144 | isRepeatingAnimation: true, 145 | repeatForever: true, 146 | ), 147 | ), 148 | ], 149 | ), 150 | ], 151 | ), 152 | MaterialButton( 153 | onPressed: () { 154 | Navigator.pop(context); 155 | }, 156 | color: Colors.red, 157 | shape: RoundedRectangleBorder( 158 | borderRadius: BorderRadius.circular(80), 159 | ), 160 | padding: EdgeInsets.zero, 161 | minWidth: 70, 162 | height: 70 , 163 | 164 | child: Icon(Icons.call_end, color: Colors.white, size: 30), 165 | ) 166 | ], 167 | ), 168 | ), 169 | ), 170 | ), 171 | ); 172 | } 173 | } 174 | -------------------------------------------------------------------------------- /lib/pages/home/home_page.dart: -------------------------------------------------------------------------------- 1 | import 'package:day60/pages/home/tabs/chat_tab.dart'; 2 | import 'package:day60/pages/home/tabs/explore_tab.dart'; 3 | import 'package:day60/pages/home/tabs/notification_tab.dart'; 4 | import 'package:day60/pages/home/tabs/user_tab.dart'; 5 | import 'package:day60/shared/constants/color_constants.dart'; 6 | import 'package:flutter/material.dart'; 7 | import 'package:iconsax/iconsax.dart'; 8 | 9 | class HomePage extends StatefulWidget { 10 | const HomePage({Key? key}) : super(key: key); 11 | 12 | @override 13 | State createState() => _HomePageState(); 14 | } 15 | 16 | class _HomePageState extends State { 17 | final tabs = [ 18 | ExploreTab(), 19 | ChatTab(), 20 | NotificationTab(), 21 | UserTab(), 22 | ]; 23 | 24 | late PageController _pageController; 25 | int currentTab = 1; 26 | 27 | goToTab(int page) { 28 | setState(() { 29 | currentTab = page; 30 | }); 31 | 32 | _pageController.jumpToPage(page); 33 | } 34 | 35 | @override 36 | void initState() { 37 | _pageController = PageController(initialPage: 1); 38 | 39 | super.initState(); 40 | } 41 | 42 | @override 43 | Widget build(BuildContext context) { 44 | return Scaffold( 45 | body: PageView( 46 | children: tabs, 47 | controller: _pageController, 48 | ), 49 | bottomNavigationBar: BottomAppBar( 50 | color: ColorConstants.lightBackgroundColor, 51 | elevation: 0, 52 | notchMargin: 10, 53 | child: Container( 54 | height: 60, 55 | padding: EdgeInsets.symmetric(horizontal: 25, vertical: 10), 56 | child: Row( 57 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 58 | children: [ 59 | _bottomAppBarItem(icon: Iconsax.home5, page: 0), 60 | _bottomAppBarItem(icon: Iconsax.message5, page: 1), 61 | _bottomAppBarItem(icon: Iconsax.notification5, page: 2), 62 | _bottomAppBarItem(icon: Iconsax.category5, page: 3), 63 | ], 64 | ), 65 | ), 66 | ), 67 | ); 68 | } 69 | 70 | Widget _bottomAppBarItem({icon, page}) { 71 | return IconButton( 72 | splashRadius: 20, 73 | onPressed: () => goToTab(page), 74 | icon: Icon( 75 | icon, 76 | color: currentTab == page ? ColorConstants.primaryColor : Colors.blueGrey.shade200, 77 | size: 22, 78 | ), 79 | ); 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /lib/pages/home/tabs/chat_tab.dart: -------------------------------------------------------------------------------- 1 | import 'package:day60/data/chat.dart'; 2 | import 'package:day60/pages/home/tabs/components/chat_widget.dart'; 3 | import 'package:day60/pages/home/tabs/components/story_list.dart'; 4 | import 'package:day60/shared/constants/color_constants.dart'; 5 | import 'package:flutter/material.dart'; 6 | import 'package:iconsax/iconsax.dart'; 7 | 8 | class ChatTab extends StatefulWidget { 9 | const ChatTab({Key? key}) : super(key: key); 10 | 11 | @override 12 | State createState() => _ChatTabState(); 13 | } 14 | 15 | class _ChatTabState extends State { 16 | final chats = getChats(); 17 | 18 | @override 19 | Widget build(BuildContext context) { 20 | final theme = Theme.of(context); 21 | 22 | return Scaffold( 23 | appBar: AppBar( 24 | backgroundColor: ColorConstants.lightBackgroundColor, 25 | elevation: 0, 26 | title: Text('Chat', style: TextStyle(color: Colors.black, fontSize: 26, fontWeight: FontWeight.w700),), 27 | centerTitle: false, 28 | actions: [ 29 | IconButton( 30 | splashRadius: 20, 31 | icon: Icon(Iconsax.search_normal_1, color: Colors.black, size: 22,), 32 | onPressed: () {}, 33 | ), 34 | ], 35 | ), 36 | body: SingleChildScrollView( 37 | child: Column( 38 | crossAxisAlignment: CrossAxisAlignment.start, 39 | children: [ 40 | SizedBox(height: 20,), 41 | StoryList(), 42 | SizedBox(height: 10,), 43 | Padding( 44 | padding: const EdgeInsets.all(16.0), 45 | child: Text("Chats", style: theme.textTheme.subtitle1?.copyWith(fontWeight: FontWeight.bold, fontSize: 18),), 46 | ), 47 | Column( 48 | children: chats.map((e) => Column( 49 | children: [ 50 | ChatWidget(chat: e), 51 | chats.indexOf(e) != chats.length - 1 ? Divider(indent: 80, height: 1, endIndent: 16,) : SizedBox(), 52 | ], 53 | )).toList(), 54 | ), 55 | ], 56 | ), 57 | ), 58 | ); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /lib/pages/home/tabs/components/chat_widget.dart: -------------------------------------------------------------------------------- 1 | import 'package:cached_network_image/cached_network_image.dart'; 2 | import 'package:day60/models/chat/chat.dart'; 3 | import 'package:flutter/material.dart'; 4 | 5 | class ChatWidget extends StatefulWidget { 6 | final Chat chat; 7 | const ChatWidget({Key? key, required this.chat}) : super(key: key); 8 | 9 | @override 10 | State createState() => _ChatWidgetState(); 11 | } 12 | 13 | class _ChatWidgetState extends State { 14 | @override 15 | Widget build(BuildContext context) { 16 | final theme = Theme.of(context); 17 | return ListTile( 18 | onTap: () { 19 | var chat = widget.chat.copy(); 20 | chat.messages = chat.messages.reversed.toList(); 21 | 22 | Navigator.pushNamed(context, '/message', arguments: chat); 23 | }, 24 | leading: CircleAvatar( 25 | radius: 30, 26 | backgroundColor: Colors.grey.shade300, 27 | backgroundImage: CachedNetworkImageProvider(widget.chat.user.profile), 28 | ), 29 | title: Text(widget.chat.user.name, style: theme.textTheme.subtitle1?.copyWith(fontSize: 16, fontWeight: FontWeight.bold),), 30 | visualDensity: VisualDensity.adaptivePlatformDensity, 31 | subtitle: Padding( 32 | padding: EdgeInsets.only(top: 8.0), 33 | child: Text(widget.chat.messages.last.text!, style: theme.textTheme.bodyText2?.copyWith(color: Colors.blueGrey.shade400),), 34 | ), 35 | trailing: widget.chat.unReadCount > 0 ? Column( 36 | crossAxisAlignment: CrossAxisAlignment.end, 37 | children: [ 38 | Container( 39 | padding: EdgeInsets.all(5), 40 | decoration: BoxDecoration( 41 | shape: BoxShape.circle, 42 | color: Colors.red 43 | ), 44 | child: Text(widget.chat.unReadCount.toString(), style: theme.textTheme.bodySmall?.copyWith(fontWeight: FontWeight.w600, color: Colors.white),), 45 | ), 46 | SizedBox(height: 8,), 47 | Text(widget.chat.lastMessageAt, style: theme.textTheme.bodyText2?.copyWith(color: Colors.blueGrey.shade300),), 48 | ], 49 | ) : Text(widget.chat.lastMessageAt, style: theme.textTheme.bodyText2?.copyWith(color: Colors.blueGrey.shade300),), 50 | ); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /lib/pages/home/tabs/components/message_widget.dart: -------------------------------------------------------------------------------- 1 | import 'package:day60/models/message/message.dart'; 2 | import 'package:flutter/material.dart'; 3 | 4 | class MessageWidget extends StatelessWidget { 5 | final Message message; 6 | const MessageWidget({Key? key, required this.message}) : super(key: key); 7 | 8 | @override 9 | Widget build(BuildContext context) { 10 | final theme = Theme.of(context); 11 | 12 | if (message.isMe) { 13 | return Row( 14 | mainAxisAlignment: MainAxisAlignment.end, 15 | children: [ 16 | Container( 17 | constraints: BoxConstraints( 18 | maxWidth: 250 19 | ), 20 | padding: EdgeInsets.all(8), 21 | margin: EdgeInsets.only(right: 8, bottom: 8), 22 | decoration: BoxDecoration( 23 | borderRadius: BorderRadius.circular(8), 24 | color: Color(0xff1972F5), 25 | ), 26 | child: Column( 27 | crossAxisAlignment: CrossAxisAlignment.end, 28 | children: [ 29 | Text(message.text!, style: theme.textTheme.bodyText2?.copyWith(color: Colors.white)), 30 | SizedBox(height: 4,), 31 | Text(message.createdAt, style: theme.textTheme.bodySmall?.copyWith(color: Colors.grey.shade300)), 32 | ], 33 | ), 34 | ), 35 | ], 36 | ); 37 | } else { 38 | return Row( 39 | children: [ 40 | Container( 41 | constraints: BoxConstraints( 42 | maxWidth: 250 43 | ), 44 | padding: EdgeInsets.all(8), 45 | margin: EdgeInsets.only(left: 8, bottom: 8), 46 | decoration: BoxDecoration( 47 | borderRadius: BorderRadius.circular(8), 48 | color: Color.fromARGB(255, 225, 231, 236), 49 | ), 50 | child: Column( 51 | crossAxisAlignment: CrossAxisAlignment.start, 52 | children: [ 53 | Text(message.text!, style: theme.textTheme.bodyText2), 54 | SizedBox(height: 4,), 55 | Text(message.createdAt, style: theme.textTheme.bodySmall), 56 | ], 57 | ), 58 | ), 59 | ], 60 | ); 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /lib/pages/home/tabs/components/story_list.dart: -------------------------------------------------------------------------------- 1 | import 'package:day60/data/user.dart'; 2 | import 'package:day60/models/story/story.dart'; 3 | import 'package:day60/models/user/user.dart'; 4 | import 'package:day60/pages/home/tabs/components/story_widget.dart'; 5 | import 'package:flutter/material.dart'; 6 | import 'package:iconsax/iconsax.dart'; 7 | 8 | class StoryList extends StatefulWidget { 9 | const StoryList({Key? key}) : super(key: key); 10 | 11 | @override 12 | State createState() => _StoryListState(); 13 | } 14 | 15 | class _StoryListState extends State { 16 | final stories = [ 17 | Story(url: 'https://images.pexels.com/photos/838875/pexels-photo-838875.jpeg?auto=compress&cs=tinysrgb&crop=faces&fit=crop&h=200&w=200'), 18 | Story(url: 'https://images.pexels.com/photos/1438275/pexels-photo-1438275.jpeg?auto=compress&cs=tinysrgb&crop=faces&fit=crop&h=200&w=200'), 19 | Story(url: 'https://images.pexels.com/photos/576924/pexels-photo-576924.jpeg?crop=faces&fit=crop&h=200&w=200&auto=compress&cs=tinysrgb'), 20 | Story(url: 'https://images.pexels.com/photos/247206/pexels-photo-247206.jpeg?auto=compress&cs=tinysrgb&crop=faces&fit=crop&h=200&w=200'), 21 | Story(url: 'https://images.pexels.com/photos/1130626/pexels-photo-1130626.jpeg?auto=compress&cs=tinysrgb&crop=faces&fit=crop&h=200&w=200'), 22 | Story(url: 'https://images.pexels.com/photos/1878522/pexels-photo-1878522.jpeg?auto=compress&cs=tinysrgb&h=350'), 23 | Story(url: 'https://images.pexels.com/photos/247917/pexels-photo-247917.jpeg?crop=faces&fit=crop&h=200&w=200&auto=compress&cs=tinysrgb'), 24 | Story(url: 'https://images.pexels.com/photos/1855582/pexels-photo-1855582.jpeg?auto=compress&cs=tinysrgb&crop=faces&fit=crop&h=200&w=200'), 25 | Story(url: 'https://images.pexels.com/photos/1758845/pexels-photo-1758845.jpeg?auto=compress&cs=tinysrgb&crop=faces&fit=crop&h=200&w=200'), 26 | ]; 27 | 28 | final User user = getUser(); 29 | 30 | @override 31 | Widget build(BuildContext context) { 32 | return Container( 33 | height: 60, 34 | child: ListView.builder( 35 | padding: EdgeInsets.symmetric(horizontal: 16), 36 | scrollDirection: Axis.horizontal, 37 | itemCount: stories.length, 38 | itemBuilder: (context, index) { 39 | if (index == 0) { 40 | return Container( 41 | width: 60, 42 | margin: EdgeInsets.only(right: 8), 43 | decoration: BoxDecoration( 44 | shape: BoxShape.circle, 45 | color: Colors.blueGrey.shade50, 46 | border: Border.all(color: Colors.grey.shade300, width: 2), 47 | ), 48 | child: Center( 49 | child: Icon(Iconsax.add, color: Colors.blueGrey.shade300, size: 30,), 50 | ), 51 | ); 52 | } 53 | 54 | return InkWell( 55 | onTap: () => Navigator.pushNamed(context, '/story', arguments: user), 56 | child: StoryWidget(image: stories[index].url,)); 57 | }, 58 | ), 59 | ); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /lib/pages/home/tabs/components/story_widget.dart: -------------------------------------------------------------------------------- 1 | import 'package:cached_network_image/cached_network_image.dart'; 2 | import 'package:flutter/material.dart'; 3 | 4 | class StoryWidget extends StatelessWidget { 5 | final String image; 6 | const StoryWidget({Key? key, required this.image}) : super(key: key); 7 | 8 | @override 9 | Widget build(BuildContext context) { 10 | return Container( 11 | width: 60, 12 | height: 60, 13 | padding: EdgeInsets.all(2), 14 | margin: EdgeInsets.only(right: 8), 15 | decoration: BoxDecoration( 16 | gradient: LinearGradient( 17 | begin: Alignment.topLeft, 18 | end: Alignment.bottomCenter, 19 | colors: [ 20 | Colors.red, 21 | Colors.yellow, 22 | ], 23 | ), 24 | shape: BoxShape.circle, 25 | ), 26 | child: Container( 27 | decoration: BoxDecoration( 28 | color: Colors.white, 29 | shape: BoxShape.circle 30 | ), 31 | padding: const EdgeInsets.all(2.0), 32 | child: CircleAvatar( 33 | backgroundColor: Colors.grey.shade300, 34 | backgroundImage: CachedNetworkImageProvider(image), 35 | // backgroundImage: Image.network(image, fit: BoxFit.cover,).image, 36 | ), 37 | ), 38 | ); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /lib/pages/home/tabs/explore_tab.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class ExploreTab extends StatefulWidget { 4 | @override 5 | _ExploreTabState createState() => _ExploreTabState(); 6 | } 7 | 8 | class _ExploreTabState extends State { 9 | @override 10 | Widget build(BuildContext context) { 11 | return Scaffold( 12 | backgroundColor: Colors.white, 13 | body: Column( 14 | crossAxisAlignment: CrossAxisAlignment.start, 15 | children: [ 16 | Container( 17 | height: 120, 18 | padding: EdgeInsets.only(top: 50, right: 20, left: 20, bottom: 10), 19 | child: Row( 20 | children: [ 21 | Expanded( 22 | child: Container( 23 | decoration: BoxDecoration( 24 | borderRadius: BorderRadius.circular(50), 25 | color: Colors.grey[200] 26 | ), 27 | child: TextField( 28 | decoration: InputDecoration( 29 | prefixIcon: Icon(Icons.search, color: Colors.grey,), 30 | border: InputBorder.none, 31 | hintStyle: TextStyle(color: Colors.grey), 32 | hintText: "Search", 33 | ), 34 | ), 35 | ), 36 | ), 37 | SizedBox(width: 20,), 38 | Icon(Icons.camera_alt, color: Colors.grey[800], size: 30,) 39 | ], 40 | ), 41 | ), 42 | Expanded( 43 | child: SingleChildScrollView( 44 | scrollDirection: Axis.vertical, 45 | child: Padding( 46 | padding: EdgeInsets.all(20), 47 | child: Column( 48 | crossAxisAlignment: CrossAxisAlignment.start, 49 | children: [ 50 | Row( 51 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 52 | crossAxisAlignment: CrossAxisAlignment.baseline, 53 | textBaseline: TextBaseline.alphabetic, 54 | children: [ 55 | Text("Stories", style: TextStyle(color: Colors.grey[900], fontWeight: FontWeight.bold, fontSize: 22, letterSpacing: 1.2),), 56 | Text("See Archive"), 57 | ], 58 | ), 59 | SizedBox(height: 20,), 60 | Container( 61 | height: 180, 62 | child: ListView( 63 | scrollDirection: Axis.horizontal, 64 | children: [ 65 | makeStory( 66 | storyImage: 'https://images.pexels.com/photos/1855582/pexels-photo-1855582.jpeg?auto=compress&cs=tinysrgb&crop=faces&fit=crop&h=200&w=200', 67 | userImage: 'https://images.pexels.com/photos/1855582/pexels-photo-1855582.jpeg?auto=compress&cs=tinysrgb&crop=faces&fit=crop&h=200&w=200', 68 | userName: 'Aatik Tasneem' 69 | ), 70 | makeStory( 71 | storyImage: 'https://images.pexels.com/photos/1855582/pexels-photo-1855582.jpeg?auto=compress&cs=tinysrgb&crop=faces&fit=crop&h=200&w=200', 72 | userImage: 'https://images.pexels.com/photos/1855582/pexels-photo-1855582.jpeg?auto=compress&cs=tinysrgb&crop=faces&fit=crop&h=200&w=200', 73 | userName: 'Aiony Haust' 74 | ), 75 | makeStory( 76 | storyImage: 'https://images.pexels.com/photos/1855582/pexels-photo-1855582.jpeg?auto=compress&cs=tinysrgb&crop=faces&fit=crop&h=200&w=200', 77 | userImage: 'https://images.pexels.com/photos/1855582/pexels-photo-1855582.jpeg?auto=compress&cs=tinysrgb&crop=faces&fit=crop&h=200&w=200', 78 | userName: 'Averie Woodard' 79 | ), 80 | makeStory( 81 | storyImage: 'https://images.pexels.com/photos/1855582/pexels-photo-1855582.jpeg?auto=compress&cs=tinysrgb&crop=faces&fit=crop&h=200&w=200', 82 | userImage: 'https://images.pexels.com/photos/1855582/pexels-photo-1855582.jpeg?auto=compress&cs=tinysrgb&crop=faces&fit=crop&h=200&w=200', 83 | userName: 'Azamat Zhanisov' 84 | ), 85 | ], 86 | ), 87 | ), 88 | SizedBox(height: 40,), 89 | makeFeed( 90 | userName: 'Aiony Haust', 91 | userImage: 'https://images.pexels.com/photos/1855582/pexels-photo-1855582.jpeg?auto=compress&cs=tinysrgb&crop=faces&fit=crop&h=200&w=200', 92 | feedTime: '1 hr ago', 93 | feedText: 'All the Lorem Ipsum generators on the Internet tend to repeat predefined.', 94 | feedImage: 'https://images.pexels.com/photos/1855582/pexels-photo-1855582.jpeg?auto=compress&cs=tinysrgb&crop=faces&fit=crop&h=200&w=200' 95 | ), 96 | makeFeed( 97 | userName: 'Azamat Zhanisov', 98 | userImage: 'https://images.pexels.com/photos/1855582/pexels-photo-1855582.jpeg?auto=compress&cs=tinysrgb&crop=faces&fit=crop&h=200&w=200', 99 | feedTime: '3 mins ago', 100 | feedText: "All the Lorem Ipsum generators on the Internet tend to repeat predefined.All the Lorem Ipsum generators on the Internet tend to repeat predefined.All the Lorem Ipsum generators on the Internet tend to repeat predefined.", 101 | feedImage: '' 102 | ), 103 | makeFeed( 104 | userName: 'Azamat Zhanisov', 105 | userImage: 'https://images.pexels.com/photos/1855582/pexels-photo-1855582.jpeg?auto=compress&cs=tinysrgb&crop=faces&fit=crop&h=200&w=200', 106 | feedTime: '3 mins ago', 107 | feedText: "All the Lorem Ipsum generators on the Internet tend to repeat predefined.", 108 | feedImage: 'https://images.pexels.com/photos/1855582/pexels-photo-1855582.jpeg?auto=compress&cs=tinysrgb&crop=faces&fit=crop&h=200&w=200' 109 | ), 110 | ], 111 | ), 112 | ), 113 | ), 114 | ) 115 | ], 116 | ), 117 | ); 118 | } 119 | 120 | 121 | Widget makeStory({storyImage, userImage, userName}) { 122 | return AspectRatio( 123 | aspectRatio: 1.6 / 2, 124 | child: Container( 125 | margin: EdgeInsets.only(right: 10), 126 | decoration: BoxDecoration( 127 | borderRadius: BorderRadius.circular(15), 128 | image: DecorationImage( 129 | image: NetworkImage(storyImage), 130 | fit: BoxFit.cover 131 | ), 132 | ), 133 | child: Container( 134 | padding: EdgeInsets.all(10), 135 | decoration: BoxDecoration( 136 | borderRadius: BorderRadius.circular(15), 137 | gradient: LinearGradient( 138 | begin: Alignment.bottomRight, 139 | colors: [ 140 | Colors.black.withOpacity(.9), 141 | Colors.black.withOpacity(.1), 142 | ] 143 | ) 144 | ), 145 | child: Column( 146 | crossAxisAlignment: CrossAxisAlignment.start, 147 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 148 | children: [ 149 | Container( 150 | width: 40, 151 | height: 40, 152 | decoration: BoxDecoration( 153 | shape: BoxShape.circle, 154 | border: Border.all(color: Colors.white, width: 2), 155 | image: DecorationImage( 156 | image: NetworkImage(userImage), 157 | fit: BoxFit.cover 158 | ) 159 | ), 160 | ), 161 | Text(userName, style: TextStyle(color: Colors.white),) 162 | ], 163 | ), 164 | ), 165 | ), 166 | ); 167 | } 168 | 169 | Widget makeFeed({userName, userImage, feedTime, feedText, feedImage}) { 170 | return Container( 171 | margin: EdgeInsets.only(bottom: 20), 172 | child: Column( 173 | crossAxisAlignment: CrossAxisAlignment.start, 174 | children: [ 175 | Row( 176 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 177 | children: [ 178 | Row( 179 | children: [ 180 | Container( 181 | width: 50, 182 | height: 50, 183 | decoration: BoxDecoration( 184 | shape: BoxShape.circle, 185 | image: DecorationImage( 186 | image: NetworkImage(userImage), 187 | fit: BoxFit.cover 188 | ) 189 | ), 190 | ), 191 | SizedBox(width: 10,), 192 | Column( 193 | crossAxisAlignment: CrossAxisAlignment.start, 194 | children: [ 195 | Text(userName, style: TextStyle(color: Colors.grey[900], fontSize: 18, fontWeight: FontWeight.bold),), 196 | SizedBox(height: 3,), 197 | Text(feedTime, style: TextStyle(fontSize: 15, color: Colors.grey.shade500),), 198 | ], 199 | ) 200 | ], 201 | ), 202 | IconButton( 203 | icon: Icon(Icons.more_horiz, size: 30, color: Colors.grey[600],), 204 | onPressed: () {}, 205 | ) 206 | ], 207 | ), 208 | SizedBox(height: 20,), 209 | Text(feedText, style: TextStyle(fontSize: 15, color: Colors.black, height: 1.5),), 210 | SizedBox(height: 20,), 211 | feedImage != '' ? 212 | Container( 213 | height: 200, 214 | decoration: BoxDecoration( 215 | borderRadius: BorderRadius.circular(10), 216 | image: DecorationImage( 217 | image: NetworkImage(feedImage), 218 | fit: BoxFit.cover 219 | ) 220 | ), 221 | ) : Container(), 222 | SizedBox(height: 20,), 223 | Row( 224 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 225 | children: [ 226 | Row( 227 | children: [ 228 | makeLike(), 229 | Transform.translate( 230 | offset: Offset(-5, 0), 231 | child: makeLove() 232 | ), 233 | SizedBox(width: 5,), 234 | Text("2.5K", style: TextStyle(fontSize: 15, color: Colors.grey[800]),) 235 | ], 236 | ), 237 | Text("400 Comments", style: TextStyle(fontSize: 13, color: Colors.grey[800]),) 238 | ], 239 | ), 240 | SizedBox(height: 20,), 241 | Row( 242 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 243 | children: [ 244 | makeLikeButton(isActive: true), 245 | makeCommentButton(), 246 | makeShareButton(), 247 | ], 248 | ) 249 | ], 250 | ), 251 | ); 252 | } 253 | 254 | Widget makeLike() { 255 | return Container( 256 | width: 25, 257 | height: 25, 258 | decoration: BoxDecoration( 259 | color: Colors.blue, 260 | shape: BoxShape.circle, 261 | border: Border.all(color: Colors.white) 262 | ), 263 | child: Center( 264 | child: Icon(Icons.thumb_up, size: 12, color: Colors.white), 265 | ), 266 | ); 267 | } 268 | 269 | Widget makeLove() { 270 | return Container( 271 | width: 25, 272 | height: 25, 273 | decoration: BoxDecoration( 274 | color: Colors.red, 275 | shape: BoxShape.circle, 276 | border: Border.all(color: Colors.white) 277 | ), 278 | child: Center( 279 | child: Icon(Icons.favorite, size: 12, color: Colors.white), 280 | ), 281 | ); 282 | } 283 | Widget makeLikeButton({isActive}) { 284 | return Container( 285 | padding: EdgeInsets.symmetric(horizontal: 20, vertical: 5), 286 | decoration: BoxDecoration( 287 | border: Border.all(color: Colors.grey.shade200), 288 | borderRadius: BorderRadius.circular(50), 289 | ), 290 | child: Center( 291 | child: Row( 292 | mainAxisAlignment: MainAxisAlignment.center, 293 | children: [ 294 | Icon(Icons.thumb_up, color: isActive ? Colors.blue : Colors.grey, size: 18,), 295 | SizedBox(width: 5,), 296 | Text("Like", style: TextStyle(color: isActive ? Colors.blue : Colors.grey),) 297 | ], 298 | ), 299 | ), 300 | ); 301 | } 302 | Widget makeCommentButton() { 303 | return Container( 304 | padding: EdgeInsets.symmetric(horizontal: 20, vertical: 5), 305 | decoration: BoxDecoration( 306 | border: Border.all(color: Colors.grey.shade200), 307 | borderRadius: BorderRadius.circular(50), 308 | ), 309 | child: Center( 310 | child: Row( 311 | mainAxisAlignment: MainAxisAlignment.center, 312 | children: [ 313 | Icon(Icons.chat, color: Colors.grey, size: 18), 314 | SizedBox(width: 5,), 315 | Text("Comment", style: TextStyle(color: Colors.grey),) 316 | ], 317 | ), 318 | ), 319 | ); 320 | } 321 | Widget makeShareButton() { 322 | return Container( 323 | padding: EdgeInsets.symmetric(horizontal: 20, vertical: 5), 324 | decoration: BoxDecoration( 325 | border: Border.all(color: Colors.grey.shade200), 326 | borderRadius: BorderRadius.circular(50), 327 | ), 328 | child: Center( 329 | child: Row( 330 | mainAxisAlignment: MainAxisAlignment.center, 331 | children: [ 332 | Icon(Icons.share, color: Colors.grey, size: 18), 333 | SizedBox(width: 5,), 334 | Text("Share", style: TextStyle(color: Colors.grey),) 335 | ], 336 | ), 337 | ), 338 | ); 339 | } 340 | } 341 | -------------------------------------------------------------------------------- /lib/pages/home/tabs/notification_tab.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class NotificationTab extends StatefulWidget { 4 | const NotificationTab({Key? key}) : super(key: key); 5 | 6 | @override 7 | State createState() => _NotificationTabState(); 8 | } 9 | 10 | class _NotificationTabState extends State { 11 | @override 12 | Widget build(BuildContext context) { 13 | return Scaffold( 14 | body: Center( 15 | child: Text('Notification Tab'), 16 | ), 17 | ); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /lib/pages/home/tabs/user_tab.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class UserTab extends StatefulWidget { 4 | const UserTab({Key? key}) : super(key: key); 5 | 6 | @override 7 | State createState() => _UserTabState(); 8 | } 9 | 10 | class _UserTabState extends State { 11 | @override 12 | Widget build(BuildContext context) { 13 | return Scaffold( 14 | body: Center( 15 | child: Text('User Tab'), 16 | ), 17 | ); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /lib/pages/message_page.dart: -------------------------------------------------------------------------------- 1 | import 'package:day60/models/chat/chat.dart'; 2 | import 'package:day60/models/message/message.dart'; 3 | import 'package:day60/pages/home/tabs/components/message_widget.dart'; 4 | import 'package:day60/shared/constants/color_constants.dart'; 5 | import 'package:flutter/material.dart'; 6 | import 'package:simple_animations/simple_animations.dart'; 7 | 8 | class MessagePage extends StatefulWidget { 9 | const MessagePage({Key? key}) : super(key: key); 10 | 11 | @override 12 | State createState() => _MessagePageState(); 13 | } 14 | 15 | class _MessagePageState extends State with AnimationMixin { 16 | late Chat chat; 17 | final textController = TextEditingController(); 18 | final _scrollController = ScrollController(); 19 | 20 | late Animation opacity; 21 | late AnimationController slideInputController; 22 | late Animation slideInputAnimation; 23 | 24 | var isVisible = true; 25 | 26 | @override 27 | void initState() { 28 | slideInputController = createController()..duration = Duration(milliseconds: 500); 29 | 30 | slideInputAnimation = Tween( 31 | begin: Offset(0, 0), 32 | end: Offset(-2, 0), 33 | ).animate(slideInputController); 34 | 35 | opacity = Tween(begin: 1, end: 0).animate(controller); 36 | controller.duration = Duration(milliseconds: 200); 37 | 38 | super.initState(); 39 | } 40 | 41 | addToMessages(String text) { 42 | setState(() { 43 | chat.messages.insert(0, Message( 44 | id: chat.messages.length + 1, 45 | text: text, 46 | createdAt: 'Just now', 47 | isMe: true, 48 | )); 49 | }); 50 | } 51 | 52 | hideTheMic() { 53 | controller.play(); 54 | controller.addStatusListener((status) { 55 | setState(() { 56 | if (status == AnimationStatus.completed && isVisible) { 57 | isVisible = false; 58 | } 59 | }); 60 | }); 61 | } 62 | 63 | showTheMic() { 64 | isVisible = true; 65 | controller.reverse(); 66 | } 67 | 68 | @override 69 | Widget build(BuildContext context) { 70 | final theme = Theme.of(context); 71 | chat = ModalRoute.of(context)!.settings.arguments as Chat; 72 | 73 | return Scaffold( 74 | backgroundColor: ColorConstants.lightBackgroundColor, 75 | appBar: AppBar( 76 | leading: BackButton(color: Colors.black), 77 | backgroundColor: Colors.white, 78 | elevation: 0, 79 | centerTitle: false, 80 | titleSpacing: 0, 81 | title: ListTile( 82 | onTap: () {}, 83 | leading: CircleAvatar( 84 | backgroundImage: NetworkImage( 85 | chat.user.profile, 86 | ), 87 | ), 88 | title: Text(chat.user.name, style: theme.textTheme.headline6), 89 | subtitle: Text('last seen yesterday at 21:05', style: theme.textTheme.bodySmall), 90 | ), 91 | actions: [ 92 | IconButton( 93 | splashRadius: 20, 94 | icon: Icon(Icons.videocam, color: Colors.grey.shade700,), 95 | onPressed: () { 96 | Navigator.pushNamed(context, '/video-call', arguments: chat); 97 | }, 98 | ), 99 | IconButton( 100 | splashRadius: 20, 101 | icon: Icon(Icons.phone, color: Colors.grey.shade700,), 102 | onPressed: () {}, 103 | ), 104 | ], 105 | ), 106 | // a message list 107 | body: Stack( 108 | fit: StackFit.expand, 109 | children: [ 110 | Container( 111 | child: Column( 112 | children: [ 113 | Expanded( 114 | child: chat.messages.length > 0 ? ListView.builder( 115 | reverse: true, 116 | shrinkWrap: true, 117 | controller: _scrollController, 118 | padding: EdgeInsets.symmetric(vertical: 8), 119 | itemCount: chat.messages.length, 120 | itemBuilder: (context, index) { 121 | return MessageWidget( 122 | message: chat.messages[index], 123 | ); 124 | }, 125 | ) : Container( 126 | padding: EdgeInsets.symmetric(vertical: 8), 127 | child: Center( 128 | child: Column( 129 | mainAxisAlignment: MainAxisAlignment.center, 130 | children: [ 131 | Icon(Icons.chat, size: 80, color: Colors.grey.shade400,), 132 | SizedBox(height: 20,), 133 | Text('No messages yet', style: theme.textTheme.bodyText2,), 134 | ], 135 | ), 136 | ), 137 | ), 138 | ), 139 | Align( 140 | alignment: Alignment.bottomCenter, 141 | child: Card( 142 | margin: EdgeInsets.zero, 143 | child: Padding( 144 | padding: EdgeInsets.only(right: 8, left: 8, bottom: MediaQuery.of(context).viewInsets.bottom > 0 ? 15 : 28, top: 8), 145 | child: Stack( 146 | children: [ 147 | Row( 148 | mainAxisAlignment: MainAxisAlignment.center, 149 | crossAxisAlignment: CrossAxisAlignment.end, 150 | children: [ 151 | Expanded( 152 | child: SlideTransition( 153 | position: slideInputAnimation, 154 | child: Row( 155 | children: [ 156 | IconButton( 157 | splashRadius: 20, 158 | icon: Icon(Icons.add, color: Colors.grey.shade700, size: 28,), 159 | onPressed: () {}, 160 | ), 161 | Expanded( 162 | child: Container( 163 | margin: EdgeInsets.only(bottom: 5), 164 | child: TextField( 165 | controller: textController, 166 | minLines: 1, 167 | maxLines: 5, 168 | cursorColor: Colors.black, 169 | decoration: InputDecoration( 170 | isDense: true, 171 | contentPadding: EdgeInsets.only(right: 16, left: 20, bottom: 10, top: 10), 172 | hintStyle: TextStyle(fontSize: 14, color: Colors.grey.shade700), 173 | hintText: 'Type a message', 174 | border: InputBorder.none, 175 | filled: true, 176 | fillColor: Colors.grey.shade100, 177 | enabledBorder: OutlineInputBorder( 178 | borderRadius: BorderRadius.circular(20), 179 | gapPadding: 0, 180 | borderSide: BorderSide(color: Colors.grey.shade200), 181 | ), 182 | focusedBorder: OutlineInputBorder( 183 | borderRadius: BorderRadius.circular(20), 184 | gapPadding: 0, 185 | borderSide: BorderSide(color: Colors.grey.shade300), 186 | ), 187 | ), 188 | onChanged: (value) { 189 | if (value.length > 0) { 190 | hideTheMic(); 191 | } else { 192 | showTheMic(); 193 | } 194 | }, 195 | ), 196 | ), 197 | ), 198 | 199 | ], 200 | ), 201 | ), 202 | ), 203 | Row( 204 | children: [ 205 | Visibility( 206 | visible: isVisible, 207 | child: FadeTransition( 208 | opacity: opacity, 209 | child: IconButton( 210 | splashRadius: 20, 211 | icon: Icon(Icons.mic, color: Colors.grey.shade700,), 212 | onPressed: () { 213 | slideInputController.play(); 214 | }, 215 | ), 216 | ), 217 | ), 218 | IconButton( 219 | splashRadius: 20, 220 | icon: Icon(Icons.send, color: isVisible ? Colors.grey.shade700 : Colors.blue,), 221 | onPressed: () { 222 | if (textController.text.length > 0) { 223 | addToMessages(textController.text); 224 | textController.clear(); 225 | showTheMic(); 226 | } 227 | }, 228 | ), 229 | ], 230 | ), 231 | ], 232 | ), 233 | ], 234 | ), 235 | ), 236 | ), 237 | ), 238 | ], 239 | ), 240 | ), 241 | ], 242 | ), 243 | ); 244 | } 245 | } 246 | -------------------------------------------------------------------------------- /lib/pages/story/story_page.dart: -------------------------------------------------------------------------------- 1 | import 'package:cached_network_image/cached_network_image.dart'; 2 | import 'package:day60/models/user/user.dart'; 3 | import 'package:flutter/material.dart'; 4 | import 'package:flutter_carousel_slider/carousel_slider.dart'; 5 | import 'package:flutter_carousel_slider/carousel_slider_indicators.dart'; 6 | import 'package:flutter_carousel_slider/carousel_slider_transforms.dart'; 7 | 8 | class StoryPage extends StatefulWidget { 9 | const StoryPage({Key? key}) : super(key: key); 10 | 11 | @override 12 | State createState() => _StoryPageState(); 13 | } 14 | 15 | class _StoryPageState extends State { 16 | late User user; 17 | late CarouselSliderController _sliderController; 18 | 19 | @override 20 | void initState() { 21 | _sliderController = CarouselSliderController(); 22 | 23 | super.initState(); 24 | } 25 | 26 | @override 27 | Widget build(BuildContext context) { 28 | user = ModalRoute.of(context)!.settings.arguments as User; 29 | 30 | return Scaffold( 31 | body: Container( 32 | height: double.infinity, 33 | color: Colors.black, 34 | child: Stack( 35 | children: [ 36 | Positioned( 37 | top: 0, 38 | bottom: 0, 39 | right: 0, 40 | left: 0, 41 | child: CarouselSlider.builder( 42 | controller: _sliderController, 43 | unlimitedMode: true, 44 | slideBuilder: (index) { 45 | return CachedNetworkImage( 46 | imageUrl: user.stories![index].url, 47 | fit: BoxFit.cover, 48 | placeholder: (context, url) => Center( 49 | child: CircularProgressIndicator(), 50 | ), 51 | errorWidget: (context, url, error) => Icon(Icons.error), 52 | ); 53 | }, 54 | slideTransform: CubeTransform(), 55 | slideIndicator: CircularWaveSlideIndicator( 56 | padding: EdgeInsets.only(bottom: 40), 57 | currentIndicatorColor: Colors.white, 58 | indicatorBorderColor: Colors.grey.shade700, 59 | itemSpacing: 20, 60 | indicatorBackgroundColor: Colors.grey.shade700, 61 | ), 62 | itemCount: user.stories!.length 63 | ) 64 | ), 65 | Positioned( 66 | top: 50, 67 | left: 8, 68 | right: 8, 69 | child: Container( 70 | child: Row( 71 | children: [ 72 | Expanded( 73 | child: Row( 74 | children: [ 75 | IconButton( 76 | icon: Icon(Icons.arrow_back_ios), 77 | color: Colors.white, 78 | onPressed: () => Navigator.pop(context), 79 | ), 80 | CircleAvatar( 81 | backgroundImage: NetworkImage(user.profile), 82 | radius: 20, 83 | ), 84 | SizedBox(width: 10), 85 | Column( 86 | crossAxisAlignment: CrossAxisAlignment.start, 87 | children: [ 88 | Text( 89 | user.name, 90 | style: TextStyle( 91 | color: Colors.white, 92 | fontSize: 16, 93 | fontWeight: FontWeight.w600 94 | ), 95 | ), 96 | Text( 97 | 'Last seen 2 days ago', 98 | style: TextStyle( 99 | color: Colors.grey.shade300, 100 | fontSize: 12, 101 | fontWeight: FontWeight.w400 102 | ), 103 | ), 104 | ], 105 | ) 106 | ], 107 | ), 108 | ), 109 | IconButton( 110 | icon: Icon(Icons.more_vert), 111 | color: Colors.white, 112 | onPressed: () => print('More'), 113 | ), 114 | ], 115 | ), 116 | ) 117 | ) 118 | ], 119 | ) 120 | ) 121 | ); 122 | } 123 | } 124 | -------------------------------------------------------------------------------- /lib/shared/constants/color_constants.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class ColorConstants { 4 | static Color lightBackgroundColor = hexToColor('#FBF8F0'); 5 | static Color primaryColor = hexToColor("#00A8E8"); 6 | static Color storyHighlightColor = hexToColor("#F8C371"); 7 | } 8 | 9 | Color hexToColor(String hex) { 10 | assert(RegExp(r'^#([0-9a-fA-F]{6})|([0-9a-fA-F]{8})$').hasMatch(hex)); 11 | 12 | return Color(int.parse(hex.substring(1), radix: 16) + (hex.length == 7 ? 0xFF000000 : 0x00000000)); 13 | } 14 | -------------------------------------------------------------------------------- /pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | async: 5 | dependency: transitive 6 | description: 7 | name: async 8 | url: "https://pub.dartlang.org" 9 | source: hosted 10 | version: "2.8.2" 11 | boolean_selector: 12 | dependency: transitive 13 | description: 14 | name: boolean_selector 15 | url: "https://pub.dartlang.org" 16 | source: hosted 17 | version: "2.1.0" 18 | characters: 19 | dependency: transitive 20 | description: 21 | name: characters 22 | url: "https://pub.dartlang.org" 23 | source: hosted 24 | version: "1.2.0" 25 | charcode: 26 | dependency: transitive 27 | description: 28 | name: charcode 29 | url: "https://pub.dartlang.org" 30 | source: hosted 31 | version: "1.3.1" 32 | clock: 33 | dependency: transitive 34 | description: 35 | name: clock 36 | url: "https://pub.dartlang.org" 37 | source: hosted 38 | version: "1.1.0" 39 | collection: 40 | dependency: transitive 41 | description: 42 | name: collection 43 | url: "https://pub.dartlang.org" 44 | source: hosted 45 | version: "1.16.0" 46 | cupertino_icons: 47 | dependency: "direct main" 48 | description: 49 | name: cupertino_icons 50 | url: "https://pub.dartlang.org" 51 | source: hosted 52 | version: "1.0.5" 53 | fake_async: 54 | dependency: transitive 55 | description: 56 | name: fake_async 57 | url: "https://pub.dartlang.org" 58 | source: hosted 59 | version: "1.3.0" 60 | flutter: 61 | dependency: "direct main" 62 | description: flutter 63 | source: sdk 64 | version: "0.0.0" 65 | flutter_lints: 66 | dependency: "direct dev" 67 | description: 68 | name: flutter_lints 69 | url: "https://pub.dartlang.org" 70 | source: hosted 71 | version: "2.0.1" 72 | flutter_test: 73 | dependency: "direct dev" 74 | description: flutter 75 | source: sdk 76 | version: "0.0.0" 77 | lints: 78 | dependency: transitive 79 | description: 80 | name: lints 81 | url: "https://pub.dartlang.org" 82 | source: hosted 83 | version: "2.0.0" 84 | matcher: 85 | dependency: transitive 86 | description: 87 | name: matcher 88 | url: "https://pub.dartlang.org" 89 | source: hosted 90 | version: "0.12.11" 91 | material_color_utilities: 92 | dependency: transitive 93 | description: 94 | name: material_color_utilities 95 | url: "https://pub.dartlang.org" 96 | source: hosted 97 | version: "0.1.4" 98 | meta: 99 | dependency: transitive 100 | description: 101 | name: meta 102 | url: "https://pub.dartlang.org" 103 | source: hosted 104 | version: "1.7.0" 105 | path: 106 | dependency: transitive 107 | description: 108 | name: path 109 | url: "https://pub.dartlang.org" 110 | source: hosted 111 | version: "1.8.1" 112 | sky_engine: 113 | dependency: transitive 114 | description: flutter 115 | source: sdk 116 | version: "0.0.99" 117 | source_span: 118 | dependency: transitive 119 | description: 120 | name: source_span 121 | url: "https://pub.dartlang.org" 122 | source: hosted 123 | version: "1.8.2" 124 | stack_trace: 125 | dependency: transitive 126 | description: 127 | name: stack_trace 128 | url: "https://pub.dartlang.org" 129 | source: hosted 130 | version: "1.10.0" 131 | stream_channel: 132 | dependency: transitive 133 | description: 134 | name: stream_channel 135 | url: "https://pub.dartlang.org" 136 | source: hosted 137 | version: "2.1.0" 138 | string_scanner: 139 | dependency: transitive 140 | description: 141 | name: string_scanner 142 | url: "https://pub.dartlang.org" 143 | source: hosted 144 | version: "1.1.0" 145 | term_glyph: 146 | dependency: transitive 147 | description: 148 | name: term_glyph 149 | url: "https://pub.dartlang.org" 150 | source: hosted 151 | version: "1.2.0" 152 | test_api: 153 | dependency: transitive 154 | description: 155 | name: test_api 156 | url: "https://pub.dartlang.org" 157 | source: hosted 158 | version: "0.4.9" 159 | vector_math: 160 | dependency: transitive 161 | description: 162 | name: vector_math 163 | url: "https://pub.dartlang.org" 164 | source: hosted 165 | version: "2.1.2" 166 | sdks: 167 | dart: ">=2.17.5 <3.0.0" 168 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: day60 2 | description: A new Flutter project. 3 | 4 | # The following line prevents the package from being accidentally published to 5 | # pub.dev using `flutter pub publish`. This is preferred for private packages. 6 | publish_to: 'none' # Remove this line if you wish to publish to pub.dev 7 | 8 | # The following defines the version and build number for your application. 9 | # A version number is three numbers separated by dots, like 1.2.43 10 | # followed by an optional build number separated by a +. 11 | # Both the version and the builder number may be overridden in flutter 12 | # build by specifying --build-name and --build-number, respectively. 13 | # In Android, build-name is used as versionName while build-number used as versionCode. 14 | # Read more about Android versioning at https://developer.android.com/studio/publish/versioning 15 | # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. 16 | # Read more about iOS versioning at 17 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html 18 | version: 1.0.0+1 19 | 20 | environment: 21 | sdk: ">=2.17.5 <3.0.0" 22 | 23 | # Dependencies specify other packages that your package needs in order to work. 24 | # To automatically upgrade your package dependencies to the latest versions 25 | # consider running `flutter pub upgrade --major-versions`. Alternatively, 26 | # dependencies can be manually updated by changing the version numbers below to 27 | # the latest version available on pub.dev. To see which dependencies have newer 28 | # versions available, run `flutter pub outdated`. 29 | dependencies: 30 | flutter: 31 | sdk: flutter 32 | 33 | 34 | # The following adds the Cupertino Icons font to your application. 35 | # Use with the CupertinoIcons class for iOS style icons. 36 | cupertino_icons: ^1.0.2 37 | simple_animations: ^4.2.0 38 | animations: ^2.0.3 39 | scrollable_positioned_list: ^0.3.2 40 | iconsax: ^0.0.8 41 | intl: ^0.17.0 42 | flutter_carousel_slider: ^1.0.9 43 | cached_network_image: ^3.2.1 44 | flutter_hooks: ^0.18.5+1 45 | avatar_glow: ^2.0.2 46 | animated_text_kit: ^4.2.2 47 | 48 | dev_dependencies: 49 | flutter_test: 50 | sdk: flutter 51 | 52 | # The "flutter_lints" package below contains a set of recommended lints to 53 | # encourage good coding practices. The lint set provided by the package is 54 | # activated in the `analysis_options.yaml` file located at the root of your 55 | # package. See that file for information about deactivating specific lint 56 | # rules and activating additional ones. 57 | flutter_lints: ^2.0.0 58 | 59 | # For information on the generic Dart part of this file, see the 60 | # following page: https://dart.dev/tools/pub/pubspec 61 | 62 | # The following section is specific to Flutter packages. 63 | flutter: 64 | 65 | # The following line ensures that the Material Icons font is 66 | # included with your application, so that you can use the icons in 67 | # the material Icons class. 68 | uses-material-design: true 69 | 70 | # To add assets to your application, add an assets section, like this: 71 | # assets: 72 | # - images/a_dot_burr.jpeg 73 | # - images/a_dot_ham.jpeg 74 | 75 | # An image asset can refer to one or more resolution-specific "variants", see 76 | # https://flutter.dev/assets-and-images/#resolution-aware 77 | 78 | # For details regarding adding assets from package dependencies, see 79 | # https://flutter.dev/assets-and-images/#from-packages 80 | 81 | # To add custom fonts to your application, add a fonts section here, 82 | # in this "flutter" section. Each entry in this list should have a 83 | # "family" key with the font family name, and a "fonts" key with a 84 | # list giving the asset and other descriptors for the font. For 85 | # example: 86 | # fonts: 87 | # - family: Schyler 88 | # fonts: 89 | # - asset: fonts/Schyler-Regular.ttf 90 | # - asset: fonts/Schyler-Italic.ttf 91 | # style: italic 92 | # - family: Trajan Pro 93 | # fonts: 94 | # - asset: fonts/TrajanPro.ttf 95 | # - asset: fonts/TrajanPro_Bold.ttf 96 | # weight: 700 97 | # 98 | # For details regarding fonts from package dependencies, 99 | # see https://flutter.dev/custom-fonts/#from-packages 100 | -------------------------------------------------------------------------------- /test/widget_test.dart: -------------------------------------------------------------------------------- 1 | // This is a basic Flutter widget test. 2 | // 3 | // To perform an interaction with a widget in your test, use the WidgetTester 4 | // utility in the flutter_test package. For example, you can send tap and scroll 5 | // gestures. You can also use WidgetTester to find child widgets in the widget 6 | // tree, read text, and verify that the values of widget properties are correct. 7 | 8 | import 'package:flutter/material.dart'; 9 | import 'package:flutter_test/flutter_test.dart'; 10 | 11 | import 'package:day60/main.dart'; 12 | 13 | void main() { 14 | testWidgets('Counter increments smoke test', (WidgetTester tester) async { 15 | // Build our app and trigger a frame. 16 | await tester.pumpWidget(const MyApp()); 17 | 18 | // Verify that our counter starts at 0. 19 | expect(find.text('0'), findsOneWidget); 20 | expect(find.text('1'), findsNothing); 21 | 22 | // Tap the '+' icon and trigger a frame. 23 | await tester.tap(find.byIcon(Icons.add)); 24 | await tester.pump(); 25 | 26 | // Verify that our counter has incremented. 27 | expect(find.text('0'), findsNothing); 28 | expect(find.text('1'), findsOneWidget); 29 | }); 30 | } 31 | --------------------------------------------------------------------------------