├── .gitignore ├── .metadata ├── README.md ├── android ├── app │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── AndroidManifest.xml │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── example │ │ │ │ └── bilibili_app │ │ │ │ └── MainActivity.java │ │ └── res │ │ │ ├── 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 │ │ │ └── styles.xml │ │ └── profile │ │ └── AndroidManifest.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties └── settings.gradle ├── images ├── android │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ └── 8.png └── ios │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ └── 8.png ├── ios ├── Flutter │ ├── AppFrameworkInfo.plist │ ├── Debug.xcconfig │ └── Release.xcconfig ├── Podfile ├── Podfile.lock ├── Runner.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ └── xcshareddata │ │ └── xcschemes │ │ └── Runner.xcscheme ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── WorkspaceSettings.xcsettings └── Runner │ ├── AppDelegate.h │ ├── AppDelegate.m │ ├── 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 │ └── main.m ├── lib ├── ChannelBodyWidget.dart ├── ChannelWidget.dart ├── DynamicsAppBarWidget.dart ├── DynamicsBodyWidget.dart ├── VipAppBarWidget.dart ├── VipBodyWidget.dart ├── appBar.dart ├── bottom_navi_bar.dart ├── home_cell_row.dart ├── home_hot_page.dart ├── home_top.dart ├── home_zhhuibo_page.dart ├── main.dart ├── my_gradview.dart ├── next_page.dart ├── person_app_bar.dart ├── person_body.dart ├── post.dart ├── swiper_pics.dart └── video_app_bar.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 | 12 | # IntelliJ related 13 | *.iml 14 | *.ipr 15 | *.iws 16 | .idea/ 17 | 18 | # Visual Studio Code related 19 | .vscode/ 20 | 21 | # Flutter/Dart/Pub related 22 | **/doc/api/ 23 | .dart_tool/ 24 | .flutter-plugins 25 | .packages 26 | .pub-cache/ 27 | .pub/ 28 | /build/ 29 | 30 | # Android related 31 | **/android/**/gradle-wrapper.jar 32 | **/android/.gradle 33 | **/android/captures/ 34 | **/android/gradlew 35 | **/android/gradlew.bat 36 | **/android/local.properties 37 | **/android/**/GeneratedPluginRegistrant.java 38 | 39 | # iOS/XCode related 40 | **/ios/**/*.mode1v3 41 | **/ios/**/*.mode2v3 42 | **/ios/**/*.moved-aside 43 | **/ios/**/*.pbxuser 44 | **/ios/**/*.perspectivev3 45 | **/ios/**/*sync/ 46 | **/ios/**/.sconsign.dblite 47 | **/ios/**/.tags* 48 | **/ios/**/.vagrant/ 49 | **/ios/**/DerivedData/ 50 | **/ios/**/Icon? 51 | **/ios/**/Pods/ 52 | **/ios/**/.symlinks/ 53 | **/ios/**/profile 54 | **/ios/**/xcuserdata 55 | **/ios/.generated/ 56 | **/ios/Flutter/App.framework 57 | **/ios/Flutter/Flutter.framework 58 | **/ios/Flutter/Generated.xcconfig 59 | **/ios/Flutter/app.flx 60 | **/ios/Flutter/app.zip 61 | **/ios/Flutter/flutter_assets/ 62 | **/ios/ServiceDefinitions.json 63 | **/ios/Runner/GeneratedPluginRegistrant.* 64 | 65 | # Exceptions to above rules. 66 | !**/ios/**/default.mode1v3 67 | !**/ios/**/default.mode2v3 68 | !**/ios/**/default.pbxuser 69 | !**/ios/**/default.perspectivev3 70 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages 71 | -------------------------------------------------------------------------------- /.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 and should not be manually edited. 5 | 6 | version: 7 | revision: 8661d8aecd626f7f57ccbcb735553edc05a2e713 8 | channel: beta 9 | 10 | project_type: app 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | ## iOS 3 |

4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |

15 | 16 | ## Android 17 |

18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 |

29 | -------------------------------------------------------------------------------- /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 from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" 26 | 27 | android { 28 | compileSdkVersion 28 29 | 30 | lintOptions { 31 | disable 'InvalidPackage' 32 | } 33 | 34 | defaultConfig { 35 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 36 | applicationId "com.example.bilibili_app" 37 | minSdkVersion 16 38 | targetSdkVersion 28 39 | versionCode flutterVersionCode.toInteger() 40 | versionName flutterVersionName 41 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 42 | } 43 | 44 | buildTypes { 45 | release { 46 | // TODO: Add your own signing config for the release build. 47 | // Signing with the debug keys for now, so `flutter run --release` works. 48 | signingConfig signingConfigs.debug 49 | } 50 | } 51 | } 52 | 53 | flutter { 54 | source '../..' 55 | } 56 | 57 | dependencies { 58 | testImplementation 'junit:junit:4.12' 59 | androidTestImplementation 'com.android.support.test:runner:1.0.2' 60 | androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' 61 | } 62 | -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 9 | 13 | 20 | 24 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /android/app/src/main/java/com/example/bilibili_app/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.example.bilibili_app; 2 | 3 | import android.os.Bundle; 4 | import io.flutter.app.FlutterActivity; 5 | import io.flutter.plugins.GeneratedPluginRegistrant; 6 | 7 | public class MainActivity extends FlutterActivity { 8 | @Override 9 | protected void onCreate(Bundle savedInstanceState) { 10 | super.onCreate(savedInstanceState); 11 | GeneratedPluginRegistrant.registerWith(this); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /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/coder4why/flutter_demo/646fc2dcf33a657eeae6e3e02a7019ad42c5da98/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/flutter_demo/646fc2dcf33a657eeae6e3e02a7019ad42c5da98/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/flutter_demo/646fc2dcf33a657eeae6e3e02a7019ad42c5da98/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/flutter_demo/646fc2dcf33a657eeae6e3e02a7019ad42c5da98/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/flutter_demo/646fc2dcf33a657eeae6e3e02a7019ad42c5da98/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | -------------------------------------------------------------------------------- /android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | repositories { 3 | google() 4 | jcenter() 5 | } 6 | 7 | dependencies { 8 | classpath 'com.android.tools.build:gradle:3.2.1' 9 | } 10 | } 11 | 12 | allprojects { 13 | repositories { 14 | google() 15 | jcenter() 16 | } 17 | } 18 | 19 | rootProject.buildDir = '../build' 20 | subprojects { 21 | project.buildDir = "${rootProject.buildDir}/${project.name}" 22 | } 23 | subprojects { 24 | project.evaluationDependsOn(':app') 25 | } 26 | 27 | task clean(type: Delete) { 28 | delete rootProject.buildDir 29 | } 30 | -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | -------------------------------------------------------------------------------- /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-4.10.2-all.zip 7 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | 3 | def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() 4 | 5 | def plugins = new Properties() 6 | def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') 7 | if (pluginsFile.exists()) { 8 | pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } 9 | } 10 | 11 | plugins.each { name, path -> 12 | def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() 13 | include ":$name" 14 | project(":$name").projectDir = pluginDirectory 15 | } 16 | -------------------------------------------------------------------------------- /images/android/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/flutter_demo/646fc2dcf33a657eeae6e3e02a7019ad42c5da98/images/android/1.png -------------------------------------------------------------------------------- /images/android/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/flutter_demo/646fc2dcf33a657eeae6e3e02a7019ad42c5da98/images/android/2.png -------------------------------------------------------------------------------- /images/android/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/flutter_demo/646fc2dcf33a657eeae6e3e02a7019ad42c5da98/images/android/3.png -------------------------------------------------------------------------------- /images/android/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/flutter_demo/646fc2dcf33a657eeae6e3e02a7019ad42c5da98/images/android/4.png -------------------------------------------------------------------------------- /images/android/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/flutter_demo/646fc2dcf33a657eeae6e3e02a7019ad42c5da98/images/android/5.png -------------------------------------------------------------------------------- /images/android/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/flutter_demo/646fc2dcf33a657eeae6e3e02a7019ad42c5da98/images/android/6.png -------------------------------------------------------------------------------- /images/android/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/flutter_demo/646fc2dcf33a657eeae6e3e02a7019ad42c5da98/images/android/7.png -------------------------------------------------------------------------------- /images/android/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/flutter_demo/646fc2dcf33a657eeae6e3e02a7019ad42c5da98/images/android/8.png -------------------------------------------------------------------------------- /images/ios/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/flutter_demo/646fc2dcf33a657eeae6e3e02a7019ad42c5da98/images/ios/1.png -------------------------------------------------------------------------------- /images/ios/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/flutter_demo/646fc2dcf33a657eeae6e3e02a7019ad42c5da98/images/ios/2.png -------------------------------------------------------------------------------- /images/ios/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/flutter_demo/646fc2dcf33a657eeae6e3e02a7019ad42c5da98/images/ios/3.png -------------------------------------------------------------------------------- /images/ios/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/flutter_demo/646fc2dcf33a657eeae6e3e02a7019ad42c5da98/images/ios/4.png -------------------------------------------------------------------------------- /images/ios/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/flutter_demo/646fc2dcf33a657eeae6e3e02a7019ad42c5da98/images/ios/5.png -------------------------------------------------------------------------------- /images/ios/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/flutter_demo/646fc2dcf33a657eeae6e3e02a7019ad42c5da98/images/ios/6.png -------------------------------------------------------------------------------- /images/ios/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/flutter_demo/646fc2dcf33a657eeae6e3e02a7019ad42c5da98/images/ios/7.png -------------------------------------------------------------------------------- /images/ios/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/flutter_demo/646fc2dcf33a657eeae6e3e02a7019ad42c5da98/images/ios/8.png -------------------------------------------------------------------------------- /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 | 8.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 parse_KV_file(file, separator='=') 14 | file_abs_path = File.expand_path(file) 15 | if !File.exists? file_abs_path 16 | return []; 17 | end 18 | pods_ary = [] 19 | skip_line_start_symbols = ["#", "/"] 20 | File.foreach(file_abs_path) { |line| 21 | next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ } 22 | plugin = line.split(pattern=separator) 23 | if plugin.length == 2 24 | podname = plugin[0].strip() 25 | path = plugin[1].strip() 26 | podpath = File.expand_path("#{path}", file_abs_path) 27 | pods_ary.push({:name => podname, :path => podpath}); 28 | else 29 | puts "Invalid plugin specification: #{line}" 30 | end 31 | } 32 | return pods_ary 33 | end 34 | 35 | target 'Runner' do 36 | # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock 37 | # referring to absolute paths on developers' machines. 38 | system('rm -rf .symlinks') 39 | system('mkdir -p .symlinks/plugins') 40 | 41 | # Flutter Pods 42 | generated_xcode_build_settings = parse_KV_file('./Flutter/Generated.xcconfig') 43 | if generated_xcode_build_settings.empty? 44 | puts "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter packages get is executed first." 45 | end 46 | generated_xcode_build_settings.map { |p| 47 | if p[:name] == 'FLUTTER_FRAMEWORK_DIR' 48 | symlink = File.join('.symlinks', 'flutter') 49 | File.symlink(File.dirname(p[:path]), symlink) 50 | pod 'Flutter', :path => File.join(symlink, File.basename(p[:path])) 51 | end 52 | } 53 | 54 | # Plugin Pods 55 | plugin_pods = parse_KV_file('../.flutter-plugins') 56 | plugin_pods.map { |p| 57 | symlink = File.join('.symlinks', 'plugins', p[:name]) 58 | File.symlink(p[:path], symlink) 59 | pod p[:name], :path => File.join(symlink, 'ios') 60 | } 61 | end 62 | 63 | post_install do |installer| 64 | installer.pods_project.targets.each do |target| 65 | target.build_configurations.each do |config| 66 | config.build_settings['ENABLE_BITCODE'] = 'NO' 67 | end 68 | end 69 | end 70 | -------------------------------------------------------------------------------- /ios/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Flutter (1.0.0) 3 | - flutter_statusbarcolor (0.0.1): 4 | - Flutter 5 | - flutter_webview_plugin (0.0.1): 6 | - Flutter 7 | - video_player (0.0.1): 8 | - Flutter 9 | 10 | DEPENDENCIES: 11 | - Flutter (from `.symlinks/flutter/ios`) 12 | - flutter_statusbarcolor (from `.symlinks/plugins/flutter_statusbarcolor/ios`) 13 | - flutter_webview_plugin (from `.symlinks/plugins/flutter_webview_plugin/ios`) 14 | - video_player (from `.symlinks/plugins/video_player/ios`) 15 | 16 | EXTERNAL SOURCES: 17 | Flutter: 18 | :path: ".symlinks/flutter/ios" 19 | flutter_statusbarcolor: 20 | :path: ".symlinks/plugins/flutter_statusbarcolor/ios" 21 | flutter_webview_plugin: 22 | :path: ".symlinks/plugins/flutter_webview_plugin/ios" 23 | video_player: 24 | :path: ".symlinks/plugins/video_player/ios" 25 | 26 | SPEC CHECKSUMS: 27 | Flutter: 9d0fac939486c9aba2809b7982dfdbb47a7b0296 28 | flutter_statusbarcolor: ccc8f90efe5e571f817aaed60dac5382d2cec98d 29 | flutter_webview_plugin: 116575b48572029304775b768e9f15ebfc316274 30 | video_player: 906796a841943c8d370ac7c13b18039aa9b56498 31 | 32 | PODFILE CHECKSUM: aff02bfeed411c636180d6812254b2daeea14d09 33 | 34 | COCOAPODS: 1.5.3 35 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 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 | 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; 13 | 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 14 | 87261BACE469B9E0D82C5C43 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5FC9BEFAD5A9903C03A800D4 /* libPods-Runner.a */; }; 15 | 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; 16 | 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 17 | 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; 18 | 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; 19 | 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; 20 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 21 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 22 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 23 | /* End PBXBuildFile section */ 24 | 25 | /* Begin PBXCopyFilesBuildPhase section */ 26 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = { 27 | isa = PBXCopyFilesBuildPhase; 28 | buildActionMask = 2147483647; 29 | dstPath = ""; 30 | dstSubfolderSpec = 10; 31 | files = ( 32 | 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, 33 | 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, 34 | ); 35 | name = "Embed Frameworks"; 36 | runOnlyForDeploymentPostprocessing = 0; 37 | }; 38 | /* End PBXCopyFilesBuildPhase section */ 39 | 40 | /* Begin PBXFileReference section */ 41 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 42 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 43 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 44 | 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; 45 | 5FC9BEFAD5A9903C03A800D4 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 46 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 47 | 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 48 | 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 49 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 50 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 51 | 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = ""; }; 52 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 53 | 97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 54 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 55 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 56 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 57 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 58 | /* End PBXFileReference section */ 59 | 60 | /* Begin PBXFrameworksBuildPhase section */ 61 | 97C146EB1CF9000F007C117D /* Frameworks */ = { 62 | isa = PBXFrameworksBuildPhase; 63 | buildActionMask = 2147483647; 64 | files = ( 65 | 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, 66 | 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, 67 | 87261BACE469B9E0D82C5C43 /* libPods-Runner.a in Frameworks */, 68 | ); 69 | runOnlyForDeploymentPostprocessing = 0; 70 | }; 71 | /* End PBXFrameworksBuildPhase section */ 72 | 73 | /* Begin PBXGroup section */ 74 | 9740EEB11CF90186004384FC /* Flutter */ = { 75 | isa = PBXGroup; 76 | children = ( 77 | 3B80C3931E831B6300D905FE /* App.framework */, 78 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 79 | 9740EEBA1CF902C7004384FC /* Flutter.framework */, 80 | 9740EEB21CF90195004384FC /* Debug.xcconfig */, 81 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 82 | 9740EEB31CF90195004384FC /* Generated.xcconfig */, 83 | ); 84 | name = Flutter; 85 | sourceTree = ""; 86 | }; 87 | 97C146E51CF9000F007C117D = { 88 | isa = PBXGroup; 89 | children = ( 90 | 9740EEB11CF90186004384FC /* Flutter */, 91 | 97C146F01CF9000F007C117D /* Runner */, 92 | 97C146EF1CF9000F007C117D /* Products */, 93 | D7DFEC777018EF9171FA383F /* Pods */, 94 | C99267C08E6917C2AC7F1E41 /* Frameworks */, 95 | ); 96 | sourceTree = ""; 97 | }; 98 | 97C146EF1CF9000F007C117D /* Products */ = { 99 | isa = PBXGroup; 100 | children = ( 101 | 97C146EE1CF9000F007C117D /* Runner.app */, 102 | ); 103 | name = Products; 104 | sourceTree = ""; 105 | }; 106 | 97C146F01CF9000F007C117D /* Runner */ = { 107 | isa = PBXGroup; 108 | children = ( 109 | 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, 110 | 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */, 111 | 97C146FA1CF9000F007C117D /* Main.storyboard */, 112 | 97C146FD1CF9000F007C117D /* Assets.xcassets */, 113 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 114 | 97C147021CF9000F007C117D /* Info.plist */, 115 | 97C146F11CF9000F007C117D /* Supporting Files */, 116 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 117 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 118 | ); 119 | path = Runner; 120 | sourceTree = ""; 121 | }; 122 | 97C146F11CF9000F007C117D /* Supporting Files */ = { 123 | isa = PBXGroup; 124 | children = ( 125 | 97C146F21CF9000F007C117D /* main.m */, 126 | ); 127 | name = "Supporting Files"; 128 | sourceTree = ""; 129 | }; 130 | C99267C08E6917C2AC7F1E41 /* Frameworks */ = { 131 | isa = PBXGroup; 132 | children = ( 133 | 5FC9BEFAD5A9903C03A800D4 /* libPods-Runner.a */, 134 | ); 135 | name = Frameworks; 136 | sourceTree = ""; 137 | }; 138 | D7DFEC777018EF9171FA383F /* Pods */ = { 139 | isa = PBXGroup; 140 | children = ( 141 | ); 142 | name = Pods; 143 | sourceTree = ""; 144 | }; 145 | /* End PBXGroup section */ 146 | 147 | /* Begin PBXNativeTarget section */ 148 | 97C146ED1CF9000F007C117D /* Runner */ = { 149 | isa = PBXNativeTarget; 150 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; 151 | buildPhases = ( 152 | 56508BED9FA74A1C11BCA3F6 /* [CP] Check Pods Manifest.lock */, 153 | 9740EEB61CF901F6004384FC /* Run Script */, 154 | 97C146EA1CF9000F007C117D /* Sources */, 155 | 97C146EB1CF9000F007C117D /* Frameworks */, 156 | 97C146EC1CF9000F007C117D /* Resources */, 157 | 9705A1C41CF9048500538489 /* Embed Frameworks */, 158 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 159 | 939A6C7189709FC4B4B92C74 /* [CP] Embed Pods Frameworks */, 160 | ); 161 | buildRules = ( 162 | ); 163 | dependencies = ( 164 | ); 165 | name = Runner; 166 | productName = Runner; 167 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */; 168 | productType = "com.apple.product-type.application"; 169 | }; 170 | /* End PBXNativeTarget section */ 171 | 172 | /* Begin PBXProject section */ 173 | 97C146E61CF9000F007C117D /* Project object */ = { 174 | isa = PBXProject; 175 | attributes = { 176 | LastUpgradeCheck = 0910; 177 | ORGANIZATIONNAME = "The Chromium Authors"; 178 | TargetAttributes = { 179 | 97C146ED1CF9000F007C117D = { 180 | CreatedOnToolsVersion = 7.3.1; 181 | DevelopmentTeam = 2R8GD39REK; 182 | ProvisioningStyle = Manual; 183 | }; 184 | }; 185 | }; 186 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; 187 | compatibilityVersion = "Xcode 3.2"; 188 | developmentRegion = English; 189 | hasScannedForEncodings = 0; 190 | knownRegions = ( 191 | English, 192 | en, 193 | Base, 194 | ); 195 | mainGroup = 97C146E51CF9000F007C117D; 196 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */; 197 | projectDirPath = ""; 198 | projectRoot = ""; 199 | targets = ( 200 | 97C146ED1CF9000F007C117D /* Runner */, 201 | ); 202 | }; 203 | /* End PBXProject section */ 204 | 205 | /* Begin PBXResourcesBuildPhase section */ 206 | 97C146EC1CF9000F007C117D /* Resources */ = { 207 | isa = PBXResourcesBuildPhase; 208 | buildActionMask = 2147483647; 209 | files = ( 210 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 211 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 212 | 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, 213 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 214 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, 215 | ); 216 | runOnlyForDeploymentPostprocessing = 0; 217 | }; 218 | /* End PBXResourcesBuildPhase section */ 219 | 220 | /* Begin PBXShellScriptBuildPhase section */ 221 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 222 | isa = PBXShellScriptBuildPhase; 223 | buildActionMask = 2147483647; 224 | files = ( 225 | ); 226 | inputPaths = ( 227 | ); 228 | name = "Thin Binary"; 229 | outputPaths = ( 230 | ); 231 | runOnlyForDeploymentPostprocessing = 0; 232 | shellPath = /bin/sh; 233 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin\n"; 234 | }; 235 | 56508BED9FA74A1C11BCA3F6 /* [CP] Check Pods Manifest.lock */ = { 236 | isa = PBXShellScriptBuildPhase; 237 | buildActionMask = 2147483647; 238 | files = ( 239 | ); 240 | inputPaths = ( 241 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 242 | "${PODS_ROOT}/Manifest.lock", 243 | ); 244 | name = "[CP] Check Pods Manifest.lock"; 245 | outputPaths = ( 246 | "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", 247 | ); 248 | runOnlyForDeploymentPostprocessing = 0; 249 | shellPath = /bin/sh; 250 | 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"; 251 | showEnvVarsInLog = 0; 252 | }; 253 | 939A6C7189709FC4B4B92C74 /* [CP] Embed Pods Frameworks */ = { 254 | isa = PBXShellScriptBuildPhase; 255 | buildActionMask = 2147483647; 256 | files = ( 257 | ); 258 | inputPaths = ( 259 | "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", 260 | "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", 261 | ); 262 | name = "[CP] Embed Pods Frameworks"; 263 | outputPaths = ( 264 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", 265 | ); 266 | runOnlyForDeploymentPostprocessing = 0; 267 | shellPath = /bin/sh; 268 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; 269 | showEnvVarsInLog = 0; 270 | }; 271 | 9740EEB61CF901F6004384FC /* Run Script */ = { 272 | isa = PBXShellScriptBuildPhase; 273 | buildActionMask = 2147483647; 274 | files = ( 275 | ); 276 | inputPaths = ( 277 | ); 278 | name = "Run Script"; 279 | outputPaths = ( 280 | ); 281 | runOnlyForDeploymentPostprocessing = 0; 282 | shellPath = /bin/sh; 283 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; 284 | }; 285 | /* End PBXShellScriptBuildPhase section */ 286 | 287 | /* Begin PBXSourcesBuildPhase section */ 288 | 97C146EA1CF9000F007C117D /* Sources */ = { 289 | isa = PBXSourcesBuildPhase; 290 | buildActionMask = 2147483647; 291 | files = ( 292 | 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */, 293 | 97C146F31CF9000F007C117D /* main.m in Sources */, 294 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, 295 | ); 296 | runOnlyForDeploymentPostprocessing = 0; 297 | }; 298 | /* End PBXSourcesBuildPhase section */ 299 | 300 | /* Begin PBXVariantGroup section */ 301 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = { 302 | isa = PBXVariantGroup; 303 | children = ( 304 | 97C146FB1CF9000F007C117D /* Base */, 305 | ); 306 | name = Main.storyboard; 307 | sourceTree = ""; 308 | }; 309 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { 310 | isa = PBXVariantGroup; 311 | children = ( 312 | 97C147001CF9000F007C117D /* Base */, 313 | ); 314 | name = LaunchScreen.storyboard; 315 | sourceTree = ""; 316 | }; 317 | /* End PBXVariantGroup section */ 318 | 319 | /* Begin XCBuildConfiguration section */ 320 | 249021D3217E4FDB00AE95B9 /* Profile */ = { 321 | isa = XCBuildConfiguration; 322 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 323 | buildSettings = { 324 | ALWAYS_SEARCH_USER_PATHS = NO; 325 | CLANG_ANALYZER_NONNULL = YES; 326 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 327 | CLANG_CXX_LIBRARY = "libc++"; 328 | CLANG_ENABLE_MODULES = YES; 329 | CLANG_ENABLE_OBJC_ARC = YES; 330 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 331 | CLANG_WARN_BOOL_CONVERSION = YES; 332 | CLANG_WARN_COMMA = YES; 333 | CLANG_WARN_CONSTANT_CONVERSION = YES; 334 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 335 | CLANG_WARN_EMPTY_BODY = YES; 336 | CLANG_WARN_ENUM_CONVERSION = YES; 337 | CLANG_WARN_INFINITE_RECURSION = YES; 338 | CLANG_WARN_INT_CONVERSION = YES; 339 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 340 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 341 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 342 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 343 | CLANG_WARN_STRICT_PROTOTYPES = YES; 344 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 345 | CLANG_WARN_UNREACHABLE_CODE = YES; 346 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 347 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 348 | COPY_PHASE_STRIP = NO; 349 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 350 | ENABLE_NS_ASSERTIONS = NO; 351 | ENABLE_STRICT_OBJC_MSGSEND = YES; 352 | GCC_C_LANGUAGE_STANDARD = gnu99; 353 | GCC_NO_COMMON_BLOCKS = YES; 354 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 355 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 356 | GCC_WARN_UNDECLARED_SELECTOR = YES; 357 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 358 | GCC_WARN_UNUSED_FUNCTION = YES; 359 | GCC_WARN_UNUSED_VARIABLE = YES; 360 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 361 | MTL_ENABLE_DEBUG_INFO = NO; 362 | SDKROOT = iphoneos; 363 | TARGETED_DEVICE_FAMILY = "1,2"; 364 | VALIDATE_PRODUCT = YES; 365 | }; 366 | name = Profile; 367 | }; 368 | 249021D4217E4FDB00AE95B9 /* Profile */ = { 369 | isa = XCBuildConfiguration; 370 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 371 | buildSettings = { 372 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 373 | CODE_SIGN_STYLE = Manual; 374 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 375 | DEVELOPMENT_TEAM = 2R8GD39REK; 376 | ENABLE_BITCODE = NO; 377 | FRAMEWORK_SEARCH_PATHS = ( 378 | "$(inherited)", 379 | "$(PROJECT_DIR)/Flutter", 380 | ); 381 | INFOPLIST_FILE = Runner/Info.plist; 382 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 383 | LIBRARY_SEARCH_PATHS = ( 384 | "$(inherited)", 385 | "$(PROJECT_DIR)/Flutter", 386 | ); 387 | PRODUCT_BUNDLE_IDENTIFIER = com.example.bilibiliApp; 388 | PRODUCT_NAME = "$(TARGET_NAME)"; 389 | PROVISIONING_PROFILE_SPECIFIER = devUse; 390 | VERSIONING_SYSTEM = "apple-generic"; 391 | }; 392 | name = Profile; 393 | }; 394 | 97C147031CF9000F007C117D /* Debug */ = { 395 | isa = XCBuildConfiguration; 396 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 397 | buildSettings = { 398 | ALWAYS_SEARCH_USER_PATHS = NO; 399 | CLANG_ANALYZER_NONNULL = YES; 400 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 401 | CLANG_CXX_LIBRARY = "libc++"; 402 | CLANG_ENABLE_MODULES = YES; 403 | CLANG_ENABLE_OBJC_ARC = YES; 404 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 405 | CLANG_WARN_BOOL_CONVERSION = YES; 406 | CLANG_WARN_COMMA = YES; 407 | CLANG_WARN_CONSTANT_CONVERSION = YES; 408 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 409 | CLANG_WARN_EMPTY_BODY = YES; 410 | CLANG_WARN_ENUM_CONVERSION = YES; 411 | CLANG_WARN_INFINITE_RECURSION = YES; 412 | CLANG_WARN_INT_CONVERSION = YES; 413 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 414 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 415 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 416 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 417 | CLANG_WARN_STRICT_PROTOTYPES = YES; 418 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 419 | CLANG_WARN_UNREACHABLE_CODE = YES; 420 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 421 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 422 | COPY_PHASE_STRIP = NO; 423 | DEBUG_INFORMATION_FORMAT = dwarf; 424 | ENABLE_STRICT_OBJC_MSGSEND = YES; 425 | ENABLE_TESTABILITY = YES; 426 | GCC_C_LANGUAGE_STANDARD = gnu99; 427 | GCC_DYNAMIC_NO_PIC = NO; 428 | GCC_NO_COMMON_BLOCKS = YES; 429 | GCC_OPTIMIZATION_LEVEL = 0; 430 | GCC_PREPROCESSOR_DEFINITIONS = ( 431 | "DEBUG=1", 432 | "$(inherited)", 433 | ); 434 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 435 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 436 | GCC_WARN_UNDECLARED_SELECTOR = YES; 437 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 438 | GCC_WARN_UNUSED_FUNCTION = YES; 439 | GCC_WARN_UNUSED_VARIABLE = YES; 440 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 441 | MTL_ENABLE_DEBUG_INFO = YES; 442 | ONLY_ACTIVE_ARCH = YES; 443 | SDKROOT = iphoneos; 444 | TARGETED_DEVICE_FAMILY = "1,2"; 445 | }; 446 | name = Debug; 447 | }; 448 | 97C147041CF9000F007C117D /* Release */ = { 449 | isa = XCBuildConfiguration; 450 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 451 | buildSettings = { 452 | ALWAYS_SEARCH_USER_PATHS = NO; 453 | CLANG_ANALYZER_NONNULL = YES; 454 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 455 | CLANG_CXX_LIBRARY = "libc++"; 456 | CLANG_ENABLE_MODULES = YES; 457 | CLANG_ENABLE_OBJC_ARC = YES; 458 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 459 | CLANG_WARN_BOOL_CONVERSION = YES; 460 | CLANG_WARN_COMMA = YES; 461 | CLANG_WARN_CONSTANT_CONVERSION = YES; 462 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 463 | CLANG_WARN_EMPTY_BODY = YES; 464 | CLANG_WARN_ENUM_CONVERSION = YES; 465 | CLANG_WARN_INFINITE_RECURSION = YES; 466 | CLANG_WARN_INT_CONVERSION = YES; 467 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 468 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 469 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 470 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 471 | CLANG_WARN_STRICT_PROTOTYPES = YES; 472 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 473 | CLANG_WARN_UNREACHABLE_CODE = YES; 474 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 475 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 476 | COPY_PHASE_STRIP = NO; 477 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 478 | ENABLE_NS_ASSERTIONS = NO; 479 | ENABLE_STRICT_OBJC_MSGSEND = YES; 480 | GCC_C_LANGUAGE_STANDARD = gnu99; 481 | GCC_NO_COMMON_BLOCKS = YES; 482 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 483 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 484 | GCC_WARN_UNDECLARED_SELECTOR = YES; 485 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 486 | GCC_WARN_UNUSED_FUNCTION = YES; 487 | GCC_WARN_UNUSED_VARIABLE = YES; 488 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 489 | MTL_ENABLE_DEBUG_INFO = NO; 490 | SDKROOT = iphoneos; 491 | TARGETED_DEVICE_FAMILY = "1,2"; 492 | VALIDATE_PRODUCT = YES; 493 | }; 494 | name = Release; 495 | }; 496 | 97C147061CF9000F007C117D /* Debug */ = { 497 | isa = XCBuildConfiguration; 498 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 499 | buildSettings = { 500 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 501 | CODE_SIGN_STYLE = Manual; 502 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 503 | DEVELOPMENT_TEAM = 2R8GD39REK; 504 | ENABLE_BITCODE = NO; 505 | FRAMEWORK_SEARCH_PATHS = ( 506 | "$(inherited)", 507 | "$(PROJECT_DIR)/Flutter", 508 | ); 509 | INFOPLIST_FILE = Runner/Info.plist; 510 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 511 | LIBRARY_SEARCH_PATHS = ( 512 | "$(inherited)", 513 | "$(PROJECT_DIR)/Flutter", 514 | ); 515 | PRODUCT_BUNDLE_IDENTIFIER = com.example.bilibiliApp; 516 | PRODUCT_NAME = "$(TARGET_NAME)"; 517 | PROVISIONING_PROFILE_SPECIFIER = devUse; 518 | VERSIONING_SYSTEM = "apple-generic"; 519 | }; 520 | name = Debug; 521 | }; 522 | 97C147071CF9000F007C117D /* Release */ = { 523 | isa = XCBuildConfiguration; 524 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 525 | buildSettings = { 526 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 527 | CODE_SIGN_STYLE = Manual; 528 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 529 | DEVELOPMENT_TEAM = 2R8GD39REK; 530 | ENABLE_BITCODE = NO; 531 | FRAMEWORK_SEARCH_PATHS = ( 532 | "$(inherited)", 533 | "$(PROJECT_DIR)/Flutter", 534 | ); 535 | INFOPLIST_FILE = Runner/Info.plist; 536 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 537 | LIBRARY_SEARCH_PATHS = ( 538 | "$(inherited)", 539 | "$(PROJECT_DIR)/Flutter", 540 | ); 541 | PRODUCT_BUNDLE_IDENTIFIER = com.example.bilibiliApp; 542 | PRODUCT_NAME = "$(TARGET_NAME)"; 543 | PROVISIONING_PROFILE_SPECIFIER = devUse; 544 | VERSIONING_SYSTEM = "apple-generic"; 545 | }; 546 | name = Release; 547 | }; 548 | /* End XCBuildConfiguration section */ 549 | 550 | /* Begin XCConfigurationList section */ 551 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { 552 | isa = XCConfigurationList; 553 | buildConfigurations = ( 554 | 97C147031CF9000F007C117D /* Debug */, 555 | 97C147041CF9000F007C117D /* Release */, 556 | 249021D3217E4FDB00AE95B9 /* Profile */, 557 | ); 558 | defaultConfigurationIsVisible = 0; 559 | defaultConfigurationName = Release; 560 | }; 561 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { 562 | isa = XCConfigurationList; 563 | buildConfigurations = ( 564 | 97C147061CF9000F007C117D /* Debug */, 565 | 97C147071CF9000F007C117D /* Release */, 566 | 249021D4217E4FDB00AE95B9 /* Profile */, 567 | ); 568 | defaultConfigurationIsVisible = 0; 569 | defaultConfigurationName = Release; 570 | }; 571 | /* End XCConfigurationList section */ 572 | }; 573 | rootObject = 97C146E61CF9000F007C117D /* Project object */; 574 | } 575 | -------------------------------------------------------------------------------- /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/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /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 | BuildSystemType 6 | Original 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner/AppDelegate.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | 4 | @interface AppDelegate : FlutterAppDelegate 5 | 6 | @end 7 | -------------------------------------------------------------------------------- /ios/Runner/AppDelegate.m: -------------------------------------------------------------------------------- 1 | #include "AppDelegate.h" 2 | #include "GeneratedPluginRegistrant.h" 3 | 4 | @implementation AppDelegate 5 | 6 | - (BOOL)application:(UIApplication *)application 7 | didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 8 | [GeneratedPluginRegistrant registerWithRegistry:self]; 9 | // Override point for customization after application launch. 10 | return [super application:application didFinishLaunchingWithOptions:launchOptions]; 11 | } 12 | 13 | @end 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/coder4why/flutter_demo/646fc2dcf33a657eeae6e3e02a7019ad42c5da98/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/coder4why/flutter_demo/646fc2dcf33a657eeae6e3e02a7019ad42c5da98/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/coder4why/flutter_demo/646fc2dcf33a657eeae6e3e02a7019ad42c5da98/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/coder4why/flutter_demo/646fc2dcf33a657eeae6e3e02a7019ad42c5da98/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/coder4why/flutter_demo/646fc2dcf33a657eeae6e3e02a7019ad42c5da98/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/coder4why/flutter_demo/646fc2dcf33a657eeae6e3e02a7019ad42c5da98/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/coder4why/flutter_demo/646fc2dcf33a657eeae6e3e02a7019ad42c5da98/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/coder4why/flutter_demo/646fc2dcf33a657eeae6e3e02a7019ad42c5da98/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/coder4why/flutter_demo/646fc2dcf33a657eeae6e3e02a7019ad42c5da98/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/coder4why/flutter_demo/646fc2dcf33a657eeae6e3e02a7019ad42c5da98/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/coder4why/flutter_demo/646fc2dcf33a657eeae6e3e02a7019ad42c5da98/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/coder4why/flutter_demo/646fc2dcf33a657eeae6e3e02a7019ad42c5da98/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/coder4why/flutter_demo/646fc2dcf33a657eeae6e3e02a7019ad42c5da98/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/coder4why/flutter_demo/646fc2dcf33a657eeae6e3e02a7019ad42c5da98/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/coder4why/flutter_demo/646fc2dcf33a657eeae6e3e02a7019ad42c5da98/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/coder4why/flutter_demo/646fc2dcf33a657eeae6e3e02a7019ad42c5da98/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/flutter_demo/646fc2dcf33a657eeae6e3e02a7019ad42c5da98/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/flutter_demo/646fc2dcf33a657eeae6e3e02a7019ad42c5da98/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 | en 7 | CFBundleDisplayName 8 | flutter 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | bilibili_app 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | $(FLUTTER_BUILD_NAME) 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | $(FLUTTER_BUILD_NUMBER) 25 | LSRequiresIPhoneOS 26 | 27 | NSAppTransportSecurity 28 | 29 | NSAllowsArbitraryLoads 30 | 31 | NSExceptionDomains 32 | 33 | localhost 34 | 35 | NSExceptionAllowsInsecureHTTPLoads 36 | 37 | 38 | 39 | 40 | NSCameraUsageDescription 41 | 是否允许此App访问你的相机? 42 | NSLocationAlwaysAndWhenInUseUsageDescription 43 | 是否一直允许此App访问你的位置信息? 44 | NSLocationAlwaysUsageDescription 45 | 是否一直允许此App访问你的位置信息? 46 | NSLocationWhenInUseUsageDescription 47 | 48 | NSMicrophoneUsageDescription 49 | 是否允许此App访问你的麦克风? 50 | NSPhotoLibraryAddUsageDescription 51 | 是否允许此APP保存图片到相册? 52 | NSPhotoLibraryUsageDescription 53 | 是否允许此APP使用相册? 54 | UILaunchStoryboardName 55 | LaunchScreen 56 | UIMainStoryboardFile 57 | Main 58 | UISupportedInterfaceOrientations 59 | 60 | UIInterfaceOrientationPortrait 61 | UIInterfaceOrientationLandscapeLeft 62 | UIInterfaceOrientationLandscapeRight 63 | 64 | UISupportedInterfaceOrientations~ipad 65 | 66 | UIInterfaceOrientationPortrait 67 | UIInterfaceOrientationPortraitUpsideDown 68 | UIInterfaceOrientationLandscapeLeft 69 | UIInterfaceOrientationLandscapeRight 70 | 71 | UIViewControllerBasedStatusBarAppearance 72 | 73 | 74 | 75 | -------------------------------------------------------------------------------- /ios/Runner/main.m: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | #import "AppDelegate.h" 4 | 5 | int main(int argc, char* argv[]) { 6 | @autoreleasepool { 7 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /lib/ChannelBodyWidget.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class MyVideoPlayer extends StatefulWidget { 4 | @override 5 | _MyVideoPlayerState createState() => _MyVideoPlayerState(); 6 | } 7 | 8 | class _MyVideoPlayerState extends State 9 | with SingleTickerProviderStateMixin { 10 | @override 11 | Widget build(BuildContext context) { 12 | var iconImages = [ 13 | 'https://i0.hdslb.com/bfs/bangumi/8d9f5b4a566d0547bc2e3f6f733b732a09c0d3d4.jpg@144w_144h.jpg', 14 | 'https://i0.hdslb.com/bfs/bangumi/098cac1b63000954609103a4d0e4cc6d12b0fcbc.png@144w_144h.png', 15 | 'https://i0.hdslb.com/bfs/bangumi/01fe9aba08be60c64c56e1d8e8afce66b6c3d5cc.jpg@144w_144h.jpg', 16 | 'https://i0.hdslb.com/bfs/bangumi/7cd6c47770dc96e329fecd89f78b012267420c35.jpg@144w_144h.jpg', 17 | 'https://i0.hdslb.com/bfs/bangumi/5d2e71f2cb44bd4e2b80d2b8845a80c685dd7bd5.jpg@144w_144h.jpg', 18 | 'https://i0.hdslb.com/bfs/bangumi/5c2f289eac0ec49bc5e6b9483f4191c42ffa2254.jpg@144w_144h.jpg', 19 | 'https://i0.hdslb.com/bfs/bangumi/4143c286982fd8f9ad467af7b6e4a74aaee1c026.jpg@144w_144h.jpg', 20 | 'https://i0.hdslb.com/bfs/bangumi/a126d4383400812ccc6c8f2c44a3a634752cba7c.png@144w_144h.png', 21 | 'https://i0.hdslb.com/bfs/bangumi/966544071d5bfcf1d244bad7f6ce623310407db9.jpg@144w_144h.jpg', 22 | 'https://i0.hdslb.com/bfs/bangumi/d4c67e22df0e5ebbd136393dd182380ab1f04813.png@144w_144h.png', 23 | ]; 24 | var iconTitles = [ 25 | '番剧', 26 | '国创', 27 | '放映厅', 28 | '纪录片', 29 | '漫画', 30 | ]; 31 | 32 | return RefreshIndicator( 33 | child: ListView.builder( 34 | scrollDirection: Axis.vertical, 35 | itemCount: 2, 36 | itemBuilder: (BuildContext context, int position) { 37 | if (position == 0) { 38 | return Container( 39 | color: Colors.white, 40 | child: Column( 41 | children: [ 42 | Container( 43 | padding: 44 | EdgeInsets.symmetric(vertical: 5, horizontal: 10), 45 | height: 80.0, 46 | child: Row( 47 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 48 | crossAxisAlignment: CrossAxisAlignment.center, 49 | children: [ 50 | Container( 51 | height: 50.0, 52 | child: Column( 53 | mainAxisAlignment: 54 | MainAxisAlignment.spaceEvenly, 55 | crossAxisAlignment: CrossAxisAlignment.start, 56 | children: [ 57 | Text( 58 | '原创歌曲', 59 | style: TextStyle( 60 | fontSize: 17.0, 61 | fontWeight: FontWeight.bold), 62 | ), 63 | Text( 64 | '15.8万人已订阅', 65 | style: TextStyle( 66 | fontSize: 14.0, 67 | fontWeight: FontWeight.w300), 68 | ), 69 | ], 70 | ), 71 | ), 72 | Container( 73 | width: 70.0, 74 | height: 28.0, 75 | alignment: Alignment.center, 76 | child: Text( 77 | '+ 订阅', 78 | style: TextStyle( 79 | fontSize: 16.0, color: Colors.orange), 80 | ), 81 | decoration: BoxDecoration( 82 | borderRadius: 83 | BorderRadius.all(Radius.circular(4.0)), 84 | border: Border.all( 85 | color: Colors.orange, 86 | width: 1.0, 87 | )), 88 | ) 89 | ], 90 | ), 91 | ), 92 | Container( 93 | padding: EdgeInsets.symmetric(vertical: 10.0), 94 | child: Row( 95 | mainAxisAlignment: MainAxisAlignment.spaceEvenly, 96 | crossAxisAlignment: CrossAxisAlignment.center, 97 | children: [ 98 | Column( 99 | children: [ 100 | Stack( 101 | children: [ 102 | ClipRRect( 103 | child: Image.network( 104 | 'https://i0.hdslb.com/bfs/archive/8ae1e30063644f94a39890d7d47b2310f4ac0fb0.jpg', 105 | width: 172.5, 106 | ), 107 | borderRadius: BorderRadius.all( 108 | Radius.circular(10.0)), 109 | ), 110 | Positioned( 111 | bottom: 2.0, 112 | child: Container( 113 | width: 172.5, 114 | // color: Colors.blue, 115 | child: Row( 116 | mainAxisAlignment: 117 | MainAxisAlignment.spaceAround, 118 | crossAxisAlignment: 119 | CrossAxisAlignment.start, 120 | children: [ 121 | Row( 122 | children: [ 123 | Icon( 124 | Icons.play_circle_filled, 125 | size: 15.0, 126 | color: Colors.white, 127 | ), 128 | Text( 129 | '2074 ', 130 | style: TextStyle( 131 | color: Colors.white, 132 | fontSize: 13.0), 133 | ), 134 | ], 135 | ), 136 | Row( 137 | children: [ 138 | Icon( 139 | Icons.cloud, 140 | color: Colors.white, 141 | size: 15.0, 142 | ), 143 | Text( 144 | '51', 145 | style: TextStyle( 146 | color: Colors.white, 147 | fontSize: 13.0), 148 | ), 149 | ], 150 | ), 151 | Text( 152 | '4:11', 153 | style: TextStyle( 154 | color: Colors.white, 155 | fontSize: 13.0), 156 | ), 157 | ], 158 | ))) 159 | ], 160 | ), 161 | Container( 162 | width: 172.5, 163 | child: Text('【林斜阳】人间负我——大梦'), 164 | ) 165 | ], 166 | ), 167 | Column( 168 | children: [ 169 | Stack( 170 | children: [ 171 | ClipRRect( 172 | child: Image.network( 173 | 'https://i1.hdslb.com/bfs/archive/d97ecdf166b72bcf627f1527441bf81950880373.jpg@320w_200h.jpg', 174 | width: 172.5, 175 | ), 176 | borderRadius: BorderRadius.all( 177 | Radius.circular(10.0)), 178 | ), 179 | Positioned( 180 | bottom: 2, 181 | child: Container( 182 | width: 172.5, 183 | child: Row( 184 | mainAxisAlignment: 185 | MainAxisAlignment.spaceAround, 186 | crossAxisAlignment: 187 | CrossAxisAlignment.start, 188 | children: [ 189 | Container( 190 | child: Row( 191 | children: [ 192 | Icon( 193 | Icons.play_circle_filled, 194 | size: 15.0, 195 | color: Colors.white, 196 | ), 197 | Text( 198 | '2074', 199 | style: TextStyle( 200 | color: Colors.white, 201 | fontSize: 13.0), 202 | ), 203 | ], 204 | ), 205 | ), 206 | Container( 207 | child: Row( 208 | children: [ 209 | Icon( 210 | Icons.cloud, 211 | color: Colors.white, 212 | size: 15.0, 213 | ), 214 | Text( 215 | '51', 216 | style: TextStyle( 217 | color: Colors.white, 218 | fontSize: 13.0), 219 | ), 220 | ], 221 | ), 222 | ), 223 | Text( 224 | '4:11', 225 | style: TextStyle( 226 | color: Colors.white, 227 | fontSize: 13.0), 228 | ), 229 | ], 230 | ), 231 | )), 232 | ], 233 | ), 234 | Container( 235 | width: 175, 236 | child: Text('【林斜阳】人间负我——大梦'), 237 | ), 238 | ], 239 | ) 240 | ], 241 | ), 242 | ), 243 | Container( 244 | height: 40.0, 245 | alignment: Alignment.center, 246 | child: Text( 247 | '发现更多频道 >', 248 | style: 249 | TextStyle(color: Colors.orange, fontSize: 16.0), 250 | ), 251 | ), 252 | Container( 253 | height: 0.5, 254 | color: Colors.black12, 255 | ) 256 | ], 257 | ), 258 | ); 259 | } else { 260 | return Container( 261 | height: 570, 262 | color: Colors.white, 263 | width: 375.0, 264 | child: new GridView.builder( 265 | physics: new NeverScrollableScrollPhysics(), 266 | gridDelegate: new SliverGridDelegateWithMaxCrossAxisExtent( 267 | //SliverGridDelegateWithFixedCrossAxisCount可以直接指定每行(列)显示多少个Item SliverGridDelegateWithMaxCrossAxisExtent会根据GridView的宽度和你设置的每个的宽度来自动计算没行显示多少个Item 268 | //横轴的最大长度 269 | maxCrossAxisExtent: 93.5, 270 | //主轴间隔 271 | mainAxisSpacing: 0.0, 272 | //横轴间隔 273 | crossAxisSpacing: 2.0, 274 | ), 275 | itemBuilder: (BuildContext context, int index) { 276 | return Column( 277 | mainAxisAlignment: MainAxisAlignment.center, 278 | crossAxisAlignment: CrossAxisAlignment.center, 279 | children: [ 280 | ClipRRect( 281 | borderRadius: BorderRadius.all(Radius.circular(25)), 282 | child: new Image.network( 283 | iconImages[index % 10], 284 | width: 50, 285 | height: 50, 286 | fit: BoxFit.cover, 287 | ), 288 | ), 289 | Container( 290 | alignment: Alignment.center, 291 | height: 20.0, 292 | child: Text( 293 | iconTitles[index % 5], 294 | style: TextStyle(fontSize: 14.0), 295 | ), 296 | ) 297 | ], 298 | ); 299 | }, 300 | itemCount: 24, 301 | ), 302 | ); 303 | } 304 | }), 305 | onRefresh: () {}); 306 | } 307 | } 308 | -------------------------------------------------------------------------------- /lib/ChannelWidget.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | //频道页面UI 3 | class ChannelWidget extends StatefulWidget { 4 | @override 5 | _ChannelWidgetState createState() => _ChannelWidgetState(); 6 | } 7 | 8 | class _ChannelWidgetState extends State with SingleTickerProviderStateMixin { 9 | AnimationController _controller; 10 | 11 | @override 12 | void initState() { 13 | _controller = AnimationController(vsync: this); 14 | super.initState(); 15 | } 16 | 17 | @override 18 | void dispose() { 19 | _controller.dispose(); 20 | super.dispose(); 21 | } 22 | 23 | @override 24 | Widget build(BuildContext context) { 25 | return Container(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /lib/DynamicsAppBarWidget.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'DynamicsBodyWidget.dart'; 3 | 4 | class DynamicsAppBar extends StatefulWidget { 5 | @override 6 | _DynamicsAppBarState createState() => _DynamicsAppBarState(); 7 | } 8 | 9 | class _DynamicsAppBarState extends State 10 | with SingleTickerProviderStateMixin { 11 | static TabController _tabController; 12 | var body = Container( 13 | color: Colors.black12.withAlpha(5), 14 | child: ListView.builder( 15 | scrollDirection: Axis.vertical, 16 | itemCount: 2, 17 | itemBuilder: (BuildContext context, int position) { 18 | if (position == 0) { 19 | var _textEditController = TextEditingController(); 20 | return Container( 21 | color: Colors.white, 22 | padding: EdgeInsets.all(10), 23 | height: 55.0, 24 | alignment: Alignment.center, 25 | child: Container( 26 | decoration: BoxDecoration( 27 | borderRadius: BorderRadius.all(Radius.circular(25.0)), 28 | color: Colors.black12, 29 | ), 30 | height: 50.0, 31 | // color: Colors.yellow, 32 | child: TextField( 33 | controller: _textEditController, 34 | style: TextStyle( 35 | decorationColor: Colors.black, 36 | color: Colors.black, 37 | ), 38 | // keyboardType: TextInputType.number, 39 | decoration: InputDecoration( 40 | fillColor: Colors.black26, 41 | prefixStyle: TextStyle(color: Colors.white), 42 | border: InputBorder.none, 43 | //去掉下划线 44 | contentPadding: const EdgeInsets.symmetric(vertical: 8.0), 45 | hintText: '查找精彩动态内容', 46 | hintStyle: TextStyle(color: Colors.black26), 47 | // labelText: '左上角', 48 | prefixIcon: Icon( 49 | Icons.search, 50 | color: Colors.black26, 51 | ), 52 | ), 53 | ), 54 | )); 55 | } else { 56 | return Container( 57 | height: 900, 58 | width: 375, 59 | child: new TabBarView( 60 | children: [ 61 | DynamicsBodyWidget(), 62 | DynamicsBodyWidget(), 63 | DynamicsBodyWidget() 64 | ], 65 | controller: _tabController, 66 | ), 67 | ); 68 | } 69 | }), 70 | ); 71 | 72 | @override 73 | void initState() { 74 | super.initState(); 75 | _tabController = new TabController(vsync: this, length: 3, initialIndex: 1); 76 | } 77 | 78 | @override 79 | void dispose() { 80 | _tabController.dispose(); 81 | super.dispose(); 82 | } 83 | 84 | @override 85 | Widget build(BuildContext context) { 86 | var style = TextStyle(fontSize: 20.0,); 87 | return new DefaultTabController( 88 | length: 3, 89 | child: Scaffold( 90 | appBar: AppBar( 91 | title: new TabBar( 92 | indicatorColor: Colors.white, 93 | indicatorSize: TabBarIndicatorSize.label, 94 | // labelStyle:style, 95 | labelColor: Colors.white, 96 | unselectedLabelColor: Colors.white54, 97 | // unselectedLabelStyle: TextStyle(fontSize: 17.0, color: Colors.white54), 98 | tabs: [ 99 | new Tab( 100 | icon: Text( 101 | '视频', 102 | style: style, 103 | ), 104 | ), 105 | new Tab( 106 | icon: Text( 107 | '综合', 108 | style: style, 109 | ), 110 | ), 111 | new Tab( 112 | icon: Text( 113 | '热门', 114 | style: style, 115 | ), 116 | ), 117 | 118 | ], 119 | controller: _tabController, 120 | ), 121 | ), 122 | // body: 123 | )); 124 | } 125 | } 126 | -------------------------------------------------------------------------------- /lib/DynamicsBodyWidget.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'dart:math'; 3 | 4 | class DynamicsBodyWidget extends StatefulWidget { 5 | @override 6 | _DynamicsBodyWidgetState createState() => _DynamicsBodyWidgetState(); 7 | } 8 | 9 | class _DynamicsBodyWidgetState extends State 10 | with SingleTickerProviderStateMixin { 11 | AnimationController _controller; 12 | 13 | @override 14 | void initState() { 15 | _controller = AnimationController(vsync: this); 16 | super.initState(); 17 | } 18 | 19 | @override 20 | void dispose() { 21 | _controller.dispose(); 22 | super.dispose(); 23 | } 24 | 25 | @override 26 | Widget build(BuildContext context) { 27 | var iconImages = [ 28 | 'https://i0.hdslb.com/bfs/bangumi/8d9f5b4a566d0547bc2e3f6f733b732a09c0d3d4.jpg@144w_144h.jpg', 29 | 'https://i0.hdslb.com/bfs/bangumi/098cac1b63000954609103a4d0e4cc6d12b0fcbc.png@144w_144h.png', 30 | 'https://i0.hdslb.com/bfs/bangumi/01fe9aba08be60c64c56e1d8e8afce66b6c3d5cc.jpg@144w_144h.jpg', 31 | 'https://i0.hdslb.com/bfs/bangumi/7cd6c47770dc96e329fecd89f78b012267420c35.jpg@144w_144h.jpg', 32 | 'https://i0.hdslb.com/bfs/bangumi/5d2e71f2cb44bd4e2b80d2b8845a80c685dd7bd5.jpg@144w_144h.jpg', 33 | 'https://i0.hdslb.com/bfs/bangumi/5c2f289eac0ec49bc5e6b9483f4191c42ffa2254.jpg@144w_144h.jpg', 34 | 'https://i0.hdslb.com/bfs/bangumi/4143c286982fd8f9ad467af7b6e4a74aaee1c026.jpg@144w_144h.jpg', 35 | 'https://i0.hdslb.com/bfs/bangumi/a126d4383400812ccc6c8f2c44a3a634752cba7c.png@144w_144h.png', 36 | 'https://i0.hdslb.com/bfs/bangumi/966544071d5bfcf1d244bad7f6ce623310407db9.jpg@144w_144h.jpg', 37 | 'https://i0.hdslb.com/bfs/bangumi/d4c67e22df0e5ebbd136393dd182380ab1f04813.png@144w_144h.png', 38 | ]; 39 | var titles = ['极客学院', 'CSDN学院', '倚天屠龙记', '天下第一', '九阴真经', '降龙十八掌']; 40 | var desTitles = [ 41 | '2-21-投稿了视频', 42 | '2-25-投稿了视频', 43 | '2-26-投稿了视频', 44 | '2-27-投稿了视频', 45 | '2-2-投稿了视频', 46 | '2-28-投稿了视频', 47 | ]; 48 | 49 | var videoImages = [ 50 | 'http://imgs.aixifan.com/block_1552374040919-Yq9eDMIyq2?imageView2/1/w/508/h/260/q/100', 51 | 'https://i0.hdslb.com/bfs/archive/702161df0eef14b01bc77ea1d8ea1d00ac76bbc6.jpg', 52 | 'https://i0.hdslb.com/bfs/bangumi/6bbd679d4c04cfed5d5431607df6a9838c7d7932.jpg@1260w_600h.jpg', 53 | 'https://i0.hdslb.com/bfs/bangumi/7c2d61371956daabb2b9a1fb5fe43e2cc9f46f5c.jpg@1260w_600h.jpg', 54 | 'https://i0.hdslb.com/bfs/bangumi/b773f9d1733747302778eca86f0c00d6c79f6d06.jpg@1260w_600h.jpg', 55 | ]; 56 | 57 | return ListView.builder( 58 | scrollDirection: Axis.vertical, 59 | physics: NeverScrollableScrollPhysics(), 60 | itemCount: 2, 61 | itemBuilder: (BuildContext context, int position) { 62 | return Container( 63 | margin: EdgeInsets.only(bottom: 10), 64 | child: Column( 65 | children: [ 66 | Container( 67 | padding: EdgeInsets.only(top: 10, left: 10, right: 10), 68 | color: Colors.white, 69 | // height: 450.0, 70 | child: Row( 71 | mainAxisAlignment: MainAxisAlignment.spaceEvenly, 72 | crossAxisAlignment: CrossAxisAlignment.start, 73 | children: [ 74 | Container( 75 | width: 48, 76 | height: 48, 77 | alignment: Alignment.centerLeft, 78 | child: ClipRRect( 79 | borderRadius: BorderRadius.all(Radius.circular(24)), 80 | child: Image.network( 81 | iconImages[Random().nextInt(10) % 10], 82 | width: 48, 83 | height: 48, 84 | fit: BoxFit.fill, 85 | ), 86 | ), 87 | ), 88 | Container( 89 | width: 250, 90 | margin: EdgeInsets.all(5.0), 91 | child: Column( 92 | mainAxisAlignment: MainAxisAlignment.start, 93 | crossAxisAlignment: CrossAxisAlignment.start, 94 | children: [ 95 | Text( 96 | titles[Random().nextInt(6) % 5], 97 | style: TextStyle( 98 | fontSize: 17.0, fontWeight: FontWeight.bold), 99 | ), 100 | Text( 101 | desTitles[Random().nextInt(6) % 5], 102 | style: TextStyle( 103 | color: Colors.black38, 104 | fontSize: 13.0, 105 | fontWeight: FontWeight.normal), 106 | ) 107 | ], 108 | ), 109 | ), 110 | Container( 111 | padding: EdgeInsets.symmetric(vertical: 10), 112 | child: Icon( 113 | Icons.more_vert, 114 | size: 25, 115 | color: Colors.black38, 116 | ), 117 | ), 118 | ], 119 | ), 120 | ), 121 | Container( 122 | color: Colors.white, 123 | padding: EdgeInsets.symmetric(horizontal: 10), 124 | child: Text( 125 | '「天之道,损有馀而补不足,是故虚胜实,不足胜有馀。其意博,其理奥,其' 126 | '趣深。天地之像分,阴阳之侯烈,变化之由表,死生之兆章。」「弱之胜强,柔之胜刚,天下莫不知...', 127 | style: TextStyle(fontSize: 17.0), 128 | ), 129 | ), 130 | Container( 131 | padding: EdgeInsets.all(10), 132 | color: Colors.white, 133 | child: Stack( 134 | children: [ 135 | ClipRRect( 136 | borderRadius: BorderRadius.all(Radius.circular(6.0)), 137 | child: Image.network( 138 | videoImages[Random().nextInt(6)%5]), 139 | ), 140 | Positioned( 141 | bottom: 5.0, 142 | left: 5, 143 | child: Container( 144 | child: Row( 145 | children: [ 146 | Container( 147 | child: Text('42:23',style: TextStyle(fontSize: 14.0,color: Colors.white),), 148 | width: 45, 149 | decoration: BoxDecoration( 150 | borderRadius: BorderRadius.all(Radius.circular(5)), 151 | color: Colors.black54, 152 | ), 153 | ), 154 | 155 | Container( 156 | margin: EdgeInsets.only(left: 10), 157 | child: Text('268观看',style: TextStyle(fontSize: 14.0,color: Colors.white),), 158 | // width: 60, 159 | ), 160 | 161 | Container( 162 | margin: EdgeInsets.only(left: 10), 163 | child: Text('0弹幕',style: TextStyle(fontSize: 14.0,color: Colors.white),), 164 | // width: , 165 | ), 166 | 167 | ], 168 | ), 169 | )) 170 | ], 171 | ), 172 | ), 173 | Container( 174 | color: Colors.white, 175 | padding: EdgeInsets.only(left: 10,right: 10), 176 | alignment: Alignment.centerLeft, 177 | child: Text('Dart开篇01-(我的各种学习资料)',style: TextStyle(fontSize: 17.0,fontWeight: FontWeight.bold),), 178 | ), 179 | Container( 180 | height: 60.0, 181 | color: Colors.white, 182 | padding: EdgeInsets.only(left: 10,right: 10), 183 | alignment: Alignment.centerLeft, 184 | child: Row( 185 | mainAxisAlignment: MainAxisAlignment.spaceEvenly, 186 | crossAxisAlignment: CrossAxisAlignment.center, 187 | children: [ 188 | Container( 189 | child: Row( 190 | children: [ 191 | Icon(Icons.share,color: Colors.black38,size: 20,), 192 | Text(' 转发',style: TextStyle(color: Colors.black38,fontSize: 16),) 193 | ], 194 | ), 195 | ), 196 | Container( 197 | margin: EdgeInsets.symmetric(horizontal: 50), 198 | child: Row( 199 | children: [ 200 | Icon(Icons.comment,color: Colors.black38,size: 20,), 201 | Text(' 1',style: TextStyle(color: Colors.black38,fontSize: 16),) 202 | ], 203 | ), 204 | ), 205 | Container( 206 | child: Row( 207 | children: [ 208 | Icon(Icons.thumb_up,color: Colors.black38,size: 20,), 209 | Text(' 8',style: TextStyle(color: Colors.black38,fontSize: 16),) 210 | ], 211 | ), 212 | ), 213 | ], 214 | ) 215 | ) 216 | ], 217 | ), 218 | ); 219 | }); 220 | } 221 | } 222 | -------------------------------------------------------------------------------- /lib/VipAppBarWidget.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class VipAppBarWidget extends StatefulWidget { 4 | @override 5 | _VipAppBarWidgetState createState() => _VipAppBarWidgetState(); 6 | } 7 | 8 | class _VipAppBarWidgetState extends State 9 | with SingleTickerProviderStateMixin { 10 | AnimationController _controller; 11 | 12 | @override 13 | void initState() { 14 | _controller = AnimationController(vsync: this); 15 | super.initState(); 16 | } 17 | 18 | @override 19 | void dispose() { 20 | _controller.dispose(); 21 | super.dispose(); 22 | } 23 | 24 | @override 25 | Widget build(BuildContext context) { 26 | return Container( 27 | width: 375.0, 28 | child: Stack( 29 | children: [ 30 | Container( 31 | width: 375.0, 32 | alignment: Alignment.center, 33 | child: Text( 34 | '会员购', 35 | style: TextStyle(fontSize: 20.0, color: Colors.white), 36 | ), 37 | ), 38 | Positioned( 39 | right: -20, 40 | bottom: 8, 41 | child: Container( 42 | width: 120.0, 43 | height: 40.0, 44 | child: Row( 45 | crossAxisAlignment: CrossAxisAlignment.center, 46 | mainAxisAlignment: MainAxisAlignment.spaceEvenly, 47 | children: [ 48 | Icon( 49 | Icons.add_shopping_cart, 50 | size: 25.0, 51 | color: Colors.white, 52 | ), 53 | Icon( 54 | Icons.settings_overscan, 55 | size: 25.0, 56 | color: Colors.white, 57 | ) 58 | ], 59 | ), 60 | )) 61 | ], 62 | ), 63 | ); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /lib/VipBodyWidget.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_swiper/flutter_swiper.dart'; 3 | 4 | class VipBodyWidget extends StatefulWidget { 5 | @override 6 | _VipBodyWidgetState createState() => _VipBodyWidgetState(); 7 | } 8 | 9 | class _VipBodyWidgetState extends State 10 | with SingleTickerProviderStateMixin { 11 | TabController _tabController; 12 | 13 | @override 14 | void initState() { 15 | _tabController = new TabController(vsync: this, length: 4); 16 | super.initState(); 17 | } 18 | 19 | @override 20 | void dispose() { 21 | _tabController.dispose(); 22 | super.dispose(); 23 | } 24 | 25 | _textInput() { 26 | var _textEditController = TextEditingController(); 27 | return Container( 28 | decoration: BoxDecoration( 29 | borderRadius: BorderRadius.all(Radius.circular(25.0)), 30 | color: Colors.black12, 31 | ), 32 | height: 50.0, 33 | // color: Colors.yellow, 34 | child: TextField( 35 | controller: _textEditController, 36 | style: TextStyle( 37 | decorationColor: Colors.black, 38 | color: Colors.black, 39 | ), 40 | // keyboardType: TextInputType.number, 41 | decoration: InputDecoration( 42 | fillColor: Colors.black26, 43 | prefixStyle: TextStyle(color: Colors.white), 44 | border: InputBorder.none, 45 | //去掉下划线 46 | contentPadding: const EdgeInsets.symmetric(vertical: 8.0), 47 | hintText: '手办模玩,展览演出', 48 | hintStyle: TextStyle(color: Colors.black26), 49 | // labelText: '左上角', 50 | prefixIcon: Icon( 51 | Icons.search, 52 | color: Colors.black26, 53 | ), 54 | ), 55 | ), 56 | ); 57 | } 58 | 59 | _tabBar() { 60 | var titles = ['推荐', '商品', '情报', '美图']; 61 | var bars = new List(); 62 | for (int i = 0; i < titles.length; i++) { 63 | bars.add( 64 | new Tab( 65 | icon: Text( 66 | titles[i], 67 | style: TextStyle(color: Colors.black), 68 | ), 69 | ), 70 | ); 71 | } 72 | return new TabBar( 73 | indicatorColor: Colors.red, 74 | indicatorSize: TabBarIndicatorSize.label, 75 | tabs: bars, 76 | controller: _tabController, 77 | ); 78 | } 79 | 80 | _subColume() { 81 | var titles = [ 82 | '【定格动画】高达模型跳极乐净', 83 | '【官方】蔡依林《消极掰》MV它', 84 | '它曾是诺基亚「翻身」的希望,却也是塞班最后的挣扎', 85 | '【极客博物馆第三十期】【欧美混剪】一个视频感受2019奥斯卡高分获奖电影', 86 | '【欧美混剪】一个视频感受2019奥斯卡高分获奖电影', 87 | ]; 88 | 89 | var items = new List(); 90 | for (int i = 0; i < titles.length; i++) { 91 | items.add(Container( 92 | child: Column( 93 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 94 | crossAxisAlignment: CrossAxisAlignment.start, 95 | children: [ 96 | Container( 97 | height: 50, 98 | width: 160, 99 | alignment: Alignment.center, 100 | child: Text( 101 | titles[i], 102 | style: TextStyle(fontSize: 14,fontWeight: FontWeight.bold), 103 | maxLines: 2, 104 | overflow: TextOverflow.ellipsis, 105 | softWrap: true, 106 | ), 107 | ), 108 | Container( 109 | child: Row( 110 | mainAxisAlignment: MainAxisAlignment.spaceEvenly, 111 | crossAxisAlignment: CrossAxisAlignment.start, 112 | children: [ 113 | Container( 114 | child: Row( 115 | children: [ 116 | Icon( 117 | Icons.remove_red_eye, 118 | size: 10.0, 119 | color: Colors.black54, 120 | ), 121 | Text( 122 | ' 187', 123 | style: 124 | TextStyle(color: Colors.black45, fontSize: 12.0), 125 | ), 126 | ], 127 | ), 128 | ), 129 | Container( 130 | margin: EdgeInsets.symmetric(horizontal: 30), 131 | child: Row( 132 | children: [ 133 | Icon( 134 | Icons.remove_red_eye, 135 | size: 10.0, 136 | color: Colors.black45, 137 | ), 138 | Text( 139 | ' 187', 140 | style: 141 | TextStyle(color: Colors.black45, fontSize: 12.0), 142 | ), 143 | ], 144 | ), 145 | ), 146 | Container( 147 | child: Row( 148 | children: [ 149 | Icon( 150 | Icons.remove_red_eye, 151 | size: 10.0, 152 | color: Colors.black45, 153 | ), 154 | Text( 155 | ' 187', 156 | style: 157 | TextStyle(color: Colors.black45, fontSize: 12.0), 158 | ), 159 | ], 160 | ), 161 | ) 162 | ], 163 | ), 164 | ), 165 | ], 166 | ), 167 | )); 168 | } 169 | return items; 170 | } 171 | 172 | _listView() { 173 | var images = [ 174 | 'https://i0.hdslb.com/bfs/archive/1ebae9d622967b8e4a356be04ab2583b28453df2.jpg@320w_200h.jpg', 175 | 'https://i1.hdslb.com/bfs/archive/dde421bfa0db878e2d2e5a7db9e67db9c81126ed.jpg@320w_200h.jpg', 176 | 'https://i2.hdslb.com/bfs/archive/7b896783d2c228912ca61848acb90dcb0c5bebac.png@320w_200h.png', 177 | 'https://i1.hdslb.com/bfs/archive/896969a3441e36a8a05f42e2a8f15d6bd5b04459.jpg@320w_200h.jpg', 178 | 'https://i1.hdslb.com/bfs/archive/5b9df5c21cc865ea4611419b0a61b81fb25a5748.jpg@320w_200h.jpg' 179 | ]; 180 | 181 | return ListView.builder( 182 | physics: NeverScrollableScrollPhysics(), 183 | scrollDirection: Axis.vertical, 184 | itemCount: 5, 185 | itemBuilder: (BuildContext context, int position) { 186 | return Container( 187 | margin: EdgeInsets.symmetric(horizontal: 10), 188 | color: Colors.white, 189 | height: 110, 190 | child: Column( 191 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 192 | crossAxisAlignment: CrossAxisAlignment.start, 193 | children: [ 194 | Container( 195 | height: 100, 196 | padding: EdgeInsets.only(top: 5), 197 | child: Row( 198 | mainAxisAlignment: MainAxisAlignment.start, 199 | crossAxisAlignment: CrossAxisAlignment.center, 200 | children: [ 201 | ClipRRect( 202 | borderRadius: BorderRadius.all(Radius.circular(10.0)), 203 | child: Image.network( 204 | images[position], 205 | height: 100, 206 | width: 165, 207 | fit: BoxFit.cover, 208 | ), 209 | ), 210 | Container( 211 | padding: EdgeInsets.only(left: 8), 212 | child: _subColume()[position], 213 | ), 214 | ], 215 | ), 216 | ), 217 | Container( 218 | // margin: EdgeInsets.only(top: 5), 219 | color: Colors.black12, 220 | height: 0.5, 221 | ), 222 | ], 223 | ), 224 | ); 225 | }); 226 | } 227 | 228 | _items() { 229 | var items = new List(); 230 | for (int i = 0; i < 4; i++) { 231 | items.add(_listView()); 232 | } 233 | return TabBarView( 234 | controller: _tabController, 235 | children: items.map((item) { 236 | return item; 237 | }).toList(), 238 | ); 239 | } 240 | 241 | _seperators() { 242 | var iconImages = [ 243 | 'https://i0.hdslb.com/bfs/bangumi/8d9f5b4a566d0547bc2e3f6f733b732a09c0d3d4.jpg@144w_144h.jpg', 244 | 'https://i0.hdslb.com/bfs/bangumi/098cac1b63000954609103a4d0e4cc6d12b0fcbc.png@144w_144h.png', 245 | 'https://i0.hdslb.com/bfs/bangumi/01fe9aba08be60c64c56e1d8e8afce66b6c3d5cc.jpg@144w_144h.jpg', 246 | 'https://i0.hdslb.com/bfs/bangumi/7cd6c47770dc96e329fecd89f78b012267420c35.jpg@144w_144h.jpg', 247 | 'https://i0.hdslb.com/bfs/bangumi/5d2e71f2cb44bd4e2b80d2b8845a80c685dd7bd5.jpg@144w_144h.jpg', 248 | ]; 249 | var iconTitles = [ 250 | '手办', 251 | '模型', 252 | '漫展演出', 253 | '周边', 254 | '全部分类', 255 | ]; 256 | 257 | var widgets = new List(); 258 | for (int i = 0; i < iconImages.length; i++) { 259 | widgets.add(Container( 260 | width: 67, 261 | padding: EdgeInsets.symmetric(horizontal: 4), 262 | child: Column( 263 | mainAxisAlignment: MainAxisAlignment.spaceEvenly, 264 | crossAxisAlignment: CrossAxisAlignment.center, 265 | children: [ 266 | Container( 267 | decoration: BoxDecoration( 268 | color: Colors.white, 269 | border: Border.all( 270 | color: Colors.black12, 271 | width: 1, 272 | ), 273 | borderRadius: BorderRadius.all(Radius.circular(67.0 / 2.0)), 274 | boxShadow: [ 275 | BoxShadow( 276 | blurRadius: 2, 277 | color: Colors.black26, 278 | offset: Offset(1, 1), 279 | ) 280 | ], 281 | ), 282 | child: ClipRRect( 283 | borderRadius: BorderRadius.all(Radius.circular(67.0 / 2.0)), 284 | child: Image.network(iconImages[i]), 285 | ), 286 | ), 287 | Container( 288 | padding: EdgeInsets.only(top: 2), 289 | child: Text( 290 | iconTitles[i], 291 | style: TextStyle(fontSize: 14.0), 292 | ), 293 | ) 294 | ], 295 | ), 296 | )); 297 | } 298 | 299 | return widgets; 300 | } 301 | 302 | Widget _swiperBuilder(BuildContext context, int index) { 303 | var images = [ 304 | "https://i0.hdslb.com/bfs/archive/98bd350a5910f63fc4b3119f3122f7a9840ddffa.jpg", 305 | "https://i0.hdslb.com/bfs/sycp/creative_img/201903/cf1f947a3a08a29fc8918a7eb37b60da.jpg", 306 | "https://i0.hdslb.com/bfs/sycp/creative_img/201903/9e46721bde13c743d63b55d82be1d113.jpg", 307 | "https://i0.hdslb.com/bfs/archive/40462bdb70b72ccd29e5799de309f35842151e1b.jpg", 308 | "https://i0.hdslb.com/bfs/archive/07c5efa52fdfaa828ad00313fc8053c13fd221f1.jpg", 309 | ]; 310 | return (ClipRRect( 311 | borderRadius: BorderRadius.all(Radius.circular(10.0)), 312 | child: Container( 313 | child: Image.network( 314 | images[index], 315 | height: 150.0, 316 | scale: 0.1, 317 | fit: BoxFit.cover, 318 | ), // 用Container实现图片圆角的效果 319 | )) 320 | // Image.network( images[index],height: 200.0, ) 321 | ); 322 | } 323 | 324 | _bands() { 325 | var titles = ['今日上新', '人气排行', '啥值得买']; 326 | var subTitles = ['也不可能上新', '因为你的热爱', '实拍评测扫盲']; 327 | var icons = [ 328 | Icon( 329 | Icons.card_travel, 330 | color: Colors.pink, 331 | size: 20, 332 | ), 333 | Icon( 334 | Icons.public, 335 | color: Colors.pink, 336 | size: 20, 337 | ), 338 | Icon( 339 | Icons.bookmark_border, 340 | color: Colors.pink, 341 | size: 20, 342 | ), 343 | ]; 344 | var rows = new List(); 345 | for (int i = 0; i < icons.length; i++) { 346 | rows.add(Container( 347 | padding: EdgeInsets.only(left: 3.0), 348 | decoration: BoxDecoration( 349 | color: Colors.white, 350 | border: Border.all( 351 | color: Colors.black12, 352 | width: 1, 353 | ), 354 | borderRadius: BorderRadius.all(Radius.circular(5.0)), 355 | boxShadow: [ 356 | BoxShadow( 357 | blurRadius: 2, 358 | color: Colors.black12, 359 | offset: Offset(1, 1), 360 | ) 361 | ], 362 | ), 363 | height: 45, 364 | width: 340.0 / 3, 365 | child: Row( 366 | mainAxisAlignment: MainAxisAlignment.start, 367 | crossAxisAlignment: CrossAxisAlignment.center, 368 | children: [ 369 | Column( 370 | mainAxisAlignment: MainAxisAlignment.start, 371 | crossAxisAlignment: CrossAxisAlignment.start, 372 | children: [ 373 | Text( 374 | titles[i], 375 | style: TextStyle( 376 | color: Colors.black, 377 | fontSize: 14, 378 | fontWeight: FontWeight.bold), 379 | ), 380 | Text( 381 | subTitles[i], 382 | style: TextStyle( 383 | color: Colors.black38, 384 | fontSize: 12, 385 | ), 386 | ), 387 | ], 388 | ), 389 | Container( 390 | width: 35, 391 | alignment: Alignment(0, 0.4), 392 | child: icons[i], 393 | ), 394 | ], 395 | ), 396 | )); 397 | } 398 | 399 | return rows; 400 | } 401 | 402 | _swipers() { 403 | return Container( 404 | height: 150.0, 405 | padding: EdgeInsets.symmetric(horizontal: 10), 406 | alignment: Alignment(0, 0), 407 | child: Swiper( 408 | layout: SwiperLayout.DEFAULT, 409 | itemBuilder: _swiperBuilder, 410 | itemCount: 5, 411 | pagination: new SwiperPagination( 412 | alignment: Alignment.bottomRight, 413 | builder: DotSwiperPaginationBuilder( 414 | color: Colors.white, 415 | activeColor: Colors.red, 416 | )), 417 | control: new SwiperControl( 418 | iconNext: null, 419 | iconPrevious: null, 420 | ), 421 | scrollDirection: Axis.horizontal, 422 | autoplay: true, 423 | onTap: (index) => print('点击了第$index个'), 424 | ), 425 | ); 426 | } 427 | 428 | @override 429 | Widget build(BuildContext context) { 430 | return ListView.builder( 431 | scrollDirection: Axis.vertical, 432 | itemCount: 5, 433 | itemBuilder: (BuildContext context, int position) { 434 | if (position == 0) { 435 | return Container( 436 | color: Colors.white, 437 | padding: EdgeInsets.all(10), 438 | height: 55.0, 439 | alignment: Alignment.center, 440 | child: _textInput(), 441 | ); 442 | } else if (position == 1) { 443 | return Container( 444 | alignment: Alignment.center, 445 | height: 83, 446 | // color: Colors.black12.withAlpha(10), 447 | child: Row( 448 | crossAxisAlignment: CrossAxisAlignment.start, 449 | mainAxisAlignment: MainAxisAlignment.spaceEvenly, 450 | children: _seperators(), 451 | ), 452 | ); 453 | } else if (position == 2) { 454 | return Container( 455 | height: 70, 456 | child: Row( 457 | mainAxisAlignment: MainAxisAlignment.spaceEvenly, 458 | crossAxisAlignment: CrossAxisAlignment.center, 459 | children: _bands(), 460 | ), 461 | ); 462 | } else if (position == 3) { 463 | return _swipers(); 464 | } else { 465 | return Container( 466 | height: 600, 467 | child: Column( 468 | children: [ 469 | Container( 470 | height: 40, 471 | color: Colors.white, 472 | child: _tabBar(), 473 | ), 474 | Expanded(child: _items()) 475 | ], 476 | ), 477 | ); 478 | } 479 | }); 480 | } 481 | } 482 | -------------------------------------------------------------------------------- /lib/appBar.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class AppNaviBar extends StatefulWidget { 4 | @override 5 | _AppNaviBarState createState() => _AppNaviBarState(); 6 | } 7 | 8 | class _AppNaviBarState extends State with SingleTickerProviderStateMixin { 9 | AnimationController _controller; 10 | 11 | @override 12 | void initState() { 13 | _controller = AnimationController(vsync: this); 14 | super.initState(); 15 | } 16 | 17 | @override 18 | void dispose() { 19 | _controller.dispose(); 20 | super.dispose(); 21 | } 22 | 23 | @override 24 | Widget build(BuildContext context) { 25 | return Container( 26 | child: Row( 27 | mainAxisAlignment: MainAxisAlignment.start, 28 | crossAxisAlignment: CrossAxisAlignment.start, 29 | children: [ 30 | ClipRRect( 31 | borderRadius: BorderRadius.all(Radius.circular(20.0)), 32 | child: Image.network('https://img4.duitang.com/uploads/item/201404/19/20140419213843_CYkKk.thumb.700_0.jpeg',width: 40,height: 40,), 33 | ), 34 | Padding( 35 | padding: EdgeInsets.only(left: 20), 36 | child: ClipRRect( 37 | borderRadius:BorderRadius.all(Radius.circular(20.0)), 38 | child:Container( 39 | // alignment: Alignment(-1, 0), 40 | // margin: EdgeInsets.only(left: 20.0), 41 | width: 180.0, 42 | height: 40.0, 43 | color: Colors.white30, 44 | child: Padding( 45 | padding: EdgeInsets.only(left: 10), 46 | child:Row( 47 | children: [ 48 | Icon(Icons.search,color: Colors.white30,size: 30,), 49 | Padding( 50 | padding: EdgeInsets.only(top: 0.0), 51 | child: Container( 52 | // color: Colors.yellow, 53 | width: 120.0, 54 | height: 30.0, 55 | child: TextField( 56 | style: TextStyle( 57 | decorationColor: Colors.red, 58 | color: Colors.white, 59 | ), 60 | keyboardType: TextInputType.number, 61 | decoration: InputDecoration( 62 | fillColor: Colors.white30, 63 | border: InputBorder.none, //去掉下划线 64 | prefixStyle: TextStyle(color: Colors.white), 65 | contentPadding: EdgeInsets.only(top:5.0), 66 | // hintText: '请输入手机号', 67 | hintStyle: TextStyle(color: Colors.white), 68 | ), autofocus: false, ), 69 | ) , 70 | ), 71 | ], 72 | ), 73 | ), 74 | ), 75 | ),), 76 | Container( 77 | // color: Colors.black, 78 | height: 40, 79 | child: Row( 80 | mainAxisAlignment: MainAxisAlignment.end, 81 | crossAxisAlignment: CrossAxisAlignment.center, 82 | children: [ 83 | Padding( 84 | padding: EdgeInsets.only(left: 20), 85 | child: Icon(Icons.share,color: Colors.white70,), 86 | ), 87 | Padding( 88 | padding: EdgeInsets.only(left: 20), 89 | child: Icon(Icons.settings,color: Colors.white70,), 90 | ), 91 | ], 92 | ), 93 | ), 94 | 95 | ], 96 | ), 97 | ); 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /lib/bottom_navi_bar.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class MyBottomNaviBar extends StatefulWidget { 4 | var onTap; 5 | @override 6 | _MyBottomNaviBarState createState() => _MyBottomNaviBarState(); 7 | } 8 | 9 | class _MyBottomNaviBarState extends State with SingleTickerProviderStateMixin { 10 | AnimationController _controller; 11 | 12 | @override 13 | void initState() { 14 | _controller = AnimationController(vsync: this); 15 | super.initState(); 16 | } 17 | 18 | @override 19 | void dispose() { 20 | _controller.dispose(); 21 | super.dispose(); 22 | } 23 | 24 | @override 25 | Widget build(BuildContext context) { 26 | var _currentIndex = 0; 27 | return BottomNavigationBar( 28 | items: [ 29 | BottomNavigationBarItem(icon: Icon(Icons.home),title: Text('首页')), 30 | BottomNavigationBarItem(icon: Icon(Icons.music_video),title: Text('视频')), 31 | BottomNavigationBarItem(icon: Icon(Icons.person),title: Text('我的')), 32 | ], 33 | currentIndex: _currentIndex, 34 | ); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /lib/home_cell_row.dart: -------------------------------------------------------------------------------- 1 | 2 | import 'package:flutter/material.dart'; 3 | 4 | class CellRow extends StatefulWidget { 5 | @override 6 | _CellRowState createState() => _CellRowState(); 7 | } 8 | 9 | class _CellRowState extends State with SingleTickerProviderStateMixin { 10 | AnimationController _controller; 11 | 12 | @override 13 | void initState() { 14 | _controller = AnimationController(vsync: this); 15 | super.initState(); 16 | } 17 | 18 | @override 19 | void dispose() { 20 | _controller.dispose(); 21 | super.dispose(); 22 | } 23 | 24 | @override 25 | Widget build(BuildContext context) { 26 | return Column( 27 | children: [ 28 | Padding( 29 | padding: EdgeInsets.all(10.0), 30 | child: ClipRRect( 31 | borderRadius: BorderRadius.all(Radius.circular(10.0)), 32 | child: Image.network('https://i0.hdslb.com/bfs/archive/e3e65cff908fbaaecf1951373fa44a68a55cde34.jpg@640w_400h.jpg',), 33 | ), 34 | ), 35 | Text( 36 | '走遍中国,寻找最美中国乡村...', 37 | style: TextStyle( 38 | color: Colors.black, 39 | fontSize: 20.0, 40 | ), 41 | 42 | ), 43 | ], 44 | );; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /lib/home_hot_page.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class HomeHotWidget extends StatefulWidget { 4 | @override 5 | _HomeHotWidgetState createState() => _HomeHotWidgetState(); 6 | } 7 | 8 | class _HomeHotWidgetState extends State 9 | with SingleTickerProviderStateMixin { 10 | AnimationController _controller; 11 | 12 | @override 13 | void initState() { 14 | _controller = AnimationController(vsync: this); 15 | super.initState(); 16 | } 17 | 18 | @override 19 | void dispose() { 20 | _controller.dispose(); 21 | super.dispose(); 22 | } 23 | 24 | @override 25 | Widget build(BuildContext context) { 26 | var images = [ 27 | 'https://i0.hdslb.com/bfs/live/66f63f2bd27533dca5cbfc2b3a2d58107adc51a3.jpg@640w_400h.jpg', 28 | 'https://i0.hdslb.com/bfs/live/0149b64df95f1f31af4032871f3cc8942115ed13.jpg@640w_400h.jpg', 29 | 'https://i0.hdslb.com/bfs/archive/79020e2b78ad7ee03a6852c9e8ff64596fd0c104.jpg@320w_200h.jpg', 30 | 'https://i0.hdslb.com/bfs/archive/77ba327482a0cad9b6b028c2ee726230fde6ce63.jpg@320w_200h.jpg', 31 | 'https://i2.hdslb.com/bfs/archive/87a644bcea8c2f00240505e192ad15337aca73b8.jpg@320w_200h.jpg', 32 | ]; 33 | var titles = [ 34 | '扔猫到中国地图,猫Jio戳到哪里就去哪里!竟然戳到了...', 35 | '这部动画本该封神!结尾却争议不断,被大家疯狂吐槽?', 36 | '【某幻】史上最强谋杀王', 37 | '网红"空气炸锅"到底是神器还是鸡肋产品?和烤箱比又有什么...', 38 | '我买下了《出山》原曲的使用权——蒋俊博' 39 | ]; 40 | return ListView.builder( 41 | scrollDirection: Axis.vertical, 42 | itemCount: 6, 43 | itemBuilder: (BuildContext context, int position) { 44 | if (position == 0) { 45 | return Container( 46 | width: 375.0, 47 | height: 48.0, 48 | child: Column( 49 | children: [ 50 | Container( 51 | color: Colors.black12, 52 | width: 375.0, 53 | height: 0.5, 54 | ), 55 | Container( 56 | padding: EdgeInsets.all(10.0), 57 | child: Row( 58 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 59 | crossAxisAlignment: CrossAxisAlignment.center, 60 | children: [ 61 | Text( 62 | '当前热门', 63 | style: TextStyle( 64 | fontSize: 18.0, 65 | color: Colors.black38, 66 | fontWeight: FontWeight.normal), 67 | ), 68 | Container( 69 | width: 110.0, 70 | child: Row( 71 | mainAxisAlignment: MainAxisAlignment.spaceEvenly, 72 | crossAxisAlignment: CrossAxisAlignment.center, 73 | children: [ 74 | Icon( 75 | Icons.radio, 76 | size: 20.0, 77 | color: Colors.orange, 78 | ), 79 | Text( 80 | '查看更多', 81 | style: TextStyle( 82 | fontSize: 16.0, 83 | color: Colors.orange, 84 | fontWeight: FontWeight.w300), 85 | ), 86 | Icon( 87 | Icons.navigate_next, 88 | size: 20.0, 89 | color: Colors.orange, 90 | ), 91 | ], 92 | ), 93 | ), 94 | ], 95 | ), 96 | ) 97 | ], 98 | ), 99 | ); 100 | } else { 101 | return Container( 102 | padding: EdgeInsets.symmetric(horizontal: 10.0), 103 | height: 111.0, 104 | child: Column( 105 | mainAxisAlignment: MainAxisAlignment.start, 106 | crossAxisAlignment: CrossAxisAlignment.start, 107 | children: [ 108 | Container( 109 | color: Colors.black12, 110 | height: 0.5, 111 | ), 112 | Row( 113 | children: [ 114 | Container( 115 | margin: EdgeInsets.symmetric(vertical: 7.5), 116 | child: Stack( 117 | children: [ 118 | ClipRRect( 119 | borderRadius: 120 | BorderRadius.all(Radius.circular(10.0)), 121 | child: Image.network( 122 | images[position - 1], 123 | height: 95, 124 | width: 150, 125 | fit: BoxFit.fill, 126 | ), 127 | ), 128 | Positioned( 129 | bottom: 5.0, 130 | right: 5.0, 131 | child: Container( 132 | alignment: Alignment.center, 133 | width: 60.0, 134 | height: 25.0, 135 | child: Text( 136 | '6:05', 137 | style: TextStyle(color: Colors.white), 138 | ), 139 | decoration: BoxDecoration( 140 | color: Colors.black54, 141 | borderRadius: BorderRadius.all( 142 | Radius.circular(5.0)), 143 | ), 144 | )), 145 | ], 146 | )), 147 | Container( 148 | alignment: Alignment.centerLeft, 149 | padding: EdgeInsets.symmetric(horizontal: 5.0), 150 | // height: 95.0, 151 | child: Column( 152 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 153 | crossAxisAlignment: CrossAxisAlignment.start, 154 | children: [ 155 | Container( 156 | width: 180, 157 | // height: 40.0, 158 | child: Text( 159 | titles[position - 1], 160 | style: TextStyle( 161 | fontSize: 14.0, 162 | ), 163 | maxLines: 2, 164 | overflow: TextOverflow.ellipsis, 165 | // softWrap: false,// 166 | ), 167 | ), 168 | position == 1 169 | ? Container( 170 | alignment: Alignment.center, 171 | width: 60, 172 | decoration: BoxDecoration( 173 | color: Colors.orangeAccent, 174 | borderRadius: BorderRadius.all( 175 | Radius.circular(3.0)), 176 | ), 177 | child: Text( 178 | '8万点赞', 179 | style: TextStyle( 180 | fontSize: 12.0, 181 | color: Colors.white), 182 | // softWrap: true, 183 | ), 184 | ) 185 | : Container(), 186 | Container( 187 | width: 180, 188 | // color: Colors.blue, 189 | child: Text( 190 | '败犬鲁鲁', 191 | style: TextStyle( 192 | fontSize: 12.0, color: Colors.black45), 193 | // softWrap: true, 194 | ), 195 | ), 196 | Container( 197 | width: 180, 198 | // color: Colors.blue, 199 | child: Row( 200 | mainAxisAlignment: 201 | MainAxisAlignment.spaceBetween, 202 | children: [ 203 | Text( 204 | '29.1万观看-19小时前', 205 | style: TextStyle( 206 | fontSize: 12.0, 207 | color: Colors.black45), 208 | // softWrap: true, 209 | ), 210 | Icon(Icons.more_vert, 211 | size: 20.0, color: Colors.black38), 212 | ], 213 | )) 214 | ], 215 | )), 216 | ], 217 | ) 218 | ], 219 | ), 220 | ); 221 | } 222 | }); 223 | } 224 | } 225 | -------------------------------------------------------------------------------- /lib/home_top.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_swiper/flutter_swiper.dart'; 3 | 4 | class HomeTopView extends StatefulWidget { 5 | @override 6 | _HomeTopViewState createState() => _HomeTopViewState(); 7 | } 8 | 9 | class _HomeTopViewState extends State 10 | with SingleTickerProviderStateMixin { 11 | AnimationController _controller; 12 | 13 | @override 14 | void initState() { 15 | _controller = AnimationController(vsync: this); 16 | super.initState(); 17 | } 18 | 19 | @override 20 | void dispose() { 21 | _controller.dispose(); 22 | super.dispose(); 23 | } 24 | 25 | Widget _swiperBuilder(BuildContext context, int index) { 26 | var images = [ 27 | "https://i0.hdslb.com/bfs/archive/98bd350a5910f63fc4b3119f3122f7a9840ddffa.jpg", 28 | "https://i0.hdslb.com/bfs/sycp/creative_img/201903/cf1f947a3a08a29fc8918a7eb37b60da.jpg", 29 | "https://i0.hdslb.com/bfs/sycp/creative_img/201903/9e46721bde13c743d63b55d82be1d113.jpg", 30 | "https://i0.hdslb.com/bfs/archive/40462bdb70b72ccd29e5799de309f35842151e1b.jpg", 31 | "https://i0.hdslb.com/bfs/archive/07c5efa52fdfaa828ad00313fc8053c13fd221f1.jpg", 32 | ]; 33 | return (ClipRRect( 34 | borderRadius: BorderRadius.all(Radius.circular(10.0)), 35 | child: Container( 36 | child: Image.network( 37 | images[index], 38 | height: 150.0, 39 | scale: 0.1, 40 | fit: BoxFit.cover, 41 | ), // 用Container实现图片圆角的效果 42 | )) 43 | // Image.network( images[index],height: 200.0, ) 44 | ); 45 | } 46 | 47 | @override 48 | Widget build(BuildContext context) { 49 | var contents = [ 50 | '英雄联盟', 51 | '守望先锋', 52 | 'APEX英雄', 53 | '视频聊天', 54 | '全部标签', 55 | '单机', 56 | '娱乐', 57 | '电台', 58 | '绘画', 59 | '虚拟主播', 60 | ]; 61 | var iconImages = [ 62 | 'http://bpic.588ku.com/element_list_pic/19/03/07/79dd37a64bb4c08ae6a8a1f0a0de5362.jpg!/fw/208/quality/90/unsharp/true/compress/true', 63 | 'http://bpic.588ku.com/element_list_pic/19/03/07/83dfbc772622e3e65851a67017aaaa7a.jpg!/fw/208/quality/90/unsharp/true/compress/true', 64 | 'http://bpic.588ku.com/element_list_pic/19/03/06/02d291da7cb1a42c956f18be6f60f37b.jpg!/fw/208/quality/90/unsharp/true/compress/true', 65 | 'http://bpic.588ku.com/element_list_pic/19/03/07/e4642455a7f8eafd50ba903c726dae5d.jpg!/fw/208/quality/90/unsharp/true/compress/true', 66 | 'http://bpic.588ku.com/element_list_pic/19/03/07/cd6c889aef0ef5081414d3191a32afdc.jpg!/fw/208/quality/90/unsharp/true/compress/true', 67 | 'http://bpic.588ku.com/element_list_pic/19/03/07/4818093906ca368b486148d9454011dd.jpg!/fw/254/quality/90/unsharp/true/compress/true', 68 | 'http://bpic.588ku.com/element_list_pic/19/03/07/e4642455a7f8eafd50ba903c726dae5d.jpg!/fw/208/quality/90/unsharp/true/compress/true', 69 | 'http://bpic.588ku.com/element_list_pic/19/03/07/07da55d24d7f24a0ca4fb45b711210b2.jpg!/fw/208/quality/90/unsharp/true/compress/true', 70 | 'http://bpic.588ku.com/element_list_pic/19/03/07/38f84445cb3fd13204bec553674481c4.jpg!/fw/254/quality/90/unsharp/true/compress/true', 71 | 'http://bpic.588ku.com/element_list_pic/19/03/07/a08443e9cd9447031f2f3f41e20646f7.jpg!/fw/254/quality/90/unsharp/true/compress/true', 72 | ]; 73 | var videoContents = [ 74 | 'OWL 洛杉矶英勇队vs休..', 75 | '游戏少女 萌新第四天', 76 | '王者荣耀带你看懂二狗', 77 | '鬼泣5', 78 | '6110分继续刚', 79 | '英雄联盟LEC赛区-春季赛', 80 | 'apex emmm', 81 | '与仙争鸡', 82 | '天桥地下的唱见', 83 | '今天的李先生疲惫了', 84 | ]; 85 | var videoDetailContents = [ 86 | '守望先锋.', 87 | '刀塔自走棋', 88 | '第五人格', 89 | '绝地求生', 90 | '穿越火线', 91 | '英雄联盟', 92 | '地下城', 93 | '拳皇', 94 | '唱见', 95 | '段子天下', 96 | ]; 97 | var videoImages = [ 98 | 'https://i1.hdslb.com/bfs/archive/f1be8293f490cd5e32a5c2f565c89880e76e3061.jpg@320w_200h.jpg', 99 | 'https://i1.hdslb.com/bfs/archive/416a3ee705b2ac544ff76f60af52f6655bf6eb42.jpg@320w_200h.jpg', 100 | 'https://i0.hdslb.com/bfs/archive/00573099a2c86569ea68380bb44ccf91b0ca8619.png@320w_200h.png', 101 | 'https://i2.hdslb.com/bfs/archive/c781bb917d148a18dc0981ee8a8abdead75fb95f.jpg@320w_200h.jpg', 102 | 'https://i0.hdslb.com/bfs/archive/515eb7f4ca826304eeadbd51e124e27ecbfd1e17.jpg@320w_200h.jpg', 103 | 'https://i1.hdslb.com/bfs/archive/e22ff91e9363d48f03d86ed00185bcda10181dee.jpg@320w_200h.jpg', 104 | 'https://i0.hdslb.com/bfs/archive/9eca86255ef1838886b4b5f1c0662d3e9f634410.jpg@320w_200h.jpg', 105 | 'https://i2.hdslb.com/bfs/archive/be9686d5bb15d4ce330f73ee6acd0303a9170b5b.jpg@320w_200h.jpg', 106 | 'https://i2.hdslb.com/bfs/archive/bdd67d993c31ac4a9bc5054367229bad40c4000a.jpg@320w_200h.jpg', 107 | 'https://i2.hdslb.com/bfs/archive/a90dd608483742898f02e45ec039097446cdcd56.jpg@320w_200h.jpg' 108 | ]; 109 | 110 | return ListView.builder( 111 | scrollDirection: Axis.vertical, 112 | itemCount: 4, 113 | itemBuilder: (BuildContext context, int position) { 114 | if (position == 0) { 115 | return Column( 116 | children: [ 117 | Container( 118 | height: 150.0, 119 | padding: EdgeInsets.all(5.0), 120 | alignment: Alignment(0, 0), 121 | child: Swiper( 122 | layout: SwiperLayout.DEFAULT, 123 | itemBuilder: _swiperBuilder, 124 | itemCount: 5, 125 | pagination: new SwiperPagination( 126 | alignment: Alignment.bottomRight, 127 | builder: DotSwiperPaginationBuilder( 128 | color: Colors.white, 129 | activeColor: Colors.red, 130 | )), 131 | control: new SwiperControl( 132 | iconNext: null, 133 | iconPrevious: null, 134 | ), 135 | scrollDirection: Axis.horizontal, 136 | autoplay: true, 137 | onTap: (index) => print('点击了第$index个'), 138 | ), 139 | ), 140 | ], 141 | ); 142 | } else if (position == 1) { 143 | return Container( 144 | // color: Colors.teal, 145 | width: 375.0, 146 | height: 160.0, 147 | padding: EdgeInsets.only(left: 5, top: 5, right: 5, bottom: 0), 148 | child: new GridView.builder( 149 | physics: new NeverScrollableScrollPhysics(), 150 | gridDelegate: new SliverGridDelegateWithMaxCrossAxisExtent( 151 | //SliverGridDelegateWithFixedCrossAxisCount可以直接指定每行(列)显示多少个Item SliverGridDelegateWithMaxCrossAxisExtent会根据GridView的宽度和你设置的每个的宽度来自动计算没行显示多少个Item 152 | //横轴的最大长度 153 | maxCrossAxisExtent: 75.0, 154 | //主轴间隔 155 | mainAxisSpacing: 0.0, 156 | //横轴间隔 157 | crossAxisSpacing: 2.0, 158 | ), 159 | itemBuilder: (BuildContext context, int index) { 160 | return Column( 161 | mainAxisAlignment: MainAxisAlignment.center, 162 | crossAxisAlignment: CrossAxisAlignment.center, 163 | children: [ 164 | new Image.network( 165 | iconImages[index], 166 | width: 75, 167 | height: 44, 168 | fit: BoxFit.cover, 169 | ), 170 | Container( 171 | alignment: Alignment.center, 172 | height: 20.0, 173 | child: Text( 174 | contents[index], 175 | style: TextStyle(fontSize: 14.0), 176 | ), 177 | ) 178 | ], 179 | ); 180 | }, 181 | itemCount: 10, 182 | ), 183 | ); 184 | } else if (position == 2) { 185 | return Container( 186 | width: 375.0, 187 | height: 48.0, 188 | child: Column( 189 | children: [ 190 | Container( 191 | color: Colors.black12, 192 | width: 375.0, 193 | height: 0.5, 194 | ), 195 | Container( 196 | padding: EdgeInsets.all(10.0), 197 | child: Row( 198 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 199 | crossAxisAlignment: CrossAxisAlignment.center, 200 | children: [ 201 | Text( 202 | '推荐直播', 203 | style: TextStyle( 204 | fontSize: 18.0, 205 | color: Colors.black87, 206 | fontWeight: FontWeight.bold), 207 | ), 208 | Row( 209 | mainAxisAlignment: MainAxisAlignment.spaceEvenly, 210 | crossAxisAlignment: CrossAxisAlignment.center, 211 | children: [ 212 | Text( 213 | '查看更多', 214 | style: 215 | TextStyle(fontSize: 16.0, color: Colors.grey), 216 | ), 217 | Icon( 218 | Icons.navigate_next, 219 | size: 20.0, 220 | color: Colors.grey, 221 | ), 222 | ], 223 | ) 224 | ], 225 | ), 226 | ) 227 | ], 228 | ), 229 | ); 230 | } else { 231 | return Container( 232 | width: 375.0, 233 | height: 880.0, 234 | padding: EdgeInsets.symmetric(horizontal: 10.0), 235 | child: new GridView.builder( 236 | //屏蔽GridView内部滚动; 237 | physics: new NeverScrollableScrollPhysics(), 238 | gridDelegate: new SliverGridDelegateWithMaxCrossAxisExtent( 239 | //SliverGridDelegateWithFixedCrossAxisCount可以直接指定每行(列)显示多少个Item SliverGridDelegateWithMaxCrossAxisExtent会根据GridView的宽度和你设置的每个的宽度来自动计算没行显示多少个Item 240 | //横轴的最大长度 241 | maxCrossAxisExtent: 200.0, 242 | //主轴间隔 243 | mainAxisSpacing: 0.0, 244 | //横轴间隔 245 | crossAxisSpacing: 10.0, 246 | ), 247 | itemBuilder: (BuildContext context, int index) { 248 | return Column( 249 | mainAxisAlignment: MainAxisAlignment.center, 250 | crossAxisAlignment: CrossAxisAlignment.center, 251 | children: [ 252 | new ClipRRect( 253 | borderRadius: BorderRadius.all(Radius.circular(10.0)), 254 | child: Stack( 255 | alignment: Alignment.center, 256 | children: [ 257 | Image.network( 258 | videoImages[index], 259 | width: 175, 260 | height: 120, 261 | fit: BoxFit.cover, 262 | ), 263 | Positioned( 264 | bottom: 0, 265 | child: Container( 266 | padding: EdgeInsets.all(5.0), 267 | child: Row( 268 | // mainAxisAlignment: 269 | // MainAxisAlignment.spaceBetween, 270 | // crossAxisAlignment: 271 | // CrossAxisAlignment.center, 272 | children: [ 273 | Text( 274 | videoContents[index], 275 | style: TextStyle( 276 | fontSize: 10.0, 277 | color: Colors.white), 278 | ), 279 | Row( 280 | // mainAxisAlignment: 281 | // MainAxisAlignment.spaceBetween, 282 | // crossAxisAlignment: 283 | // CrossAxisAlignment.center, 284 | children: [ 285 | Icon( 286 | Icons.person, 287 | color: Colors.white, 288 | size: 15, 289 | ), 290 | Text( 291 | '11.8万', 292 | style: TextStyle( 293 | fontSize: 10.0, 294 | color: Colors.white), 295 | ), 296 | ], 297 | ) 298 | ], 299 | ), 300 | )) 301 | ], 302 | )), 303 | Container( 304 | alignment: Alignment.centerLeft, 305 | height: 40.0, 306 | child: Column( 307 | mainAxisAlignment: MainAxisAlignment.start, 308 | crossAxisAlignment: CrossAxisAlignment.start, 309 | children: [ 310 | Text( 311 | videoContents[index], 312 | style: TextStyle(fontSize: 14.0), 313 | ), 314 | Text( 315 | videoDetailContents[index], 316 | style: TextStyle( 317 | fontSize: 12.0, color: Colors.grey), 318 | ), 319 | ], 320 | )) 321 | ], 322 | ); 323 | }, 324 | itemCount: 10, 325 | ), 326 | ); 327 | } 328 | }); 329 | } 330 | } 331 | -------------------------------------------------------------------------------- /lib/home_zhhuibo_page.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart'; 3 | 4 | class HomeZhuiFanWidget extends StatefulWidget { 5 | @override 6 | _HomeZhuiFanWidgetState createState() => _HomeZhuiFanWidgetState(); 7 | } 8 | 9 | class _HomeZhuiFanWidgetState extends State 10 | with SingleTickerProviderStateMixin { 11 | AnimationController _controller; 12 | 13 | @override 14 | void initState() { 15 | _controller = AnimationController(vsync: this); 16 | super.initState(); 17 | } 18 | 19 | @override 20 | void dispose() { 21 | _controller.dispose(); 22 | super.dispose(); 23 | } 24 | 25 | @override 26 | Widget build(BuildContext context) { 27 | var images = [ 28 | 'https://i0.hdslb.com/bfs/archive/87d7b44974be5926f53c22fc8a5cc2b43493deee.jpg@320w_200h.jpg', 29 | 'https://i1.hdslb.com/bfs/archive/bd012075f056530b2768642a697229b3a93d9671.jpg@320w_200h.jpg', 30 | 'https://i0.hdslb.com/bfs/archive/1675ac4596af1f39a996df1ce817ac751d03f0fa.jpg@320w_200h.jpg', 31 | 'https://i2.hdslb.com/bfs/archive/2a7500d89dc7c560f1ac21abc82e4b415f73b847.jpg@320w_200h.jpg', 32 | 'https://i0.hdslb.com/bfs/live/user_cover/c7c9d829b01b30663dd0e188f1b861157e778737.jpg@640w_400h.jpg', 33 | 'https://i0.hdslb.com/bfs/live/476c67151af8fb3fab3bf0f562bacc44af807f86.jpg@640w_400h.jpg', 34 | 'https://i0.hdslb.com/bfs/live/user_cover/808d2eef36c4c72f651a28478f1eb41761a82947.jpg@640w_400h.jpg', 35 | 'https://i0.hdslb.com/bfs/live/room_cover/c8e2cc14c14a02293ac1bff8eaab9feaa8f0e90b.jpg@640w_400h.jpg', 36 | 'https://i0.hdslb.com/bfs/live/room_cover/3c25a8e982cf9d98dde76bea62880ad7c0a70738.jpg@640w_400h.jpg', 37 | 'https://i2.hdslb.com/bfs/archive/2affd37e0860b63ecb36179fe372d1975c1c4906.jpg@320w_200h.jpg' 38 | ]; 39 | 40 | return Container( 41 | padding: EdgeInsets.all(3), 42 | child: new StaggeredGridView.countBuilder( 43 | crossAxisCount: 4, 44 | itemCount: 20, 45 | itemBuilder: (BuildContext context, int index) => new Container( 46 | alignment: Alignment.center, 47 | child: Stack( 48 | children: [ 49 | ClipRRect( 50 | borderRadius: BorderRadius.all(Radius.circular(3)), 51 | child: Image.network( 52 | images[index % 10], 53 | fit: BoxFit.cover, 54 | height: 180, 55 | width: (MediaQuery.of(context).size.width - 12) / 2.0, 56 | )), 57 | ], 58 | ), 59 | ), 60 | staggeredTileBuilder: (int index) => 61 | new StaggeredTile.count(2, index.isEven ? 2 : 1.5), 62 | mainAxisSpacing: 2.0, 63 | crossAxisSpacing: 2.0), 64 | ); 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'home_top.dart'; 3 | import 'appBar.dart'; 4 | import 'person_app_bar.dart'; 5 | import 'video_app_bar.dart'; 6 | import 'next_page.dart'; 7 | import 'ChannelBodyWidget.dart'; 8 | import 'swiper_pics.dart'; 9 | import 'home_hot_page.dart'; 10 | import 'VipAppBarWidget.dart'; 11 | import 'VipBodyWidget.dart'; 12 | import 'DynamicsAppBarWidget.dart'; 13 | import 'person_body.dart'; 14 | // import 'package:flutter_statusbarcolor/flutter_statusbarcolor.dart'; 15 | import 'home_zhhuibo_page.dart'; 16 | // import 'package:flutter/services.dart'; 17 | 18 | void main() { 19 | // await FlutterStatusbarcolor.setStatusBarColor(Colors.transparent); 20 | // if (useWhiteForeground(Colors.white)) { 21 | // FlutterStatusbarcolor.setStatusBarWhiteForeground(true); 22 | // } else { 23 | // FlutterStatusbarcolor.setStatusBarWhiteForeground(false); 24 | // } 25 | // SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.light); 26 | runApp(MyApp()); 27 | } 28 | 29 | Color themeColor = Colors.grey; 30 | Color selectColor = Color(0xFFeb7b98);// 31 | 32 | class MyApp extends StatelessWidget { 33 | @override 34 | Widget build(BuildContext context) { 35 | return MaterialApp( 36 | title: 'Flutter Demo', 37 | theme: ThemeData( 38 | primaryColor: Color(0xFFeb7b98), 39 | brightness: Brightness.light 40 | // dividerColor: Color(0xffeeeeee), 41 | // scaffoldBackgroundColor: Color(0xFF888888), 42 | // textTheme: TextTheme(body1: TextStyle(color: Color(0xFF333333))), 43 | // primarySwatch: themeColor, 44 | ), 45 | debugShowCheckedModeBanner: true, 46 | home: MyHomePage(), 47 | //设置路由: 48 | routes: { 49 | 'DetailPage': (BuildContext context) => new DetailPage(), 50 | }, 51 | ); 52 | } 53 | } 54 | 55 | class MyHomePage extends StatefulWidget { 56 | _MyHomePageState createState() => _MyHomePageState(); 57 | } 58 | 59 | class _MyHomePageState extends State 60 | with SingleTickerProviderStateMixin { 61 | TabController _tabController; 62 | var _currentIndex = 0; 63 | 64 | @override 65 | void initState() { 66 | super.initState(); 67 | _tabController = new TabController(vsync: this, length: 4, initialIndex: 0); 68 | } 69 | 70 | @override 71 | void dispose() { 72 | _tabController.dispose(); 73 | super.dispose(); 74 | } 75 | 76 | @override 77 | Widget build(BuildContext context) { 78 | var appBars = [ 79 | AppNaviBar(), 80 | VideoAppBar(), 81 | DynamicsAppBar(), 82 | VipAppBarWidget(), 83 | // null, 84 | PersonAppBar(), 85 | ]; 86 | var appbodys = [ 87 | HomeTopView(), 88 | MySwiperPics(), 89 | HomeHotWidget(), 90 | HomeZhuiFanWidget(), 91 | ]; 92 | var style = TextStyle(fontSize: 18.0, fontWeight: FontWeight.w500); 93 | var bottoms = [ 94 | TabBar( 95 | // labelPadding: EdgeInsets.all(0), 96 | indicatorSize: TabBarIndicatorSize.label, 97 | // labelStyle: 98 | // TextStyle(color: Colors.yellow), 99 | indicatorColor: Colors.white, 100 | // indicatorColor: Colors.black, 101 | labelColor: Colors.white, 102 | unselectedLabelColor:Colors.white54, 103 | tabs: [ 104 | new Container( 105 | // color: Colors.white, 106 | // width: 375/4.0, 107 | child: Tab( 108 | icon: Text( 109 | '直播', 110 | style: style, 111 | ), //new Icon(Icons.directions_bike), 112 | ), 113 | ), 114 | new Container( 115 | // color: Colors.white, 116 | // width: 375/4.0, 117 | child: Tab( 118 | icon: Text('推荐', style: style), 119 | ) 120 | ), 121 | new Container( 122 | // color: Colors.white, 123 | // width: 375/4.0, 124 | child: Tab( 125 | icon: Text('热门', style: style), //new Icon(Icons.directions_boat), 126 | )), 127 | new Container( 128 | // color: Colors.white, 129 | // width: 375/4.0, 130 | child: Tab( 131 | icon: Text('追番', style: style), // new Icon(Icons.directions_bus), 132 | )), 133 | ], 134 | controller: _tabController, 135 | ), 136 | null, 137 | null, 138 | null, 139 | null 140 | ]; 141 | var bodys = [ 142 | TabBarView( 143 | children: appbodys, 144 | controller: _tabController, 145 | ), 146 | MyVideoPlayer(), 147 | DynamicsAppBar().createState().body, 148 | VipBodyWidget(), 149 | PersonBodyWidget(), 150 | ]; 151 | return Scaffold( 152 | appBar:_currentIndex==4?null:AppBar( 153 | brightness: Brightness.dark, 154 | // elevation: 0.5, 155 | // backgroundColor: Colors.transparent, 156 | title: appBars[_currentIndex], 157 | bottom: bottoms[_currentIndex], 158 | ), 159 | body: bodys[_currentIndex], 160 | bottomNavigationBar: BottomNavigationBar( 161 | // iconSize: 20.0, 162 | backgroundColor: Colors.white, 163 | selectedItemColor: Color(0xFFeb7b98), //Colors.red, 164 | unselectedItemColor: Color(0xFFa6a6a6), 165 | 166 | items: [ 167 | BottomNavigationBarItem( 168 | icon: Icon( 169 | Icons.home, 170 | // color: selectColor, 171 | ), 172 | title: Text( 173 | '首页', 174 | // style: TextStyle(color: themeColor), 175 | )), 176 | BottomNavigationBarItem( 177 | icon: Icon( 178 | Icons.audiotrack, 179 | // color:themeColor, 180 | ), 181 | title: Text('频道', )), 182 | BottomNavigationBarItem( 183 | icon: Icon( 184 | Icons.cloud, 185 | // color: themeColor, 186 | ), 187 | title: Text('动态', )), 188 | BottomNavigationBarItem( 189 | icon: Icon( 190 | Icons.shopping_cart, 191 | // color: themeColor, 192 | ), 193 | title: Text('会员购',)), 194 | BottomNavigationBarItem( 195 | icon: Icon( 196 | Icons.person, 197 | // color: themeColor, 198 | ), 199 | title: Text('我的')), 200 | ], 201 | // fixedColor: Colors.red, 202 | type: BottomNavigationBarType.fixed, 203 | currentIndex: _currentIndex, 204 | onTap: (index) { 205 | setState(() { 206 | _currentIndex = index; 207 | }); 208 | }, 209 | ), 210 | ); 211 | } 212 | } 213 | -------------------------------------------------------------------------------- /lib/my_gradview.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class MyGradView extends StatefulWidget { 4 | @override 5 | _MyGradViewState createState() => _MyGradViewState(); 6 | } 7 | 8 | class _MyGradViewState extends State with SingleTickerProviderStateMixin { 9 | // AnimationController _controller; 10 | 11 | @override 12 | void initState() { 13 | // _controller = AnimationController(vsync: this); 14 | super.initState(); 15 | } 16 | 17 | @override 18 | void dispose() { 19 | // _controller.dispose(); 20 | super.dispose(); 21 | } 22 | 23 | @override 24 | Widget build(BuildContext context) { 25 | return Container( 26 | margin: EdgeInsets.all(3.0), 27 | width: 350, 28 | height: 400.0, 29 | child: new GridView.builder( 30 | physics: new NeverScrollableScrollPhysics(), 31 | gridDelegate: new SliverGridDelegateWithMaxCrossAxisExtent(//SliverGridDelegateWithFixedCrossAxisCount可以直接指定每行(列)显示多少个Item SliverGridDelegateWithMaxCrossAxisExtent会根据GridView的宽度和你设置的每个的宽度来自动计算没行显示多少个Item 32 | crossAxisSpacing:10.0, 33 | mainAxisSpacing: 5.0, 34 | maxCrossAxisExtent: 180.0, 35 | ), 36 | itemBuilder: (BuildContext context, int index) { 37 | return new Image.network( 38 | 'https://i0.hdslb.com/bfs/live/user_cover/5f809e6d2a825e7a763629049a09221cc09c21d7.jpg@640w_400h.jpg', 39 | fit: BoxFit.cover, 40 | ); 41 | }, 42 | itemCount: 10, 43 | ), 44 | ); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /lib/next_page.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_webview_plugin/flutter_webview_plugin.dart'; 3 | 4 | class DetailPage extends StatefulWidget { 5 | @override 6 | _DetailPageState createState() => _DetailPageState(); 7 | } 8 | 9 | class _DetailPageState extends State 10 | with SingleTickerProviderStateMixin { 11 | TabController _tabController; 12 | 13 | @override 14 | void initState() { 15 | super.initState(); 16 | _tabController = new TabController(vsync: this, length: 3); 17 | } 18 | 19 | @override 20 | void dispose() { 21 | _tabController.dispose(); 22 | super.dispose(); 23 | } 24 | 25 | @override 26 | Widget build(BuildContext context) { 27 | return WebviewScaffold( 28 | url: 'https://github.com/HuPingKang/flutter_demo', 29 | appBar: AppBar( 30 | title: Text('详情'), 31 | // actions: [ 32 | // GestureDetector( 33 | // onTap: () { 34 | // }, 35 | // child: Image.asset('img/icon_menu_share.png'), 36 | // ) 37 | // ], 38 | ), 39 | ); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /lib/person_app_bar.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class PersonAppBar extends StatefulWidget { 4 | @override 5 | _PersonAppBarState createState() => _PersonAppBarState(); 6 | } 7 | 8 | class _PersonAppBarState extends State with SingleTickerProviderStateMixin { 9 | AnimationController _controller; 10 | 11 | @override 12 | void initState() { 13 | _controller = AnimationController(vsync: this); 14 | super.initState(); 15 | } 16 | 17 | @override 18 | void dispose() { 19 | _controller.dispose(); 20 | super.dispose(); 21 | } 22 | 23 | @override 24 | Widget build(BuildContext context) { 25 | return Center( 26 | child: Text('个人中心'), 27 | ); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /lib/person_body.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'post.dart'; 3 | 4 | class PersonBodyWidget extends StatefulWidget { 5 | @override 6 | _PersonBodyWidgetState createState() => _PersonBodyWidgetState(); 7 | } 8 | 9 | class _PersonBodyWidgetState extends State 10 | with SingleTickerProviderStateMixin { 11 | AnimationController _controller; 12 | 13 | _topBars() { 14 | var titles = ['动态', '关注', '粉丝']; 15 | var columes = new List(); 16 | for (int i = 0; i < titles.length; i++) { 17 | columes.add(Container( 18 | margin: EdgeInsets.symmetric(horizontal: i == 1 ? 30 : 0), 19 | child: Column( 20 | mainAxisAlignment: MainAxisAlignment.spaceEvenly, 21 | crossAxisAlignment: CrossAxisAlignment.center, 22 | children: [ 23 | Text( 24 | '1', 25 | style: TextStyle(color: Colors.black54, fontSize: 15), 26 | ), 27 | Text( 28 | titles[i], 29 | style: TextStyle(color: Colors.black54, fontSize: 15), 30 | ) 31 | ], 32 | ), 33 | )); 34 | } 35 | 36 | return Container( 37 | height: 66, 38 | color: Colors.white, 39 | child: Row( 40 | crossAxisAlignment: CrossAxisAlignment.start, 41 | mainAxisAlignment: MainAxisAlignment.spaceEvenly, 42 | children: columes, 43 | ), 44 | ); 45 | } 46 | 47 | _sendReport() { 48 | return Container( 49 | height: 80, 50 | padding: EdgeInsets.symmetric(horizontal: 15), 51 | margin: EdgeInsets.symmetric(vertical: 10), 52 | color: Colors.white, 53 | child: Row( 54 | crossAxisAlignment: CrossAxisAlignment.center, 55 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 56 | children: [ 57 | Text( 58 | '成为UP主,分享你的创作', 59 | style: TextStyle(fontSize: 17.0), 60 | ), 61 | Container( 62 | width: 77, 63 | height: 35, 64 | decoration: BoxDecoration( 65 | borderRadius: BorderRadius.all(Radius.circular(5)), 66 | border: Border.all( 67 | color: Colors.pink, 68 | width: 1, 69 | )), 70 | child: Row( 71 | mainAxisAlignment: MainAxisAlignment.spaceEvenly, 72 | crossAxisAlignment: CrossAxisAlignment.center, 73 | children: [ 74 | Icon( 75 | Icons.file_upload, 76 | size: 18, 77 | color: Colors.pink, 78 | ), 79 | Text( 80 | '投稿', 81 | style: TextStyle(color: Colors.pink, fontSize: 15.0), 82 | ), 83 | ], 84 | ), 85 | ) 86 | ], 87 | ), 88 | ); 89 | } 90 | 91 | _userGridView(bool isPerson) { 92 | var contents = [ 93 | '离线缓存', 94 | '历史记录', 95 | '我的收藏', 96 | '我的关注', 97 | '稍后再看', 98 | 'B币钱包', 99 | '会员购中心', 100 | '直播中心', 101 | ]; 102 | var services = [ 103 | '大会员', 104 | '看视频免流量', 105 | '创作学院', 106 | '我的客服', 107 | ]; 108 | var iconImages = [ 109 | 'http://bpic.588ku.com/element_list_pic/19/03/06/02d291da7cb1a42c956f18be6f60f37b.jpg!/fw/208/quality/90/unsharp/true/compress/true', 110 | 'http://bpic.588ku.com/element_list_pic/19/03/07/e4642455a7f8eafd50ba903c726dae5d.jpg!/fw/208/quality/90/unsharp/true/compress/true', 111 | 'http://bpic.588ku.com/element_list_pic/19/03/07/cd6c889aef0ef5081414d3191a32afdc.jpg!/fw/208/quality/90/unsharp/true/compress/true', 112 | 'http://bpic.588ku.com/element_list_pic/19/03/07/4818093906ca368b486148d9454011dd.jpg!/fw/254/quality/90/unsharp/true/compress/true', 113 | 'http://bpic.588ku.com/element_list_pic/19/03/07/e4642455a7f8eafd50ba903c726dae5d.jpg!/fw/208/quality/90/unsharp/true/compress/true', 114 | 'http://bpic.588ku.com/element_list_pic/19/03/07/07da55d24d7f24a0ca4fb45b711210b2.jpg!/fw/208/quality/90/unsharp/true/compress/true', 115 | 'http://bpic.588ku.com/element_list_pic/19/03/07/38f84445cb3fd13204bec553674481c4.jpg!/fw/254/quality/90/unsharp/true/compress/true', 116 | 'http://bpic.588ku.com/element_list_pic/19/03/07/a08443e9cd9447031f2f3f41e20646f7.jpg!/fw/254/quality/90/unsharp/true/compress/true', 117 | ]; 118 | return new GridView.builder( 119 | padding: EdgeInsets.only(top: 0), 120 | physics: new NeverScrollableScrollPhysics(), 121 | gridDelegate: new SliverGridDelegateWithMaxCrossAxisExtent( 122 | //SliverGridDelegateWithFixedCrossAxisCount可以直接指定每行(列)显示多少个Item SliverGridDelegateWithMaxCrossAxisExtent会根据GridView的宽度和你设置的每个的宽度来自动计算没行显示多少个Item 123 | //横轴的最大长度 124 | maxCrossAxisExtent: MediaQuery.of(context).size.width/4.0, 125 | //主轴间隔 126 | mainAxisSpacing: 0.0, 127 | //横轴间隔 128 | crossAxisSpacing: 0.0, 129 | ), 130 | itemBuilder: (BuildContext context, int index) { 131 | return Container( 132 | // color: Colors.orangeAccent, 133 | child: Column( 134 | mainAxisAlignment: MainAxisAlignment.spaceEvenly, 135 | crossAxisAlignment: CrossAxisAlignment.center, 136 | children: [ 137 | ClipRRect( 138 | borderRadius: BorderRadius.all(Radius.circular(25)), 139 | child: new Image.network( 140 | iconImages[index], 141 | width: 50, 142 | height: 50, 143 | fit: BoxFit.cover, 144 | ), 145 | ), 146 | Container( 147 | alignment: Alignment.center, 148 | height: 20.0, 149 | child: Text( 150 | isPerson?contents[index]:services[index], 151 | style: TextStyle(fontSize: 14.0), 152 | ), 153 | ) 154 | ], 155 | ), 156 | ); 157 | }, 158 | itemCount: isPerson?iconImages.length:services.length, 159 | ); 160 | } 161 | 162 | _userCenters(bool isPerson) { 163 | return Container( 164 | color: Colors.white, 165 | margin: EdgeInsets.only(bottom: 10), 166 | child: Column( 167 | mainAxisAlignment: MainAxisAlignment.center, 168 | crossAxisAlignment: CrossAxisAlignment.start, 169 | children: [ 170 | Container( 171 | padding: EdgeInsets.only(left: 15), 172 | height: 54, 173 | alignment: Alignment.centerLeft, 174 | child: Text( 175 | isPerson?'个人中心':'我的服务', 176 | style: TextStyle(fontSize: 20.0), 177 | ), 178 | ), 179 | Container( 180 | height: 0.5, 181 | color: Colors.black12, 182 | ), 183 | Container( 184 | color: Colors.white30, 185 | height: isPerson?190:100, 186 | child: _userGridView(isPerson), 187 | ), 188 | ], 189 | ), 190 | ); 191 | } 192 | 193 | _mainContainer() { 194 | return Container( 195 | color: Colors.black12.withAlpha(10), 196 | child: Column( 197 | mainAxisAlignment: MainAxisAlignment.start, 198 | crossAxisAlignment: CrossAxisAlignment.center, 199 | children: [ 200 | _topBars(), 201 | _sendReport(), 202 | _userCenters(true), 203 | _userCenters(false), 204 | ], 205 | ), 206 | ); 207 | } 208 | 209 | _sliverGrid() { 210 | return SliverGrid( 211 | gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( 212 | crossAxisCount: 1, 213 | // crossAxisSpacing: 8.0, 214 | // mainAxisSpacing: 8.0, 215 | childAspectRatio: 1 / 1.9, 216 | ), 217 | delegate: SliverChildBuilderDelegate( 218 | (BuildContext context, int index) { 219 | return _mainContainer(); 220 | }, 221 | childCount: 1, 222 | ), 223 | ); 224 | } 225 | 226 | _sliver() { 227 | return SliverPadding( 228 | padding: EdgeInsets.all(0), 229 | sliver: _sliverGrid(), 230 | ); 231 | } 232 | 233 | _topMsgs() { 234 | return Container( 235 | color: Colors.pink.withOpacity(0.1), 236 | child: Column( 237 | crossAxisAlignment: CrossAxisAlignment.center, 238 | mainAxisAlignment: MainAxisAlignment.spaceEvenly, 239 | children: [ 240 | Container( 241 | alignment: Alignment.centerRight, 242 | margin: EdgeInsets.only(top: 30, right: 15), 243 | // height: 30, 244 | // width: 80, 245 | child: Container( 246 | height: 30, 247 | width: 110, 248 | child: Row( 249 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 250 | crossAxisAlignment: CrossAxisAlignment.end, 251 | children: [ 252 | Icon( 253 | Icons.camera, 254 | color: Colors.white, 255 | size: 23, 256 | ), 257 | Icon( 258 | Icons.color_lens, 259 | color: Colors.white, 260 | size: 23, 261 | ), 262 | Icon( 263 | Icons.settings, 264 | color: Colors.white, 265 | size: 23, 266 | ), 267 | ], 268 | ), 269 | ), 270 | ), 271 | Container( 272 | padding: EdgeInsets.all(5), 273 | margin: EdgeInsets.only(left: 5), 274 | height: 90, 275 | alignment: Alignment.center, 276 | child: Row( 277 | mainAxisAlignment: MainAxisAlignment.start, 278 | crossAxisAlignment: CrossAxisAlignment.center, 279 | children: [ 280 | ClipRRect( 281 | borderRadius: BorderRadius.all(Radius.circular(40.0)), 282 | child: Image.network( 283 | 'https://i0.hdslb.com/bfs/bangumi/966544071d5bfcf1d244bad7f6ce623310407db9.jpg@144w_144h.jpg', 284 | width: 80, 285 | height: 80, 286 | fit: BoxFit.cover, 287 | ), 288 | ), 289 | Container( 290 | padding: EdgeInsets.only(left: 10), 291 | child: Column( 292 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 293 | crossAxisAlignment: CrossAxisAlignment.start, 294 | children: [ 295 | Text( 296 | '85257205396_bili', 297 | style: TextStyle(fontSize: 15, color: Colors.white), 298 | ), 299 | Container( 300 | width: 70.0, 301 | alignment: Alignment.center, 302 | child: Text( 303 | '注册会员', 304 | style: TextStyle(color: Colors.white, fontSize: 12.0), 305 | ), 306 | decoration: BoxDecoration( 307 | borderRadius: BorderRadius.all(Radius.circular(3)), 308 | border: Border.all( 309 | color: Colors.white, 310 | width: 1, 311 | )), 312 | ), 313 | Row( 314 | // mainAxisAlignment: MainAxisAlignment.start, 315 | // crossAxisAlignment: CrossAxisAlignment.start, 316 | children: [ 317 | Text( 318 | 'B币: 0', 319 | style: 320 | TextStyle(color: Colors.white, fontSize: 12.0), 321 | ), 322 | Text( 323 | '硬币: 0', 324 | style: 325 | TextStyle(color: Colors.white, fontSize: 12.0), 326 | ), 327 | ], 328 | ), 329 | ], 330 | ), 331 | ), 332 | Container( 333 | margin: EdgeInsets.only(right: 10, left: 96), 334 | child: Icon( 335 | Icons.navigate_next, 336 | color: Colors.white70, 337 | size: 30, 338 | ), 339 | ) 340 | ], 341 | ), 342 | ), 343 | Container( 344 | margin: EdgeInsets.all(10), 345 | padding: EdgeInsets.only(left: 10.0, right: 5), 346 | height: 40, 347 | alignment: Alignment.center, 348 | decoration: BoxDecoration( 349 | color: Colors.black12, 350 | borderRadius: BorderRadius.all(Radius.circular(8)), 351 | ), 352 | child: Row( 353 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 354 | crossAxisAlignment: CrossAxisAlignment.center, 355 | children: [ 356 | Text( 357 | '来吧!只有会员才知道的世界!', 358 | style: TextStyle( 359 | color: Colors.white, 360 | ), 361 | ), 362 | Icon( 363 | Icons.navigate_next, 364 | color: Colors.white70, 365 | size: 30, 366 | ), 367 | ], 368 | ), 369 | ) 370 | ], 371 | ), 372 | ); 373 | } 374 | 375 | _customBody() { 376 | return CustomScrollView( 377 | slivers: [ 378 | SliverAppBar( 379 | floating: true, 380 | expandedHeight: 190.0, 381 | flexibleSpace: FlexibleSpaceBar( 382 | centerTitle: false, 383 | collapseMode: CollapseMode.parallax, 384 | // title: _topMsgs(), 385 | background: _topMsgs(), 386 | // Container( 387 | // color: Colors.pink.withAlpha(40), 388 | // ), 389 | ), 390 | ), 391 | _sliver(), 392 | // SliverSafeArea( 393 | // sliver: _sliver(), 394 | // ), 395 | ], 396 | ); 397 | } 398 | 399 | @override 400 | void initState() { 401 | _controller = AnimationController(vsync: this); 402 | super.initState(); 403 | } 404 | 405 | @override 406 | void dispose() { 407 | _controller.dispose(); 408 | super.dispose(); 409 | } 410 | 411 | @override 412 | Widget build(BuildContext context) { 413 | return Scaffold(body: _customBody()); 414 | } 415 | } 416 | -------------------------------------------------------------------------------- /lib/post.dart: -------------------------------------------------------------------------------- 1 | class Post { 2 | Post({ 3 | this.title, 4 | this.author, 5 | this.imageUrl, 6 | this.description, 7 | }); 8 | 9 | final String title; 10 | final String author; 11 | final String imageUrl; 12 | final String description; 13 | 14 | bool selected = false; 15 | } 16 | 17 | final List posts = [ 18 | Post( 19 | title: 'Candy Shop', 20 | author: 'Mohamed Chahin', 21 | description: 'Esse ut nulla velit reprehenderit veniam sint nostrud nulla exercitation ipsum. Officia deserunt aliquip aliquip excepteur eiusmod dolor. Elit amet ipsum labore sint occaecat dolore tempor officia irure voluptate ad. Veniam laboris deserunt aute excepteur sit deserunt dolor esse dolor velit sint nulla anim ut. Reprehenderit voluptate adipisicing culpa magna ea nulla ullamco consectetur. Cupidatat adipisicing consequat adipisicing sit consectetur dolor occaecat.', 22 | imageUrl: 'https://resources.ninghao.org/images/candy-shop.jpg', 23 | ), 24 | Post( 25 | title: 'Childhood in a picture', 26 | author: 'Mohamed Chahin', 27 | description: 'Esse ut nulla velit reprehenderit veniam sint nostrud nulla exercitation ipsum. Officia deserunt aliquip aliquip excepteur eiusmod dolor. Elit amet ipsum labore sint occaecat dolore tempor officia irure voluptate ad. Veniam laboris deserunt aute excepteur sit deserunt dolor esse dolor velit sint nulla anim ut. Reprehenderit voluptate adipisicing culpa magna ea nulla ullamco consectetur. Cupidatat adipisicing consequat adipisicing sit consectetur dolor occaecat.', 28 | imageUrl: 'https://resources.ninghao.org/images/childhood-in-a-picture.jpg', 29 | ), 30 | Post( 31 | title: 'Contained', 32 | author: 'Mohamed Chahin', 33 | description: 'Esse ut nulla velit reprehenderit veniam sint nostrud nulla exercitation ipsum. Officia deserunt aliquip aliquip excepteur eiusmod dolor. Elit amet ipsum labore sint occaecat dolore tempor officia irure voluptate ad. Veniam laboris deserunt aute excepteur sit deserunt dolor esse dolor velit sint nulla anim ut. Reprehenderit voluptate adipisicing culpa magna ea nulla ullamco consectetur. Cupidatat adipisicing consequat adipisicing sit consectetur dolor occaecat.', 34 | imageUrl: 'https://resources.ninghao.org/images/contained.jpg', 35 | ), 36 | Post( 37 | title: 'Dragon', 38 | author: 'Mohamed Chahin', 39 | description: 'Esse ut nulla velit reprehenderit veniam sint nostrud nulla exercitation ipsum. Officia deserunt aliquip aliquip excepteur eiusmod dolor. Elit amet ipsum labore sint occaecat dolore tempor officia irure voluptate ad. Veniam laboris deserunt aute excepteur sit deserunt dolor esse dolor velit sint nulla anim ut. Reprehenderit voluptate adipisicing culpa magna ea nulla ullamco consectetur. Cupidatat adipisicing consequat adipisicing sit consectetur dolor occaecat.', 40 | imageUrl: 'https://resources.ninghao.org/images/dragon.jpg', 41 | ), 42 | Post( 43 | title: 'Free Hugs', 44 | author: 'Mohamed Chahin', 45 | description: 'Esse ut nulla velit reprehenderit veniam sint nostrud nulla exercitation ipsum. Officia deserunt aliquip aliquip excepteur eiusmod dolor. Elit amet ipsum labore sint occaecat dolore tempor officia irure voluptate ad. Veniam laboris deserunt aute excepteur sit deserunt dolor esse dolor velit sint nulla anim ut. Reprehenderit voluptate adipisicing culpa magna ea nulla ullamco consectetur. Cupidatat adipisicing consequat adipisicing sit consectetur dolor occaecat.', 46 | imageUrl: 'https://resources.ninghao.org/images/free_hugs.jpg', 47 | ), 48 | Post( 49 | title: 'Gravity Falls', 50 | author: 'Mohamed Chahin', 51 | description: 'Esse ut nulla velit reprehenderit veniam sint nostrud nulla exercitation ipsum. Officia deserunt aliquip aliquip excepteur eiusmod dolor. Elit amet ipsum labore sint occaecat dolore tempor officia irure voluptate ad. Veniam laboris deserunt aute excepteur sit deserunt dolor esse dolor velit sint nulla anim ut. Reprehenderit voluptate adipisicing culpa magna ea nulla ullamco consectetur. Cupidatat adipisicing consequat adipisicing sit consectetur dolor occaecat.', 52 | imageUrl: 'https://resources.ninghao.org/images/gravity-falls.png', 53 | ), 54 | Post( 55 | title: 'Icecream Truck', 56 | author: 'Mohamed Chahin', 57 | description: 'Esse ut nulla velit reprehenderit veniam sint nostrud nulla exercitation ipsum. Officia deserunt aliquip aliquip excepteur eiusmod dolor. Elit amet ipsum labore sint occaecat dolore tempor officia irure voluptate ad. Veniam laboris deserunt aute excepteur sit deserunt dolor esse dolor velit sint nulla anim ut. Reprehenderit voluptate adipisicing culpa magna ea nulla ullamco consectetur. Cupidatat adipisicing consequat adipisicing sit consectetur dolor occaecat.', 58 | imageUrl: 'https://resources.ninghao.org/images/icecreamtruck.png', 59 | ), 60 | Post( 61 | title: 'keyclack', 62 | author: 'Mohamed Chahin', 63 | description: 'Esse ut nulla velit reprehenderit veniam sint nostrud nulla exercitation ipsum. Officia deserunt aliquip aliquip excepteur eiusmod dolor. Elit amet ipsum labore sint occaecat dolore tempor officia irure voluptate ad. Veniam laboris deserunt aute excepteur sit deserunt dolor esse dolor velit sint nulla anim ut. Reprehenderit voluptate adipisicing culpa magna ea nulla ullamco consectetur. Cupidatat adipisicing consequat adipisicing sit consectetur dolor occaecat.', 64 | imageUrl: 'https://resources.ninghao.org/images/keyclack.jpg', 65 | ), 66 | Post( 67 | title: 'Overkill', 68 | author: 'Mohamed Chahin', 69 | description: 'Esse ut nulla velit reprehenderit veniam sint nostrud nulla exercitation ipsum. Officia deserunt aliquip aliquip excepteur eiusmod dolor. Elit amet ipsum labore sint occaecat dolore tempor officia irure voluptate ad. Veniam laboris deserunt aute excepteur sit deserunt dolor esse dolor velit sint nulla anim ut. Reprehenderit voluptate adipisicing culpa magna ea nulla ullamco consectetur. Cupidatat adipisicing consequat adipisicing sit consectetur dolor occaecat.', 70 | imageUrl: 'https://resources.ninghao.org/images/overkill.png', 71 | ), 72 | Post( 73 | title: 'Say Hello to Barry', 74 | author: 'Mohamed Chahin', 75 | description: 'Esse ut nulla velit reprehenderit veniam sint nostrud nulla exercitation ipsum. Officia deserunt aliquip aliquip excepteur eiusmod dolor. Elit amet ipsum labore sint occaecat dolore tempor officia irure voluptate ad. Veniam laboris deserunt aute excepteur sit deserunt dolor esse dolor velit sint nulla anim ut. Reprehenderit voluptate adipisicing culpa magna ea nulla ullamco consectetur. Cupidatat adipisicing consequat adipisicing sit consectetur dolor occaecat.', 76 | imageUrl: 'https://resources.ninghao.org/images/say-hello-to-barry.jpg', 77 | ), 78 | Post( 79 | title: 'Space Skull', 80 | author: 'Mohamed Chahin', 81 | description: 'Esse ut nulla velit reprehenderit veniam sint nostrud nulla exercitation ipsum. Officia deserunt aliquip aliquip excepteur eiusmod dolor. Elit amet ipsum labore sint occaecat dolore tempor officia irure voluptate ad. Veniam laboris deserunt aute excepteur sit deserunt dolor esse dolor velit sint nulla anim ut. Reprehenderit voluptate adipisicing culpa magna ea nulla ullamco consectetur. Cupidatat adipisicing consequat adipisicing sit consectetur dolor occaecat.', 82 | imageUrl: 'https://resources.ninghao.org/images/space-skull.jpg', 83 | ), 84 | Post( 85 | title: 'The Old Fashioned', 86 | author: 'Mohamed Chahin', 87 | description: 'Esse ut nulla velit reprehenderit veniam sint nostrud nulla exercitation ipsum. Officia deserunt aliquip aliquip excepteur eiusmod dolor. Elit amet ipsum labore sint occaecat dolore tempor officia irure voluptate ad. Veniam laboris deserunt aute excepteur sit deserunt dolor esse dolor velit sint nulla anim ut. Reprehenderit voluptate adipisicing culpa magna ea nulla ullamco consectetur. Cupidatat adipisicing consequat adipisicing sit consectetur dolor occaecat.', 88 | imageUrl: 'https://resources.ninghao.org/images/the-old-fashioned.png', 89 | ), 90 | Post( 91 | title: 'Tornado', 92 | author: 'Mohamed Chahin', 93 | description: 'Esse ut nulla velit reprehenderit veniam sint nostrud nulla exercitation ipsum. Officia deserunt aliquip aliquip excepteur eiusmod dolor. Elit amet ipsum labore sint occaecat dolore tempor officia irure voluptate ad. Veniam laboris deserunt aute excepteur sit deserunt dolor esse dolor velit sint nulla anim ut. Reprehenderit voluptate adipisicing culpa magna ea nulla ullamco consectetur. Cupidatat adipisicing consequat adipisicing sit consectetur dolor occaecat.', 94 | imageUrl: 'https://resources.ninghao.org/images/tornado.jpg', 95 | ), 96 | Post( 97 | title: 'Undo', 98 | author: 'Mohamed Chahin', 99 | description: 'Esse ut nulla velit reprehenderit veniam sint nostrud nulla exercitation ipsum. Officia deserunt aliquip aliquip excepteur eiusmod dolor. Elit amet ipsum labore sint occaecat dolore tempor officia irure voluptate ad. Veniam laboris deserunt aute excepteur sit deserunt dolor esse dolor velit sint nulla anim ut. Reprehenderit voluptate adipisicing culpa magna ea nulla ullamco consectetur. Cupidatat adipisicing consequat adipisicing sit consectetur dolor occaecat.', 100 | imageUrl: 'https://resources.ninghao.org/images/undo.jpg', 101 | ), 102 | Post( 103 | title: 'White Dragon', 104 | author: 'Mohamed Chahin', 105 | description: 'Esse ut nulla velit reprehenderit veniam sint nostrud nulla exercitation ipsum. Officia deserunt aliquip aliquip excepteur eiusmod dolor. Elit amet ipsum labore sint occaecat dolore tempor officia irure voluptate ad. Veniam laboris deserunt aute excepteur sit deserunt dolor esse dolor velit sint nulla anim ut. Reprehenderit voluptate adipisicing culpa magna ea nulla ullamco consectetur. Cupidatat adipisicing consequat adipisicing sit consectetur dolor occaecat.', 106 | imageUrl: 'https://resources.ninghao.org/images/white-dragon.jpg', 107 | ) 108 | ]; -------------------------------------------------------------------------------- /lib/swiper_pics.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_swiper/flutter_swiper.dart'; 3 | import 'my_gradview.dart'; 4 | 5 | class MySwiperPics extends StatefulWidget { 6 | @override 7 | _MySwiperPicsState createState() => _MySwiperPicsState(); 8 | } 9 | 10 | class _MySwiperPicsState extends State 11 | with SingleTickerProviderStateMixin { 12 | AnimationController _controller; 13 | 14 | @override 15 | void initState() { 16 | _controller = AnimationController(vsync: this); 17 | super.initState(); 18 | } 19 | 20 | @override 21 | void dispose() { 22 | _controller.dispose(); 23 | super.dispose(); 24 | } 25 | 26 | Widget _swiperBuilder(BuildContext context, int index) { 27 | var images = [ 28 | 'https://i0.hdslb.com/bfs/archive/2bcdd16080a1b741fb18ea9e2b2edb942f236389.jpg', 29 | "https://i0.hdslb.com/bfs/archive/5dea26a8ef8d5410b3e2e9861638bf46eeb70569.jpg", 30 | "https://i0.hdslb.com/bfs/archive/4cf45546da8f6a04321019c7ae83bcc3d1a8259e.jpg", 31 | "https://i0.hdslb.com/bfs/archive/a4758eac761305040574be94e4909d4b6414e612.jpg", 32 | "https://i0.hdslb.com/bfs/archive/1d5cd0e2ac820f68db273f5d53168a429fa83182.jpg", 33 | ]; 34 | return (Container( 35 | child: ClipRRect( 36 | child: Image.network( 37 | images[index], 38 | height: 150.0, 39 | scale: 0.1, 40 | fit: BoxFit.cover, 41 | ), 42 | // 用Container实现图片圆角的效果 43 | // decoration: BoxDecoration( 44 | borderRadius: BorderRadius.all(Radius.circular(10.0)), 45 | // ), 46 | )) 47 | // Image.network( images[index],height: 200.0, ) 48 | ); 49 | } 50 | 51 | @override 52 | Widget build(BuildContext context) { 53 | var videoImages = [ 54 | 'https://i1.hdslb.com/bfs/archive/f1be8293f490cd5e32a5c2f565c89880e76e3061.jpg@320w_200h.jpg', 55 | 'https://i1.hdslb.com/bfs/archive/416a3ee705b2ac544ff76f60af52f6655bf6eb42.jpg@320w_200h.jpg', 56 | 'https://i0.hdslb.com/bfs/archive/00573099a2c86569ea68380bb44ccf91b0ca8619.png@320w_200h.png', 57 | 'https://i2.hdslb.com/bfs/archive/c781bb917d148a18dc0981ee8a8abdead75fb95f.jpg@320w_200h.jpg', 58 | 'https://i0.hdslb.com/bfs/archive/515eb7f4ca826304eeadbd51e124e27ecbfd1e17.jpg@320w_200h.jpg', 59 | 'https://i1.hdslb.com/bfs/archive/e22ff91e9363d48f03d86ed00185bcda10181dee.jpg@320w_200h.jpg', 60 | 'https://i0.hdslb.com/bfs/archive/9eca86255ef1838886b4b5f1c0662d3e9f634410.jpg@320w_200h.jpg', 61 | 'https://i2.hdslb.com/bfs/archive/be9686d5bb15d4ce330f73ee6acd0303a9170b5b.jpg@320w_200h.jpg', 62 | 'https://i2.hdslb.com/bfs/archive/bdd67d993c31ac4a9bc5054367229bad40c4000a.jpg@320w_200h.jpg', 63 | 'https://i2.hdslb.com/bfs/archive/a90dd608483742898f02e45ec039097446cdcd56.jpg@320w_200h.jpg' 64 | ]; 65 | var videoContents = [ 66 | '【我爱我的祖国】易烊千...', 67 | '六千英镑就能买到劳斯莱.', 68 | '【章鱼哥哥&海绵宝宝】', 69 | '元首对蔡徐坤黑粉的愤怒', 70 | '6110分继续刚', 71 | '英雄联盟LEC赛区-春季赛', 72 | 'apex emmm', 73 | '与仙争鸡', 74 | '天桥地下的唱见', 75 | '今天的李先生疲惫了', 76 | ]; 77 | return ListView.builder( 78 | scrollDirection: Axis.vertical, 79 | itemCount: 2, 80 | itemBuilder: (BuildContext context, int position) { 81 | if (position == 0) { 82 | return Column( 83 | children: [ 84 | Container( 85 | height: 150.0, 86 | padding: EdgeInsets.all(5.0), 87 | alignment: Alignment(0, 0), 88 | child: Swiper( 89 | layout: SwiperLayout.DEFAULT, 90 | itemBuilder: _swiperBuilder, 91 | itemCount: 5, 92 | pagination: new SwiperPagination( 93 | alignment: Alignment.bottomRight, 94 | builder: DotSwiperPaginationBuilder( 95 | color: Colors.white, 96 | activeColor: Colors.red, 97 | )), 98 | control: new SwiperControl( 99 | iconNext: null, 100 | iconPrevious: null, 101 | ), 102 | scrollDirection: Axis.horizontal, 103 | autoplay: true, 104 | onTap: (index) => print('点击了第$index个'), 105 | ), 106 | ), 107 | ], 108 | ); 109 | } else { 110 | return Container( 111 | // color: Colors.teal, 112 | width: 375.0, 113 | height: 980.0, 114 | // color: Colors.grey, 115 | padding: EdgeInsets.symmetric(horizontal: 5), 116 | child: new GridView.builder( 117 | physics: new NeverScrollableScrollPhysics(), 118 | gridDelegate: new SliverGridDelegateWithMaxCrossAxisExtent( 119 | //SliverGridDelegateWithFixedCrossAxisCount可以直接指定每行(列)显示多少个Item SliverGridDelegateWithMaxCrossAxisExtent会根据GridView的宽度和你设置的每个的宽度来自动计算没行显示多少个Item 120 | //横轴的最大长度 121 | maxCrossAxisExtent: 180.0, 122 | //主轴间隔 123 | mainAxisSpacing: 10.0, 124 | //横轴间隔 125 | crossAxisSpacing: 5.0, 126 | ), 127 | itemBuilder: (BuildContext context, int index) { 128 | return Container( 129 | alignment: Alignment.center, 130 | decoration: BoxDecoration( 131 | color: Colors.white, 132 | border: Border.all(color: Colors.black54, width: 0.5), 133 | borderRadius: BorderRadius.all(Radius.circular(10.0)), 134 | boxShadow: [ 135 | BoxShadow( 136 | color: Colors.black12, 137 | offset: Offset(1, 1), 138 | blurRadius: 1.0, 139 | ), 140 | ]), 141 | child: Column( 142 | children: [ 143 | Stack( 144 | children: [ 145 | ClipRRect( 146 | borderRadius: BorderRadius.only( 147 | topLeft: Radius.circular(5.0), 148 | topRight: Radius.circular(5.0)), 149 | child: new Image.network( 150 | videoImages[index], 151 | width: 178, 152 | height: 120, 153 | fit: BoxFit.cover, 154 | ), 155 | ), 156 | Positioned( 157 | bottom: 5, 158 | left: 3.0, 159 | child: Row( 160 | mainAxisAlignment: 161 | MainAxisAlignment.spaceEvenly, 162 | crossAxisAlignment: CrossAxisAlignment.center, 163 | children: [ 164 | Icon( 165 | Icons.play_circle_outline, 166 | size: 20.0, 167 | color: Colors.white, 168 | ), 169 | Text( 170 | '1630 ', 171 | style: TextStyle( 172 | color: Colors.white, fontSize: 13.0), 173 | ), 174 | Icon( 175 | Icons.hourglass_empty, 176 | size: 20.0, 177 | color: Colors.white, 178 | ), 179 | Text( 180 | ' 96', 181 | style: TextStyle( 182 | color: Colors.white, fontSize: 13.0), 183 | ), 184 | Text( 185 | ' 7:25', 186 | style: TextStyle( 187 | color: Colors.white, fontSize: 13.0), 188 | ), 189 | ], 190 | )), 191 | ], 192 | ), 193 | Container( 194 | alignment: Alignment.centerLeft, 195 | height: 50.0, 196 | padding: EdgeInsets.symmetric(horizontal: 3), 197 | child: Column( 198 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 199 | crossAxisAlignment: CrossAxisAlignment.start, 200 | children: [ 201 | Text( 202 | videoContents[index], 203 | style: TextStyle( 204 | fontSize: 14.0, 205 | fontWeight: FontWeight.normal), 206 | ), 207 | Container( 208 | // color: Colors.yellow, 209 | child: Text( 210 | '内容源自:【哔哩哔哩】', 211 | style: TextStyle( 212 | color: Colors.black45, 213 | fontSize: 12.0, 214 | fontWeight: FontWeight.normal), 215 | ), 216 | ), 217 | ], 218 | ), 219 | ) 220 | ], 221 | ), 222 | ); 223 | }, 224 | itemCount: 10, 225 | ), 226 | ); 227 | } 228 | }); 229 | } 230 | } 231 | -------------------------------------------------------------------------------- /lib/video_app_bar.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class VideoAppBar extends StatefulWidget { 4 | @override 5 | _VideoAppBarState createState() => _VideoAppBarState(); 6 | } 7 | 8 | class _VideoAppBarState extends State 9 | with SingleTickerProviderStateMixin { 10 | AnimationController _controller; 11 | 12 | @override 13 | void initState() { 14 | _controller = AnimationController(vsync: this); 15 | super.initState(); 16 | } 17 | 18 | @override 19 | void dispose() { 20 | _controller.dispose(); 21 | super.dispose(); 22 | } 23 | 24 | @override 25 | Widget build(BuildContext context) { 26 | return Container( 27 | margin: EdgeInsets.symmetric(horizontal: 10.0), 28 | padding: EdgeInsets.only(bottom: 0, left: 0, top: 15), 29 | height: 60.0, 30 | // color: Colors.blue, 31 | alignment: Alignment.bottomLeft, 32 | child: Row( 33 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 34 | crossAxisAlignment: CrossAxisAlignment.center, 35 | children: [ 36 | Column( 37 | mainAxisAlignment: MainAxisAlignment.center, 38 | crossAxisAlignment: CrossAxisAlignment.center, 39 | children: [ 40 | Text( 41 | '广场', 42 | style: TextStyle( 43 | color: Colors.white, 44 | fontWeight: FontWeight.w400, 45 | fontSize: 23.0), 46 | ), 47 | Container( 48 | margin: EdgeInsets.symmetric(vertical: 2), 49 | width: 55, 50 | height: 3, 51 | decoration: BoxDecoration( 52 | color: Colors.white, 53 | borderRadius: BorderRadius.all(Radius.circular(3))), 54 | ) 55 | ], 56 | ), 57 | FlatButton( 58 | materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, 59 | onPressed: () { 60 | Navigator.pushNamed(context, "DetailPage"); 61 | }, 62 | child: Container( 63 | width: 30, 64 | padding: EdgeInsets.only(left: 30), 65 | // alignment: Alignment.centerRight, 66 | child: Icon( 67 | Icons.list, 68 | color: Colors.white, 69 | size: 32.0, 70 | ), 71 | ) 72 | ) 73 | ], 74 | )); 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://www.dartlang.org/tools/pub/glossary#lockfile 3 | packages: 4 | async: 5 | dependency: transitive 6 | description: 7 | name: async 8 | url: "https://pub.flutter-io.cn" 9 | source: hosted 10 | version: "2.1.0" 11 | boolean_selector: 12 | dependency: transitive 13 | description: 14 | name: boolean_selector 15 | url: "https://pub.flutter-io.cn" 16 | source: hosted 17 | version: "1.0.4" 18 | charcode: 19 | dependency: transitive 20 | description: 21 | name: charcode 22 | url: "https://pub.flutter-io.cn" 23 | source: hosted 24 | version: "1.1.2" 25 | collection: 26 | dependency: transitive 27 | description: 28 | name: collection 29 | url: "https://pub.flutter-io.cn" 30 | source: hosted 31 | version: "1.14.11" 32 | cupertino_icons: 33 | dependency: "direct main" 34 | description: 35 | name: cupertino_icons 36 | url: "https://pub.flutter-io.cn" 37 | source: hosted 38 | version: "0.1.2" 39 | flutter: 40 | dependency: "direct main" 41 | description: flutter 42 | source: sdk 43 | version: "0.0.0" 44 | flutter_page_indicator: 45 | dependency: transitive 46 | description: 47 | name: flutter_page_indicator 48 | url: "https://pub.flutter-io.cn" 49 | source: hosted 50 | version: "0.0.3" 51 | flutter_staggered_grid_view: 52 | dependency: "direct main" 53 | description: 54 | name: flutter_staggered_grid_view 55 | url: "https://pub.flutter-io.cn" 56 | source: hosted 57 | version: "0.2.7" 58 | flutter_statusbarcolor: 59 | dependency: "direct main" 60 | description: 61 | name: flutter_statusbarcolor 62 | url: "https://pub.flutter-io.cn" 63 | source: hosted 64 | version: "0.2.0" 65 | flutter_swiper: 66 | dependency: "direct main" 67 | description: 68 | name: flutter_swiper 69 | url: "https://pub.flutter-io.cn" 70 | source: hosted 71 | version: "1.1.6" 72 | flutter_test: 73 | dependency: "direct dev" 74 | description: flutter 75 | source: sdk 76 | version: "0.0.0" 77 | flutter_webview_plugin: 78 | dependency: "direct main" 79 | description: 80 | name: flutter_webview_plugin 81 | url: "https://pub.flutter-io.cn" 82 | source: hosted 83 | version: "0.3.5" 84 | matcher: 85 | dependency: transitive 86 | description: 87 | name: matcher 88 | url: "https://pub.flutter-io.cn" 89 | source: hosted 90 | version: "0.12.5" 91 | meta: 92 | dependency: transitive 93 | description: 94 | name: meta 95 | url: "https://pub.flutter-io.cn" 96 | source: hosted 97 | version: "1.1.6" 98 | path: 99 | dependency: transitive 100 | description: 101 | name: path 102 | url: "https://pub.flutter-io.cn" 103 | source: hosted 104 | version: "1.6.2" 105 | pedantic: 106 | dependency: transitive 107 | description: 108 | name: pedantic 109 | url: "https://pub.flutter-io.cn" 110 | source: hosted 111 | version: "1.5.0" 112 | quiver: 113 | dependency: transitive 114 | description: 115 | name: quiver 116 | url: "https://pub.flutter-io.cn" 117 | source: hosted 118 | version: "2.0.2" 119 | sky_engine: 120 | dependency: transitive 121 | description: flutter 122 | source: sdk 123 | version: "0.0.99" 124 | source_span: 125 | dependency: transitive 126 | description: 127 | name: source_span 128 | url: "https://pub.flutter-io.cn" 129 | source: hosted 130 | version: "1.5.5" 131 | stack_trace: 132 | dependency: transitive 133 | description: 134 | name: stack_trace 135 | url: "https://pub.flutter-io.cn" 136 | source: hosted 137 | version: "1.9.3" 138 | stream_channel: 139 | dependency: transitive 140 | description: 141 | name: stream_channel 142 | url: "https://pub.flutter-io.cn" 143 | source: hosted 144 | version: "2.0.0" 145 | string_scanner: 146 | dependency: transitive 147 | description: 148 | name: string_scanner 149 | url: "https://pub.flutter-io.cn" 150 | source: hosted 151 | version: "1.0.4" 152 | term_glyph: 153 | dependency: transitive 154 | description: 155 | name: term_glyph 156 | url: "https://pub.flutter-io.cn" 157 | source: hosted 158 | version: "1.1.0" 159 | test_api: 160 | dependency: transitive 161 | description: 162 | name: test_api 163 | url: "https://pub.flutter-io.cn" 164 | source: hosted 165 | version: "0.2.4" 166 | transformer_page_view: 167 | dependency: transitive 168 | description: 169 | name: transformer_page_view 170 | url: "https://pub.flutter-io.cn" 171 | source: hosted 172 | version: "0.1.6" 173 | typed_data: 174 | dependency: transitive 175 | description: 176 | name: typed_data 177 | url: "https://pub.flutter-io.cn" 178 | source: hosted 179 | version: "1.1.6" 180 | vector_math: 181 | dependency: transitive 182 | description: 183 | name: vector_math 184 | url: "https://pub.flutter-io.cn" 185 | source: hosted 186 | version: "2.0.8" 187 | video_player: 188 | dependency: "direct main" 189 | description: 190 | name: video_player 191 | url: "https://pub.flutter-io.cn" 192 | source: hosted 193 | version: "0.10.1+3" 194 | sdks: 195 | dart: ">=2.2.0 <3.0.0" 196 | flutter: ">=1.5.0 <2.0.0" 197 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: bilibili_app 2 | description: A new Flutter application. 3 | 4 | # The following defines the version and build number for your application. 5 | # A version number is three numbers separated by dots, like 1.2.43 6 | # followed by an optional build number separated by a +. 7 | # Both the version and the builder number may be overridden in flutter 8 | # build by specifying --build-name and --build-number, respectively. 9 | # In Android, build-name is used as versionName while build-number used as versionCode. 10 | # Read more about Android versioning at https://developer.android.com/studio/publish/versioning 11 | # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. 12 | # Read more about iOS versioning at 13 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html 14 | version: 1.0.0+1 15 | 16 | environment: 17 | sdk: ">=2.1.0 <3.0.0" 18 | 19 | dependencies: 20 | flutter: 21 | sdk: flutter 22 | 23 | # The following adds the Cupertino Icons font to your application. 24 | # Use with the CupertinoIcons class for iOS style icons. 25 | cupertino_icons: ^0.1.2 26 | video_player: 27 | flutter_swiper: 28 | flutter_webview_plugin: 29 | flutter_staggered_grid_view: 30 | flutter_statusbarcolor: 31 | 32 | # video_launcher: 33 | 34 | dev_dependencies: 35 | flutter_test: 36 | sdk: flutter 37 | 38 | 39 | # For information on the generic Dart part of this file, see the 40 | # following page: https://www.dartlang.org/tools/pub/pubspec 41 | 42 | # The following section is specific to Flutter. 43 | flutter: 44 | 45 | # The following line ensures that the Material Icons font is 46 | # included with your application, so that you can use the icons in 47 | # the material Icons class. 48 | uses-material-design: true 49 | 50 | # To add assets to your application, add an assets section, like this: 51 | # assets: 52 | # - images/a_dot_burr.jpeg 53 | # - images/a_dot_ham.jpeg 54 | 55 | # An image asset can refer to one or more resolution-specific "variants", see 56 | # https://flutter.io/assets-and-images/#resolution-aware. 57 | 58 | # For details regarding adding assets from package dependencies, see 59 | # https://flutter.io/assets-and-images/#from-packages 60 | 61 | # To add custom fonts to your application, add a fonts section here, 62 | # in this "flutter" section. Each entry in this list should have a 63 | # "family" key with the font family name, and a "fonts" key with a 64 | # list giving the asset and other descriptors for the font. For 65 | # example: 66 | # fonts: 67 | # - family: Schyler 68 | # fonts: 69 | # - asset: fonts/Schyler-Regular.ttf 70 | # - asset: fonts/Schyler-Italic.ttf 71 | # style: italic 72 | # - family: Trajan Pro 73 | # fonts: 74 | # - asset: fonts/TrajanPro.ttf 75 | # - asset: fonts/TrajanPro_Bold.ttf 76 | # weight: 700 77 | # 78 | # For details regarding fonts from package dependencies, 79 | # see https://flutter.io/custom-fonts/#from-packages 80 | -------------------------------------------------------------------------------- /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 that Flutter provides. 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:bilibili_app/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(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 | --------------------------------------------------------------------------------