├── .gitignore ├── .metadata ├── README.md ├── android ├── app │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── AndroidManifest.xml │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── chtwm │ │ │ │ └── htjf_flutter_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 ├── assets ├── images │ ├── customer_service.png │ ├── git_show │ │ ├── asset.jpg │ │ ├── asset_detail.jpg │ │ ├── index.jpg │ │ ├── mine.jpg │ │ ├── news.jpg │ │ ├── private.jpg │ │ └── public.jpg │ ├── ic_asset.png │ ├── ic_asset_profit.png │ ├── ic_back_arrow.png │ ├── ic_bank_card.png │ ├── ic_basic_info.png │ ├── ic_detail.png │ ├── ic_employee_info.png │ ├── ic_header.png │ ├── ic_index.png │ ├── ic_licaishi.png │ ├── ic_mine.png │ ├── ic_news.png │ ├── ic_phone.png │ ├── ic_product.png │ ├── ic_qualifacation.png │ ├── ic_right_arrow.png │ ├── ic_right_triangle.png │ ├── ic_risk_test.png │ ├── ic_star_empty.png │ ├── ic_star_full.png │ ├── ic_team.png │ ├── ic_tip_yellow.png │ ├── icon_account.png │ ├── icon_cash.png │ ├── icon_current.png │ ├── icon_dismiss.png │ ├── icon_heng_shop.png │ ├── icon_mine_header.png │ ├── icon_new_public.png │ ├── icon_private.png │ ├── icon_public_education.png │ ├── icon_public_fixed.png │ ├── icon_public_grad.png │ ├── icon_public_group.png │ ├── icon_public_rank.png │ ├── icon_public_smart.png │ ├── icon_selected_public.png │ ├── icon_show.png │ ├── icon_tip_red.png │ ├── index_header_1.png │ ├── index_header_2.png │ ├── index_header_3.png │ ├── iv_assets_bg.png │ ├── iv_guest_like.png │ ├── iv_mine_header.png │ ├── iv_private_market.png │ └── iv_video.png └── mock │ ├── caijing.json │ ├── get_banner_info.json │ ├── get_news_list.json │ ├── index.json │ ├── keji.json │ ├── shehui.json │ └── tiyu.json ├── ios ├── Flutter │ ├── AppFrameworkInfo.plist │ ├── Debug.xcconfig │ └── Release.xcconfig ├── Runner.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ └── xcshareddata │ │ └── xcschemes │ │ └── Runner.xcscheme ├── Runner.xcworkspace │ └── contents.xcworkspacedata └── 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 ├── base │ ├── baseLoadingWidget.dart │ ├── baseNetWidget.dart │ ├── baseUiWidget.dart │ └── baseWidget.dart ├── main.dart ├── model │ ├── NewsListModel.dart │ ├── PrivateProductModel.dart │ ├── bannerModel.dart │ ├── config.dart │ └── newsModel.dart ├── net │ ├── API.dart │ └── requestAPI.dart ├── page │ ├── assetPage.dart │ ├── details │ │ ├── bannerDetail.dart │ │ └── newsDetail.dart │ ├── index │ │ └── indexPage.dart │ ├── minePage.dart │ ├── news │ │ ├── newsList.dart │ │ └── newsPage.dart │ └── product │ │ ├── productDetail │ │ ├── privateProductDetail.dart │ │ └── publicProductDetail.dart │ │ └── productPage │ │ ├── privateProduct.dart │ │ ├── productPage.dart │ │ └── publicProduct.dart └── utils │ └── utils.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 | # The .vscode folder contains launch configuration and tasks you configure in 19 | # VS Code which you may wish to be included in version control, so this line 20 | # is commented out by default. 21 | #.vscode/ 22 | 23 | # Flutter/Dart/Pub related 24 | **/doc/api/ 25 | .dart_tool/ 26 | .flutter-plugins 27 | .packages 28 | .pub-cache/ 29 | .pub/ 30 | /build/ 31 | 32 | # Android related 33 | **/android/**/gradle-wrapper.jar 34 | **/android/.gradle 35 | **/android/captures/ 36 | **/android/gradlew 37 | **/android/gradlew.bat 38 | **/android/local.properties 39 | **/android/**/GeneratedPluginRegistrant.java 40 | 41 | # iOS/XCode related 42 | **/ios/**/*.mode1v3 43 | **/ios/**/*.mode2v3 44 | **/ios/**/*.moved-aside 45 | **/ios/**/*.pbxuser 46 | **/ios/**/*.perspectivev3 47 | **/ios/**/*sync/ 48 | **/ios/**/.sconsign.dblite 49 | **/ios/**/.tags* 50 | **/ios/**/.vagrant/ 51 | **/ios/**/DerivedData/ 52 | **/ios/**/Icon? 53 | **/ios/**/Pods/ 54 | **/ios/**/.symlinks/ 55 | **/ios/**/profile 56 | **/ios/**/xcuserdata 57 | **/ios/.generated/ 58 | **/ios/Flutter/App.framework 59 | **/ios/Flutter/Flutter.framework 60 | **/ios/Flutter/Generated.xcconfig 61 | **/ios/Flutter/app.flx 62 | **/ios/Flutter/app.zip 63 | **/ios/Flutter/flutter_assets/ 64 | **/ios/ServiceDefinitions.json 65 | **/ios/Runner/GeneratedPluginRegistrant.* 66 | 67 | # Exceptions to above rules. 68 | !**/ios/**/default.mode1v3 69 | !**/ios/**/default.mode2v3 70 | !**/ios/**/default.pbxuser 71 | !**/ios/**/default.perspectivev3 72 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages 73 | -------------------------------------------------------------------------------- /.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: 20e59316b8b8474554b38493b8ca888794b0234a 8 | channel: stable 9 | 10 | project_type: app 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 纯Flutter开发 金融类型App 2 | 3 |
4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | # 项目介绍 14 | 15 | 上图中从左到右,分别为首页、私募产品、公募产品、资产列表、资产详情、新闻资讯、我的 几个模块。可覆盖金融类型App的几乎全部场景 16 | 17 | -------------------------------------------------------------------------------- /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.chtwm.htjf_flutter_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/chtwm/htjf_flutter_app/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.chtwm.htjf_flutter_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/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/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 | 3 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /assets/images/customer_service.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/customer_service.png -------------------------------------------------------------------------------- /assets/images/git_show/asset.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/git_show/asset.jpg -------------------------------------------------------------------------------- /assets/images/git_show/asset_detail.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/git_show/asset_detail.jpg -------------------------------------------------------------------------------- /assets/images/git_show/index.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/git_show/index.jpg -------------------------------------------------------------------------------- /assets/images/git_show/mine.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/git_show/mine.jpg -------------------------------------------------------------------------------- /assets/images/git_show/news.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/git_show/news.jpg -------------------------------------------------------------------------------- /assets/images/git_show/private.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/git_show/private.jpg -------------------------------------------------------------------------------- /assets/images/git_show/public.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/git_show/public.jpg -------------------------------------------------------------------------------- /assets/images/ic_asset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/ic_asset.png -------------------------------------------------------------------------------- /assets/images/ic_asset_profit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/ic_asset_profit.png -------------------------------------------------------------------------------- /assets/images/ic_back_arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/ic_back_arrow.png -------------------------------------------------------------------------------- /assets/images/ic_bank_card.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/ic_bank_card.png -------------------------------------------------------------------------------- /assets/images/ic_basic_info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/ic_basic_info.png -------------------------------------------------------------------------------- /assets/images/ic_detail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/ic_detail.png -------------------------------------------------------------------------------- /assets/images/ic_employee_info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/ic_employee_info.png -------------------------------------------------------------------------------- /assets/images/ic_header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/ic_header.png -------------------------------------------------------------------------------- /assets/images/ic_index.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/ic_index.png -------------------------------------------------------------------------------- /assets/images/ic_licaishi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/ic_licaishi.png -------------------------------------------------------------------------------- /assets/images/ic_mine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/ic_mine.png -------------------------------------------------------------------------------- /assets/images/ic_news.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/ic_news.png -------------------------------------------------------------------------------- /assets/images/ic_phone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/ic_phone.png -------------------------------------------------------------------------------- /assets/images/ic_product.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/ic_product.png -------------------------------------------------------------------------------- /assets/images/ic_qualifacation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/ic_qualifacation.png -------------------------------------------------------------------------------- /assets/images/ic_right_arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/ic_right_arrow.png -------------------------------------------------------------------------------- /assets/images/ic_right_triangle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/ic_right_triangle.png -------------------------------------------------------------------------------- /assets/images/ic_risk_test.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/ic_risk_test.png -------------------------------------------------------------------------------- /assets/images/ic_star_empty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/ic_star_empty.png -------------------------------------------------------------------------------- /assets/images/ic_star_full.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/ic_star_full.png -------------------------------------------------------------------------------- /assets/images/ic_team.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/ic_team.png -------------------------------------------------------------------------------- /assets/images/ic_tip_yellow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/ic_tip_yellow.png -------------------------------------------------------------------------------- /assets/images/icon_account.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/icon_account.png -------------------------------------------------------------------------------- /assets/images/icon_cash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/icon_cash.png -------------------------------------------------------------------------------- /assets/images/icon_current.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/icon_current.png -------------------------------------------------------------------------------- /assets/images/icon_dismiss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/icon_dismiss.png -------------------------------------------------------------------------------- /assets/images/icon_heng_shop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/icon_heng_shop.png -------------------------------------------------------------------------------- /assets/images/icon_mine_header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/icon_mine_header.png -------------------------------------------------------------------------------- /assets/images/icon_new_public.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/icon_new_public.png -------------------------------------------------------------------------------- /assets/images/icon_private.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/icon_private.png -------------------------------------------------------------------------------- /assets/images/icon_public_education.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/icon_public_education.png -------------------------------------------------------------------------------- /assets/images/icon_public_fixed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/icon_public_fixed.png -------------------------------------------------------------------------------- /assets/images/icon_public_grad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/icon_public_grad.png -------------------------------------------------------------------------------- /assets/images/icon_public_group.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/icon_public_group.png -------------------------------------------------------------------------------- /assets/images/icon_public_rank.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/icon_public_rank.png -------------------------------------------------------------------------------- /assets/images/icon_public_smart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/icon_public_smart.png -------------------------------------------------------------------------------- /assets/images/icon_selected_public.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/icon_selected_public.png -------------------------------------------------------------------------------- /assets/images/icon_show.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/icon_show.png -------------------------------------------------------------------------------- /assets/images/icon_tip_red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/icon_tip_red.png -------------------------------------------------------------------------------- /assets/images/index_header_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/index_header_1.png -------------------------------------------------------------------------------- /assets/images/index_header_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/index_header_2.png -------------------------------------------------------------------------------- /assets/images/index_header_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/index_header_3.png -------------------------------------------------------------------------------- /assets/images/iv_assets_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/iv_assets_bg.png -------------------------------------------------------------------------------- /assets/images/iv_guest_like.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/iv_guest_like.png -------------------------------------------------------------------------------- /assets/images/iv_mine_header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/iv_mine_header.png -------------------------------------------------------------------------------- /assets/images/iv_private_market.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/iv_private_market.png -------------------------------------------------------------------------------- /assets/images/iv_video.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/assets/images/iv_video.png -------------------------------------------------------------------------------- /assets/mock/get_banner_info.json: -------------------------------------------------------------------------------- 1 | {"status": 0, "message": "请求成功", "banner_list": [{"title": "新产品", "img_path" : "http://img1.gtimg.com/sports/pics/hv1/202/84/1781/115831147.jpg"}, {"title": "新产品1", "img_path" : "http://img1.gtimg.com/sports/pics/hv1/202/84/1781/115831147.jpg"}, {"title": "新产品2", "img_path" : "http://img1.gtimg.com/sports/pics/hv1/202/84/1781/115831147.jpg"}]} -------------------------------------------------------------------------------- /assets/mock/get_news_list.json: -------------------------------------------------------------------------------- 1 | {"status": 0, "message": "请求成功", "news_list": [{"title": "国海证券,三种技术风格融为一体,你该如何抉择,", "date" : "2019-04-05"}, {"title": "国海证券,三种技术风格融为一体,你该如何抉择,", "date" : "2019-04-05"}, {"title": "国海证券,三种技术风格融为一体,你该如何抉择,", "date" : "2019-04-05"}, {"title": "国海证券,三种技术风格融为一体,你该如何抉择,", "date" : "2019-04-05"}, {"title": "国海证券,三种技术风格融为一体,你该如何抉择,", "date" : "2019-04-05"}, {"title": "国海证券,三种技术风格融为一体,你该如何抉择,", "date" : "2019-04-05"}, {"title": "国海证券,三种技术风格融为一体,你该如何抉择,", "date" : "2019-04-05"}, {"title": "国海证券,三种技术风格融为一体,你该如何抉择,", "date" : "2019-04-05"}]} -------------------------------------------------------------------------------- /assets/mock/shehui.json: -------------------------------------------------------------------------------- 1 | { 2 | "reason":"成功的返回", 3 | "result":{ 4 | "stat":"1", 5 | "data":[ 6 | { 7 | "uniquekey":"d1c4738661af68352b8c9dc0c3dd1199", 8 | "title":"因LPR新政执行,合肥某行要求客户重签贷款合同", 9 | "date":"2019-10-14 14:10", 10 | "category":"社会", 11 | "author_name":"乐居网", 12 | "url":"http:\/\/mini.eastday.com\/mobile\/191014141039479.html", 13 | "thumbnail_pic_s":"http:\/\/06imgmini.eastday.com\/mobile\/20191014\/20191014141039_1e297a71cdb1dadaf7b66759da4eafe1_2_mwpm_03200403.jpg" 14 | }, 15 | { 16 | "uniquekey":"9bf1e66f90635dd8b41c05744424657d", 17 | "title":"超市卖娃娃鱼违规吗?市场监管部门:须人工驯养 手续齐全", 18 | "date":"2019-10-14 14:08", 19 | "category":"社会", 20 | "author_name":"荔枝新闻", 21 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140838276.html", 22 | "thumbnail_pic_s":"http:\/\/07imgmini.eastday.com\/mobile\/20191014\/20191014140838_46f018907bb5579ca3ae42e16a639e3c_5_mwpm_03200403.jpg", 23 | "thumbnail_pic_s02":"http:\/\/07imgmini.eastday.com\/mobile\/20191014\/20191014140838_46f018907bb5579ca3ae42e16a639e3c_3_mwpm_03200403.jpg", 24 | "thumbnail_pic_s03":"http:\/\/07imgmini.eastday.com\/mobile\/20191014\/20191014140838_46f018907bb5579ca3ae42e16a639e3c_2_mwpm_03200403.jpg" 25 | }, 26 | { 27 | "uniquekey":"bb801da3bde7fcf87d2591494d1d6ad8", 28 | "title":"机智!民警将行窃监控截图微信群发 小偷吓得投案自首", 29 | "date":"2019-10-14 14:08", 30 | "category":"社会", 31 | "author_name":"荔枝新闻", 32 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140838218.html", 33 | "thumbnail_pic_s":"http:\/\/03imgmini.eastday.com\/mobile\/20191014\/20191014140838_a63e814e34e2644f88e8d9c91bbf8340_2_mwpm_03200403.jpg", 34 | "thumbnail_pic_s02":"http:\/\/03imgmini.eastday.com\/mobile\/20191014\/20191014140838_a63e814e34e2644f88e8d9c91bbf8340_1_mwpm_03200403.jpg", 35 | "thumbnail_pic_s03":"http:\/\/03imgmini.eastday.com\/mobile\/20191014\/20191014140838_a63e814e34e2644f88e8d9c91bbf8340_3_mwpm_03200403.jpg" 36 | }, 37 | { 38 | "uniquekey":"1444e33b30b2d4f657d5bfe766658c49", 39 | "title":"咋回事?快递电瓶车变衣物 寄送地址差了十万八千里", 40 | "date":"2019-10-14 14:08", 41 | "category":"社会", 42 | "author_name":"荔枝新闻", 43 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140838126.html", 44 | "thumbnail_pic_s":"http:\/\/01imgmini.eastday.com\/mobile\/20191014\/20191014140838_bf132c6845736b64d0dfa7633622e209_2_mwpm_03200403.jpg", 45 | "thumbnail_pic_s02":"http:\/\/01imgmini.eastday.com\/mobile\/20191014\/20191014140838_bf132c6845736b64d0dfa7633622e209_1_mwpm_03200403.jpg" 46 | }, 47 | { 48 | "uniquekey":"5d548e48671a8877a9d323549e76233e", 49 | "title":"急!为救人贵阳“的哥”连闯两个红灯!患者家属请出来为他作证", 50 | "date":"2019-10-14 14:07", 51 | "category":"社会", 52 | "author_name":"数字贵州新闻", 53 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140758741.html", 54 | "thumbnail_pic_s":"http:\/\/09imgmini.eastday.com\/mobile\/20191014\/20191014140758_6fbb902130baf17ffcc4c43ce81540c4_3_mwpm_03200403.jpg", 55 | "thumbnail_pic_s02":"http:\/\/09imgmini.eastday.com\/mobile\/20191014\/20191014140758_6fbb902130baf17ffcc4c43ce81540c4_12_mwpm_03200403.jpg", 56 | "thumbnail_pic_s03":"http:\/\/09imgmini.eastday.com\/mobile\/20191014\/20191014140758_6fbb902130baf17ffcc4c43ce81540c4_10_mwpm_03200403.jpg" 57 | }, 58 | { 59 | "uniquekey":"33e255988984e3a42fd1d37057aeae20", 60 | "title":"深圳已建成176处室外应急避难场所", 61 | "date":"2019-10-14 14:06", 62 | "category":"社会", 63 | "author_name":"羊城派", 64 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140642365.html", 65 | "thumbnail_pic_s":"http:\/\/08imgmini.eastday.com\/mobile\/20191014\/20191014140642_b751eb090b2c5a4eacf54201e805fe0c_1_mwpm_03200403.jpg" 66 | }, 67 | { 68 | "uniquekey":"1985ae6497a1cdca9ef9cfea467463f9", 69 | "title":"凤岗公安为您支一招之防范盗窃篇", 70 | "date":"2019-10-14 14:06", 71 | "category":"社会", 72 | "author_name":"平安东莞", 73 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140642242.html", 74 | "thumbnail_pic_s":"http:\/\/02imgmini.eastday.com\/mobile\/20191014\/20191014140642_b88ae6c3a5fde9ac427a5ef25d9b260e_3_mwpm_03200403.jpg", 75 | "thumbnail_pic_s02":"http:\/\/02imgmini.eastday.com\/mobile\/20191014\/20191014140642_b88ae6c3a5fde9ac427a5ef25d9b260e_6_mwpm_03200403.jpg", 76 | "thumbnail_pic_s03":"http:\/\/02imgmini.eastday.com\/mobile\/20191014\/20191014140642_b88ae6c3a5fde9ac427a5ef25d9b260e_8_mwpm_03200403.jpg" 77 | }, 78 | { 79 | "uniquekey":"44eae988ab13b233f3175898b21617bf", 80 | "title":"贵阳独居大爷患“装修后遗症”,邻居报警求助", 81 | "date":"2019-10-14 14:06", 82 | "category":"社会", 83 | "author_name":"贵州交通广播", 84 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140634410.html", 85 | "thumbnail_pic_s":"http:\/\/09imgmini.eastday.com\/mobile\/20191014\/20191014140634_ce527b668135daf081972fc0544ba680_1_mwpm_03200403.jpg", 86 | "thumbnail_pic_s02":"http:\/\/09imgmini.eastday.com\/mobile\/20191014\/20191014140634_ce527b668135daf081972fc0544ba680_3_mwpm_03200403.jpg", 87 | "thumbnail_pic_s03":"http:\/\/09imgmini.eastday.com\/mobile\/20191014\/20191014140634_ce527b668135daf081972fc0544ba680_2_mwpm_03200403.jpg" 88 | }, 89 | { 90 | "uniquekey":"e6891b395d311c933a089f270bec8ee3", 91 | "title":"石头会呼吸 粉红花田上千亩 重庆这个景区一天穿越一亿年", 92 | "date":"2019-10-14 14:06", 93 | "category":"社会", 94 | "author_name":"腾讯大渝网", 95 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140630452.html", 96 | "thumbnail_pic_s":"http:\/\/01imgmini.eastday.com\/mobile\/20191014\/20191014140630_7e73d045ddf668d72b12db30dbe0f327_1_mwpm_03200403.jpg" 97 | }, 98 | { 99 | "uniquekey":"1b83e7be036407ebbce62967e7cd94ff", 100 | "title":"东莞书法最高奖“鳌台书院奖”东莞市第十届书法篆刻大赛颁奖典礼举行", 101 | "date":"2019-10-14 14:06", 102 | "category":"社会", 103 | "author_name":"东莞时间网", 104 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140628454.html", 105 | "thumbnail_pic_s":"http:\/\/00imgmini.eastday.com\/mobile\/20191014\/20191014140628_177f7a8ab0ea61e43e1cf2f1acfa2e1c_1_mwpm_03200403.jpg" 106 | }, 107 | { 108 | "uniquekey":"240ee68769554c5a826898b85a7bee67", 109 | "title":"南图朗读者 用朗诵表达对祖国的热爱", 110 | "date":"2019-10-14 14:05", 111 | "category":"社会", 112 | "author_name":"深圳新闻网", 113 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140554480.html", 114 | "thumbnail_pic_s":"http:\/\/02imgmini.eastday.com\/mobile\/20191014\/20191014140554_e5d1dabcd0ad126319fa10373a997525_3_mwpm_03200403.jpg", 115 | "thumbnail_pic_s02":"http:\/\/02imgmini.eastday.com\/mobile\/20191014\/20191014140554_e5d1dabcd0ad126319fa10373a997525_2_mwpm_03200403.jpg", 116 | "thumbnail_pic_s03":"http:\/\/02imgmini.eastday.com\/mobile\/20191014\/20191014140554_e5d1dabcd0ad126319fa10373a997525_4_mwpm_03200403.jpg" 117 | }, 118 | { 119 | "uniquekey":"3e41b71d3b194dca8708c2c3624da4f0", 120 | "title":"车主贷款买保时捷不还钱 法院查找停车信息扣押车辆", 121 | "date":"2019-10-14 14:04", 122 | "category":"社会", 123 | "author_name":"人民网", 124 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140440490.html", 125 | "thumbnail_pic_s":"http:\/\/01imgmini.eastday.com\/mobile\/20191014\/20191014140440_5a8280954fe87599100fe6ee2a75e583_1_mwpm_03200403.jpg" 126 | }, 127 | { 128 | "uniquekey":"bffdafae17379e6c371f68a159837d62", 129 | "title":"新北男闯工地躺下!挖土机倒车拦腰辗过 倒霉司机被送办", 130 | "date":"2019-10-14 14:04", 131 | "category":"社会", 132 | "author_name":"ETtoday新闻云TB", 133 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140415945.html", 134 | "thumbnail_pic_s":"http:\/\/08imgmini.eastday.com\/mobile\/20191014\/20191014140415_d30d118d25d16328da0669a1042bccb1_1_mwpm_03200403.jpg" 135 | }, 136 | { 137 | "uniquekey":"18f2ef54c8802b36a92f360e5130dcdf", 138 | "title":"打工仔遇车祸经历两次生死考验,拿着胜诉的判决书得不到一分赔偿", 139 | "date":"2019-10-14 14:03", 140 | "category":"社会", 141 | "author_name":"周进TB", 142 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140352316.html", 143 | "thumbnail_pic_s":"http:\/\/05imgmini.eastday.com\/mobile\/20191014\/20191014140352_cf19c1817a3b57a2ee4abd4d68cd1718_9_mwpm_03200403.jpg", 144 | "thumbnail_pic_s02":"http:\/\/05imgmini.eastday.com\/mobile\/20191014\/20191014140352_cf19c1817a3b57a2ee4abd4d68cd1718_8_mwpm_03200403.jpg", 145 | "thumbnail_pic_s03":"http:\/\/05imgmini.eastday.com\/mobile\/20191014\/20191014140352_cf19c1817a3b57a2ee4abd4d68cd1718_12_mwpm_03200403.jpg" 146 | }, 147 | { 148 | "uniquekey":"45285f3ef1d186c5d5e1133965835471", 149 | "title":"可恶!一女子专偷“看病救命钱”被郑州警方抓获,曾多次因盗窃被判刑", 150 | "date":"2019-10-14 14:03", 151 | "category":"社会", 152 | "author_name":"映象网", 153 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140348733.html", 154 | "thumbnail_pic_s":"http:\/\/03imgmini.eastday.com\/mobile\/20191014\/20191014140348_2a9b1f03840d8c6b17cbd165a6e1eb70_1_mwpm_03200403.jpg" 155 | }, 156 | { 157 | "uniquekey":"b1822a42e5042455bfbded5bf4bcfaac", 158 | "title":"山西又一座城有望晋升二线,“晋商文化的摇篮”,不是大同、运城", 159 | "date":"2019-10-14 14:03", 160 | "category":"社会", 161 | "author_name":"先生说生活事", 162 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140338869.html", 163 | "thumbnail_pic_s":"http:\/\/02imgmini.eastday.com\/mobile\/20191014\/20191014140338_9e10cda246921ea2791a685b411b6ee6_4_mwpm_03200403.jpg", 164 | "thumbnail_pic_s02":"http:\/\/02imgmini.eastday.com\/mobile\/20191014\/20191014140338_9e10cda246921ea2791a685b411b6ee6_5_mwpm_03200403.jpg", 165 | "thumbnail_pic_s03":"http:\/\/02imgmini.eastday.com\/mobile\/20191014\/20191014140338_9e10cda246921ea2791a685b411b6ee6_2_mwpm_03200403.jpg" 166 | }, 167 | { 168 | "uniquekey":"0746a66c74ddf3eb77327a8dab6bcaac", 169 | "title":"新盛所民警暖心救助一名迷路老人", 170 | "date":"2019-10-14 14:03", 171 | "category":"社会", 172 | "author_name":"平安梁平", 173 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140329453.html", 174 | "thumbnail_pic_s":"http:\/\/01imgmini.eastday.com\/mobile\/20191014\/20191014140329_e1bd6e765cf012e53098b21c8749b0a0_1_mwpm_03200403.jpg" 175 | }, 176 | { 177 | "uniquekey":"f8b64d686df55c6457ece938a6f4c2d2", 178 | "title":"铜川一女子夜晚梦游坠落河道,早上人们才发现,赶紧下河救人", 179 | "date":"2019-10-14 14:02", 180 | "category":"社会", 181 | "author_name":"二三里资讯TB", 182 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140244018.html", 183 | "thumbnail_pic_s":"http:\/\/07imgmini.eastday.com\/mobile\/20191014\/20191014140244_0a9a74179a7f06727241990542a98e85_2_mwpm_03200403.jpg", 184 | "thumbnail_pic_s02":"http:\/\/07imgmini.eastday.com\/mobile\/20191014\/20191014140244_0a9a74179a7f06727241990542a98e85_1_mwpm_03200403.jpg", 185 | "thumbnail_pic_s03":"http:\/\/07imgmini.eastday.com\/mobile\/20191014\/20191014140244_0a9a74179a7f06727241990542a98e85_3_mwpm_03200403.jpg" 186 | }, 187 | { 188 | "uniquekey":"1ea25ce5b22a7c268ba2d109912b054c", 189 | "title":"新中国的基因里,有您“永不消逝的电波”", 190 | "date":"2019-10-14 14:00", 191 | "category":"社会", 192 | "author_name":"视界网", 193 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140056875.html", 194 | "thumbnail_pic_s":"http:\/\/08imgmini.eastday.com\/mobile\/20191014\/20191014140056_8985988ace050211e5f674f1bea98a53_1_mwpm_03200403.jpg" 195 | }, 196 | { 197 | "uniquekey":"9ec6c075b9308c476ec272e9f5d9c53c", 198 | "title":"从“五个一百”中汲取向上力量", 199 | "date":"2019-10-14 14:00", 200 | "category":"社会", 201 | "author_name":"解放网", 202 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140050844.html", 203 | "thumbnail_pic_s":"http:\/\/08imgmini.eastday.com\/mobile\/20191014\/20191014140050_6459286b2a7f49550fe3b61ed6ad5230_1_mwpm_03200403.jpg" 204 | }, 205 | { 206 | "uniquekey":"02b3ba3a5531726fb20f8e59e3d6d994", 207 | "title":"新余一名病危父亲想见羁押在看守所的儿子最后一面,如愿了", 208 | "date":"2019-10-14 13:59", 209 | "category":"社会", 210 | "author_name":"江西政法", 211 | "url":"http:\/\/mini.eastday.com\/mobile\/191014135959074.html", 212 | "thumbnail_pic_s":"http:\/\/05imgmini.eastday.com\/mobile\/20191014\/20191014135959_4e531d2878b049a2f6134c33ed07bf57_6_mwpm_03200403.jpg", 213 | "thumbnail_pic_s02":"http:\/\/05imgmini.eastday.com\/mobile\/20191014\/20191014135959_4e531d2878b049a2f6134c33ed07bf57_3_mwpm_03200403.jpg", 214 | "thumbnail_pic_s03":"http:\/\/05imgmini.eastday.com\/mobile\/20191014\/20191014135959_4e531d2878b049a2f6134c33ed07bf57_4_mwpm_03200403.jpg" 215 | }, 216 | { 217 | "uniquekey":"b35c11acae78de058b270519bd6e19f7", 218 | "title":"失格司机无证驾驶被查 考不过交规也能算理由?", 219 | "date":"2019-10-14 13:59", 220 | "category":"社会", 221 | "author_name":"新民网", 222 | "url":"http:\/\/mini.eastday.com\/mobile\/191014135930666.html", 223 | "thumbnail_pic_s":"http:\/\/01imgmini.eastday.com\/mobile\/20191014\/20191014135930_c9a450cccc1e804ae44487561e8d7efe_1_mwpm_03200403.jpg" 224 | }, 225 | { 226 | "uniquekey":"a33de4cef680db57071cf248aac7b0ee", 227 | "title":"警员接连遭袭 日本警视厅拟强化派出所安保设施", 228 | "date":"2019-10-14 13:58", 229 | "category":"社会", 230 | "author_name":"中国新闻网", 231 | "url":"http:\/\/mini.eastday.com\/mobile\/191014135837842.html", 232 | "thumbnail_pic_s":"http:\/\/08imgmini.eastday.com\/mobile\/20191014\/20191014135837_bbdbaf560506b490806188eeec40b715_1_mwpm_03200403.jpg" 233 | }, 234 | { 235 | "uniquekey":"8f3af11ff8f753b4a6a07b2d0d695083", 236 | "title":"0元出游,哪里便宜去哪里?小心“低价游”套路坑你没商量", 237 | "date":"2019-10-14 13:57", 238 | "category":"社会", 239 | "author_name":"青岛街事", 240 | "url":"http:\/\/mini.eastday.com\/mobile\/191014135742259.html", 241 | "thumbnail_pic_s":"http:\/\/09imgmini.eastday.com\/mobile\/20191014\/20191014135742_3fcd16485f742d71f4267c19ac2e652a_1_mwpm_03200403.jpg" 242 | }, 243 | { 244 | "uniquekey":"b2a1a5837e8db8c1e4ed8abf984bac56", 245 | "title":"“爸爸,你转职业好了……”", 246 | "date":"2019-10-14 13:57", 247 | "category":"社会", 248 | "author_name":"新华网", 249 | "url":"http:\/\/mini.eastday.com\/mobile\/191014135741692.html", 250 | "thumbnail_pic_s":"http:\/\/09imgmini.eastday.com\/mobile\/20191014\/20191014135741_e453227d02d769ae5f9dd058e52bd5b8_3_mwpm_03200403.jpg", 251 | "thumbnail_pic_s02":"http:\/\/09imgmini.eastday.com\/mobile\/20191014\/20191014135741_e453227d02d769ae5f9dd058e52bd5b8_2_mwpm_03200403.jpg", 252 | "thumbnail_pic_s03":"http:\/\/09imgmini.eastday.com\/mobile\/20191014\/20191014135741_e453227d02d769ae5f9dd058e52bd5b8_1_mwpm_03200403.jpg" 253 | }, 254 | { 255 | "uniquekey":"7fafc47dc9b48f465fce40c29fa7d5d4", 256 | "title":"甘肃宕昌官鹅沟“五彩”秋景胜春朝", 257 | "date":"2019-10-14 13:57", 258 | "category":"社会", 259 | "author_name":"中国新闻网", 260 | "url":"http:\/\/mini.eastday.com\/mobile\/191014135741665.html", 261 | "thumbnail_pic_s":"http:\/\/09imgmini.eastday.com\/mobile\/20191014\/20191014135741_36afe68d3f8b25c58b049aaae839a344_3_mwpm_03200403.jpg", 262 | "thumbnail_pic_s02":"http:\/\/09imgmini.eastday.com\/mobile\/20191014\/20191014135741_36afe68d3f8b25c58b049aaae839a344_2_mwpm_03200403.jpg", 263 | "thumbnail_pic_s03":"http:\/\/09imgmini.eastday.com\/mobile\/20191014\/20191014135741_36afe68d3f8b25c58b049aaae839a344_1_mwpm_03200403.jpg" 264 | }, 265 | { 266 | "uniquekey":"a8256261b7df397554084d36e8ef1fac", 267 | "title":"专家学者将重点研讨前沿艺术教育理念", 268 | "date":"2019-10-14 13:57", 269 | "category":"社会", 270 | "author_name":"消费日报网", 271 | "url":"http:\/\/mini.eastday.com\/mobile\/191014135741633.html", 272 | "thumbnail_pic_s":"http:\/\/04imgmini.eastday.com\/mobile\/20191014\/20191014135741_d5b831514e5ad526f57e8b2ce27a3613_2_mwpm_03200403.jpg", 273 | "thumbnail_pic_s02":"http:\/\/04imgmini.eastday.com\/mobile\/20191014\/20191014135741_d5b831514e5ad526f57e8b2ce27a3613_1_mwpm_03200403.jpg" 274 | }, 275 | { 276 | "uniquekey":"b143b88de41f31672ac36f87f2aa6abc", 277 | "title":"远去的扶风农村", 278 | "date":"2019-10-14 13:56", 279 | "category":"社会", 280 | "author_name":"扶风同城", 281 | "url":"http:\/\/mini.eastday.com\/mobile\/191014135656587.html", 282 | "thumbnail_pic_s":"http:\/\/02imgmini.eastday.com\/mobile\/20191014\/20191014135656_ddad1e185976281767e3296a39acc227_2_mwpm_03200403.jpg", 283 | "thumbnail_pic_s02":"http:\/\/02imgmini.eastday.com\/mobile\/20191014\/20191014135656_ddad1e185976281767e3296a39acc227_1_mwpm_03200403.jpg", 284 | "thumbnail_pic_s03":"http:\/\/02imgmini.eastday.com\/mobile\/20191014\/20191014135656_ddad1e185976281767e3296a39acc227_6_mwpm_03200403.jpg" 285 | }, 286 | { 287 | "uniquekey":"1c8fdf1e963b0f2e0c31a43fbd264de0", 288 | "title":"动物横穿高速公路,是撞还是让?", 289 | "date":"2019-10-14 13:53", 290 | "category":"社会", 291 | "author_name":"马鬃山高速大队", 292 | "url":"http:\/\/mini.eastday.com\/mobile\/191014135355481.html", 293 | "thumbnail_pic_s":"http:\/\/04imgmini.eastday.com\/mobile\/20191014\/20191014135355_9ccdadd38cd5316813b50adfbb7941f2_3_mwpm_03200403.jpg", 294 | "thumbnail_pic_s02":"http:\/\/04imgmini.eastday.com\/mobile\/20191014\/20191014135355_9ccdadd38cd5316813b50adfbb7941f2_1_mwpm_03200403.jpg", 295 | "thumbnail_pic_s03":"http:\/\/04imgmini.eastday.com\/mobile\/20191014\/20191014135355_9ccdadd38cd5316813b50adfbb7941f2_2_mwpm_03200403.jpg" 296 | }, 297 | { 298 | "uniquekey":"6e1accc30f86f8f3c84b59cbc6b839bb", 299 | "title":"高利借贷需远离 暴力讨债必严惩", 300 | "date":"2019-10-14 13:51", 301 | "category":"社会", 302 | "author_name":"松北检察", 303 | "url":"http:\/\/mini.eastday.com\/mobile\/191014135136836.html", 304 | "thumbnail_pic_s":"http:\/\/03imgmini.eastday.com\/mobile\/20191014\/20191014135136_8766ae6c7ba283ca3836040c5182780d_2_mwpm_03200403.jpg", 305 | "thumbnail_pic_s02":"http:\/\/03imgmini.eastday.com\/mobile\/20191014\/20191014135136_8766ae6c7ba283ca3836040c5182780d_1_mwpm_03200403.jpg" 306 | } 307 | ] 308 | }, 309 | "error_code":0 310 | } -------------------------------------------------------------------------------- /assets/mock/tiyu.json: -------------------------------------------------------------------------------- 1 | { 2 | "reason":"成功的返回", 3 | "result":{ 4 | "stat":"1", 5 | "data":[ 6 | { 7 | "uniquekey":"59101f6111e6da83add49a1ca1395286", 8 | "title":"穆里尼奥和卡卡同场竞技!穆帅司职门将,大秀脚法!", 9 | "date":"2019-10-14 14:12", 10 | "category":"体育", 11 | "author_name":"红魔足球", 12 | "url":"http:\/\/mini.eastday.com\/mobile\/191014141215859.html", 13 | "thumbnail_pic_s":"http:\/\/05imgmini.eastday.com\/mobile\/20191014\/2019101414_04c004e515ca4230a1c6a07637ea7295_7013_mwpm_03200403.jpg", 14 | "thumbnail_pic_s02":"http:\/\/05imgmini.eastday.com\/mobile\/20191014\/2019101414_93034e9d46e44e59ac30ec16586fb5d1_5200_mwpm_03200403.jpg", 15 | "thumbnail_pic_s03":"http:\/\/05imgmini.eastday.com\/mobile\/20191014\/2019101414_63a218862f744685b66aa8cab3c21e11_9171_mwpm_03200403.jpg" 16 | }, 17 | { 18 | "uniquekey":"72c08d57756aeec2daa642f137cdc219", 19 | "title":"CBA|原新疆外援亚当斯接近签约青岛", 20 | "date":"2019-10-14 14:12", 21 | "category":"体育", 22 | "author_name":"北青网", 23 | "url":"http:\/\/mini.eastday.com\/mobile\/191014141211377.html", 24 | "thumbnail_pic_s":"http:\/\/06imgmini.eastday.com\/mobile\/20191014\/20191014141211_70190f8a8648019d9e2e310d67245733_1_mwpm_03200403.jpg" 25 | }, 26 | { 27 | "uniquekey":"c7f0e873d97e154da9a1a76f263e6d37", 28 | "title":"划骑跑铁三600勇士将征战荣昌山水间", 29 | "date":"2019-10-14 14:12", 30 | "category":"体育", 31 | "author_name":"北青网", 32 | "url":"http:\/\/mini.eastday.com\/mobile\/191014141211104.html", 33 | "thumbnail_pic_s":"http:\/\/04imgmini.eastday.com\/mobile\/20191014\/20191014141211_2f6fad6371c165f7edf80a1bfa711edb_1_mwpm_03200403.jpg" 34 | }, 35 | { 36 | "uniquekey":"2a2830d921adae87b572b304591c538b", 37 | "title":"前瞻:勇士或多人缺席战湖人 欧洲双少围攻保罗", 38 | "date":"2019-10-14 14:10", 39 | "category":"体育", 40 | "author_name":"nba广角", 41 | "url":"http:\/\/mini.eastday.com\/mobile\/191014141033388.html", 42 | "thumbnail_pic_s":"http:\/\/09imgmini.eastday.com\/mobile\/20191014\/20191014141033_64ff0ceb38202d11d9fde4eb504b43e9_1_mwpm_03200403.jpg" 43 | }, 44 | { 45 | "uniquekey":"da782df2d6cb4a8cae07edd4079e5438", 46 | "title":"曝青岛已与格兰特解约 将签前总决赛MVP补强阵容", 47 | "date":"2019-10-14 14:10", 48 | "category":"体育", 49 | "author_name":"中国篮镜头", 50 | "url":"http:\/\/mini.eastday.com\/mobile\/191014141033307.html", 51 | "thumbnail_pic_s":"http:\/\/00imgmini.eastday.com\/mobile\/20191014\/20191014141033_937519950dc3076ca2254e5fff0e1e93_1_mwpm_03200403.jpg" 52 | }, 53 | { 54 | "uniquekey":"412e55d0e0669516dc4637da1c32cb22", 55 | "title":"荷兰羽毛球公开赛王祉怡夺得女单冠军", 56 | "date":"2019-10-14 14:09", 57 | "category":"体育", 58 | "author_name":"新民网", 59 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140939053.html", 60 | "thumbnail_pic_s":"http:\/\/07imgmini.eastday.com\/mobile\/20191014\/20191014140939_cbe41abc6b0edf035107210ced5c2d9e_1_mwpm_03200403.jpg" 61 | }, 62 | { 63 | "uniquekey":"7991e4cf04d28f3b718d8856fe6f69fc", 64 | "title":"北京最冷一晚人和保级希望到冰点 填不了坑", 65 | "date":"2019-10-14 14:09", 66 | "category":"体育", 67 | "author_name":"ZAKER网", 68 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140929127.html", 69 | "thumbnail_pic_s":"http:\/\/08imgmini.eastday.com\/mobile\/20191014\/20191014140929_7b4224eb3a5cdb5fc60003a4cb591708_1_mwpm_03200403.jpg" 70 | }, 71 | { 72 | "uniquekey":"89ef513206db406b5ba81cbc8c7860c8", 73 | "title":"图片报称赞京多安:梳理德国队中场,并且打破僵局", 74 | "date":"2019-10-14 14:09", 75 | "category":"体育", 76 | "author_name":"ZAKER网", 77 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140911048.html", 78 | "thumbnail_pic_s":"http:\/\/01imgmini.eastday.com\/mobile\/20191014\/20191014140911_0e4deb4554e21b05bd40b6c86cc1f877_1_mwpm_03200403.jpg" 79 | }, 80 | { 81 | "uniquekey":"652d1f040d976968e9ec114af6e1f64b", 82 | "title":"多图流|三战命中率超 80%,“水货状元”锡安真香!", 83 | "date":"2019-10-14 14:09", 84 | "category":"体育", 85 | "author_name":"ZAKER网", 86 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140902583.html", 87 | "thumbnail_pic_s":"http:\/\/05imgmini.eastday.com\/mobile\/20191014\/20191014140902_53bdc68cf76d79f88b211298dba138d8_3_mwpm_03200403.jpg", 88 | "thumbnail_pic_s02":"http:\/\/05imgmini.eastday.com\/mobile\/20191014\/20191014140902_53bdc68cf76d79f88b211298dba138d8_2_mwpm_03200403.jpg", 89 | "thumbnail_pic_s03":"http:\/\/05imgmini.eastday.com\/mobile\/20191014\/20191014140902_53bdc68cf76d79f88b211298dba138d8_1_mwpm_03200403.jpg" 90 | }, 91 | { 92 | "uniquekey":"e54fffef96a672e35ca2cb3841861936", 93 | "title":"默雷伊:拜仁和尤文也对我有意,但相信在多特机会更多", 94 | "date":"2019-10-14 14:08", 95 | "category":"体育", 96 | "author_name":"ZAKER网", 97 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140826105.html", 98 | "thumbnail_pic_s":"http:\/\/05imgmini.eastday.com\/mobile\/20191014\/20191014140826_aef61b763190399632f1d214d08e5d9e_1_mwpm_03200403.jpg" 99 | }, 100 | { 101 | "uniquekey":"5ecece44833597cc6e272d3caa5f2b66", 102 | "title":"曼联传奇评四大最难防前锋:德罗巴 + 曼城神刀", 103 | "date":"2019-10-14 14:07", 104 | "category":"体育", 105 | "author_name":"ZAKER网", 106 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140749154.html", 107 | "thumbnail_pic_s":"http:\/\/07imgmini.eastday.com\/mobile\/20191014\/20191014140749_9ed154a7ddebd3cec471cd685a7ab330_1_mwpm_03200403.jpg", 108 | "thumbnail_pic_s02":"http:\/\/07imgmini.eastday.com\/mobile\/20191014\/20191014140749_9ed154a7ddebd3cec471cd685a7ab330_3_mwpm_03200403.jpg", 109 | "thumbnail_pic_s03":"http:\/\/07imgmini.eastday.com\/mobile\/20191014\/20191014140749_9ed154a7ddebd3cec471cd685a7ab330_2_mwpm_03200403.jpg" 110 | }, 111 | { 112 | "uniquekey":"96463471f5f1e39941dbaa2fa0e22c8d", 113 | "title":"重创!NBA联盟收入再遭噩耗,湖人球星率先躺枪,连丢两份合同", 114 | "date":"2019-10-14 14:06", 115 | "category":"体育", 116 | "author_name":"康泳哥看篮球", 117 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140621927.html", 118 | "thumbnail_pic_s":"http:\/\/08imgmini.eastday.com\/mobile\/20191014\/2019101414_92882b49cd164797b809f3c8677f3774_4323_mwpm_03200403.jpg", 119 | "thumbnail_pic_s02":"http:\/\/08imgmini.eastday.com\/mobile\/20191014\/2019101414_e3c1e28cd2484182953cd61a424eb201_0748_mwpm_03200403.jpg", 120 | "thumbnail_pic_s03":"http:\/\/08imgmini.eastday.com\/mobile\/20191014\/2019101414_cc4fce7eeab5457987952ae670f1c357_0718_mwpm_03200403.jpg" 121 | }, 122 | { 123 | "uniquekey":"9706713ad27d79f8152c18af6efb4ca9", 124 | "title":"国足与菲律宾之战明晚8时开踢", 125 | "date":"2019-10-14 14:06", 126 | "category":"体育", 127 | "author_name":"人民日报海外网", 128 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140616656.html", 129 | "thumbnail_pic_s":"http:\/\/01imgmini.eastday.com\/mobile\/20191014\/20191014140616_a024522b7548e9745a3a8158523bd813_1_mwpm_03200403.jpg" 130 | }, 131 | { 132 | "uniquekey":"01474ae7d34ada97e3e09f36778ea034", 133 | "title":"全英超最高?曼联本赛季工资支出高达3.32亿!曼城仅排第三!", 134 | "date":"2019-10-14 14:05", 135 | "category":"体育", 136 | "author_name":"红魔足球", 137 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140542454.html", 138 | "thumbnail_pic_s":"http:\/\/00imgmini.eastday.com\/mobile\/20191014\/2019101414_27cd836d298a423893fbd3c45bb87a0a_1596_mwpm_03200403.jpg", 139 | "thumbnail_pic_s02":"http:\/\/00imgmini.eastday.com\/mobile\/20191014\/2019101414_00637b9ac95c4b87afde591497b46874_7236_mwpm_03200403.jpg", 140 | "thumbnail_pic_s03":"http:\/\/00imgmini.eastday.com\/mobile\/20191014\/2019101414_312275291aa4415db4e2ab6392b6f0f1_4156_mwpm_03200403.jpg" 141 | }, 142 | { 143 | "uniquekey":"1d75227b33e1d214dd871e800533c552", 144 | "title":"自古前锋无好帅!前世界杯金靴做教练你看好吗?", 145 | "date":"2019-10-14 14:04", 146 | "category":"体育", 147 | "author_name":"球场十二人", 148 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140414655.html", 149 | "thumbnail_pic_s":"http:\/\/05imgmini.eastday.com\/mobile\/20191014\/20191014140414_576aa6f8fe3489f2cabc6a84251ffd9d_1_mwpm_03200403.jpg" 150 | }, 151 | { 152 | "uniquekey":"8f596bad26dcedc853821e94770ddb9d", 153 | "title":"立陶宛vs塞尔维亚:虽然头号前锋缺席 但塞尔维亚虐菜没问题", 154 | "date":"2019-10-14 14:04", 155 | "category":"体育", 156 | "author_name":"球场十二人", 157 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140405049.html", 158 | "thumbnail_pic_s":"http:\/\/02imgmini.eastday.com\/mobile\/20191014\/20191014140405_3d95317888dc7fad683fd86ca9dc2c0e_2_mwpm_03200403.jpg", 159 | "thumbnail_pic_s02":"http:\/\/02imgmini.eastday.com\/mobile\/20191014\/20191014140405_3d95317888dc7fad683fd86ca9dc2c0e_3_mwpm_03200403.jpg", 160 | "thumbnail_pic_s03":"http:\/\/02imgmini.eastday.com\/mobile\/20191014\/20191014140405_3d95317888dc7fad683fd86ca9dc2c0e_4_mwpm_03200403.jpg" 161 | }, 162 | { 163 | "uniquekey":"ca355ade7649677187f04c304fbd9ca2", 164 | "title":"吉祥无畏流言蜚语,只会用行动证明自己!", 165 | "date":"2019-10-14 14:03", 166 | "category":"体育", 167 | "author_name":"杰说体育", 168 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140329324.html", 169 | "thumbnail_pic_s":"http:\/\/08imgmini.eastday.com\/mobile\/20191014\/2019101414_a48559635cae4dc4a1f68edd223eb2b5_8730_mwpm_03200403.jpg", 170 | "thumbnail_pic_s02":"http:\/\/08imgmini.eastday.com\/mobile\/20191014\/2019101414_ad75409ba0fe4baba6bc845bfd094d77_6854_mwpm_03200403.jpg" 171 | }, 172 | { 173 | "uniquekey":"8bd889c6ddc360c024bad990d8f24af0", 174 | "title":"参加篮球综艺被吐槽实力差,王少杰首秀力证状元身份,得教练认可", 175 | "date":"2019-10-14 14:03", 176 | "category":"体育", 177 | "author_name":"部落篮球联盟", 178 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140324463.html", 179 | "thumbnail_pic_s":"http:\/\/07imgmini.eastday.com\/mobile\/20191014\/20191014140324_f4eb7e712d0a09907e6a0a6d48913b7a_1_mwpm_03200403.jpg", 180 | "thumbnail_pic_s02":"http:\/\/07imgmini.eastday.com\/mobile\/20191014\/20191014140324_f4eb7e712d0a09907e6a0a6d48913b7a_7_mwpm_03200403.jpg", 181 | "thumbnail_pic_s03":"http:\/\/07imgmini.eastday.com\/mobile\/20191014\/20191014140324_f4eb7e712d0a09907e6a0a6d48913b7a_4_mwpm_03200403.jpg" 182 | }, 183 | { 184 | "uniquekey":"94e005e37614c55544a823f91c501a1f", 185 | "title":"决赛轮狂抓9鸟!张新军创美巡赛个人最好成绩", 186 | "date":"2019-10-14 14:03", 187 | "category":"体育", 188 | "author_name":"新京报体育", 189 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140306478.html", 190 | "thumbnail_pic_s":"http:\/\/01imgmini.eastday.com\/mobile\/20191014\/20191014140306_41d26f7e97b251c5dcbd183ee1ff585f_1_mwpm_03200403.jpg" 191 | }, 192 | { 193 | "uniquekey":"e187ae9792e40482be2d83bac3130e35", 194 | "title":"乌西克连续叫板维尔德鲁伊兹,他能抗住这些大家伙的重拳吗?", 195 | "date":"2019-10-14 14:03", 196 | "category":"体育", 197 | "author_name":"经典拳赛", 198 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140303588.html", 199 | "thumbnail_pic_s":"http:\/\/00imgmini.eastday.com\/mobile\/20191014\/20191014140303_6d3a6cb1e321ead1c454531620de5e4b_7_mwpm_03200403.jpg", 200 | "thumbnail_pic_s02":"http:\/\/00imgmini.eastday.com\/mobile\/20191014\/20191014140303_6d3a6cb1e321ead1c454531620de5e4b_12_mwpm_03200403.jpg", 201 | "thumbnail_pic_s03":"http:\/\/00imgmini.eastday.com\/mobile\/20191014\/20191014140303_6d3a6cb1e321ead1c454531620de5e4b_1_mwpm_03200403.jpg" 202 | }, 203 | { 204 | "uniquekey":"7b2b2836b97b0158faa27f9c47fd2bff", 205 | "title":"科特迪瓦人的2选1:一个还没适应节奏 一个还没走出憧憬", 206 | "date":"2019-10-14 14:03", 207 | "category":"体育", 208 | "author_name":"球场十二人", 209 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140303014.html", 210 | "thumbnail_pic_s":"http:\/\/04imgmini.eastday.com\/mobile\/20191014\/20191014140303_a26ff9e9cf4cfab26fbc53964619f875_1_mwpm_03200403.jpg", 211 | "thumbnail_pic_s02":"http:\/\/04imgmini.eastday.com\/mobile\/20191014\/20191014140303_a26ff9e9cf4cfab26fbc53964619f875_2_mwpm_03200403.jpg", 212 | "thumbnail_pic_s03":"http:\/\/04imgmini.eastday.com\/mobile\/20191014\/20191014140303_a26ff9e9cf4cfab26fbc53964619f875_3_mwpm_03200403.jpg" 213 | }, 214 | { 215 | "uniquekey":"e8d388696a62c2718f81d043050d9274", 216 | "title":"京多安刷数据两球一助攻,基米希接班拉姆队长是水到渠成的事情", 217 | "date":"2019-10-14 14:03", 218 | "category":"体育", 219 | "author_name":"球场十二人", 220 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140300287.html", 221 | "thumbnail_pic_s":"http:\/\/03imgmini.eastday.com\/mobile\/20191014\/20191014140300_ace4737abc675f4ba9a6c6de47540112_1_mwpm_03200403.jpg" 222 | }, 223 | { 224 | "uniquekey":"d5437e2eb3a4c5589d0ed94aa5417673", 225 | "title":"解气!这次终于让NBA真正感觉到痛,这只是开始", 226 | "date":"2019-10-14 14:02", 227 | "category":"体育", 228 | "author_name":"NBA指南者", 229 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140259657.html", 230 | "thumbnail_pic_s":"http:\/\/02imgmini.eastday.com\/mobile\/20191014\/20191014140259_a1fd56f1d22a2ed1e0df93396a0ff55e_4_mwpm_03200403.jpg", 231 | "thumbnail_pic_s02":"http:\/\/02imgmini.eastday.com\/mobile\/20191014\/20191014140259_a1fd56f1d22a2ed1e0df93396a0ff55e_2_mwpm_03200403.jpg", 232 | "thumbnail_pic_s03":"http:\/\/02imgmini.eastday.com\/mobile\/20191014\/20191014140259_a1fd56f1d22a2ed1e0df93396a0ff55e_1_mwpm_03200403.jpg" 233 | }, 234 | { 235 | "uniquekey":"d4cc23d6256e238e8c88b69411854305", 236 | "title":"曝克洛普接手利物浦前曾拒绝曼联,因为这个原因", 237 | "date":"2019-10-14 14:02", 238 | "category":"体育", 239 | "author_name":"中国新闻网", 240 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140258039.html", 241 | "thumbnail_pic_s":"http:\/\/05imgmini.eastday.com\/mobile\/20191014\/20191014140258_5de870815c10f03d757eb75a17973172_1_mwpm_03200403.jpg" 242 | }, 243 | { 244 | "uniquekey":"fa87657294e17eca7a1db7829d6c54e9", 245 | "title":"这样的点球该不该进?格德斯用行动给出了答案", 246 | "date":"2019-10-14 14:02", 247 | "category":"体育", 248 | "author_name":"龙之队球迷", 249 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140255132.html", 250 | "thumbnail_pic_s":"http:\/\/06imgmini.eastday.com\/mobile\/20191014\/20191014140255_1327717e1184d2e387da6fe4f22108cd_1_mwpm_03200403.jpg", 251 | "thumbnail_pic_s02":"http:\/\/06imgmini.eastday.com\/mobile\/20191014\/20191014140255_1327717e1184d2e387da6fe4f22108cd_3_mwpm_03200403.jpg", 252 | "thumbnail_pic_s03":"http:\/\/06imgmini.eastday.com\/mobile\/20191014\/20191014140255_1327717e1184d2e387da6fe4f22108cd_4_mwpm_03200403.jpg" 253 | }, 254 | { 255 | "uniquekey":"99766763072e300c8dce2b8d36c5d988", 256 | "title":"33分!欧洲头号球星打出无解表现,巅峰期放弃NBA的男人", 257 | "date":"2019-10-14 14:02", 258 | "category":"体育", 259 | "author_name":"大运谈球", 260 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140227427.html", 261 | "thumbnail_pic_s":"http:\/\/02imgmini.eastday.com\/mobile\/20191014\/2019101414_208c80c6d0cc492a8f1a5c3d7241cf51_0754_mwpm_03200403.jpg", 262 | "thumbnail_pic_s02":"http:\/\/02imgmini.eastday.com\/mobile\/20191014\/2019101414_48411598a6444a6e8a7ca567edcfdaff_7717_mwpm_03200403.jpg", 263 | "thumbnail_pic_s03":"http:\/\/02imgmini.eastday.com\/mobile\/20191014\/2019101414_313c00211e2b4987b63060308e62be89_5631_mwpm_03200403.jpg" 264 | }, 265 | { 266 | "uniquekey":"8e0baab82724bbee894050645816f758", 267 | "title":"曼联传奇队长怒斥索帅:不该卖的都卖了,靠一群孩子赢不了冠军!", 268 | "date":"2019-10-14 14:01", 269 | "category":"体育", 270 | "author_name":"红魔足球", 271 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140155178.html", 272 | "thumbnail_pic_s":"http:\/\/00imgmini.eastday.com\/mobile\/20191014\/2019101414_7ac069e6d2b64fa8b249eb1f236734f4_2745_mwpm_03200403.jpg", 273 | "thumbnail_pic_s02":"http:\/\/00imgmini.eastday.com\/mobile\/20191014\/2019101414_22f851c98c864ed7a96d3f75486ff663_5693_mwpm_03200403.jpg", 274 | "thumbnail_pic_s03":"http:\/\/00imgmini.eastday.com\/mobile\/20191014\/2019101414_71bbcb2655c34aea9da3e25b1b804597_2883_mwpm_03200403.jpg" 275 | }, 276 | { 277 | "uniquekey":"70194efb9656f852a1445f1ff92dcaa0", 278 | "title":"恢复了!NBA转播已经开启,杨毅:制裁没有结束,库兹马很扎心", 279 | "date":"2019-10-14 14:00", 280 | "category":"体育", 281 | "author_name":"篮球大锅饭", 282 | "url":"http:\/\/mini.eastday.com\/mobile\/191014140023282.html", 283 | "thumbnail_pic_s":"http:\/\/04imgmini.eastday.com\/mobile\/20191014\/2019101413_28a0aaa760dc4e2ab44a42951d9c0610_1128_mwpm_03200403.jpg", 284 | "thumbnail_pic_s02":"http:\/\/04imgmini.eastday.com\/mobile\/20191014\/2019101413_62646209fc64497cb58fc6ebffed2401_0649_mwpm_03200403.jpg", 285 | "thumbnail_pic_s03":"http:\/\/04imgmini.eastday.com\/mobile\/20191014\/2019101413_7258fc348baa41e790f64c86169873ef_7720_mwpm_03200403.jpg" 286 | }, 287 | { 288 | "uniquekey":"217c00b15f2541c0323b446a7da8cd4b", 289 | "title":"央视体育频道集中报道“奔跑中国”2019郑州国际马拉松", 290 | "date":"2019-10-14 13:58", 291 | "category":"体育", 292 | "author_name":"看郑州客户端", 293 | "url":"http:\/\/mini.eastday.com\/mobile\/191014135801214.html", 294 | "thumbnail_pic_s":"http:\/\/01imgmini.eastday.com\/mobile\/20191014\/20191014135801_c9577f3ca9efd08e7934c21f51b0981d_3_mwpm_03200403.jpg", 295 | "thumbnail_pic_s02":"http:\/\/01imgmini.eastday.com\/mobile\/20191014\/20191014135801_c9577f3ca9efd08e7934c21f51b0981d_4_mwpm_03200403.jpg", 296 | "thumbnail_pic_s03":"http:\/\/01imgmini.eastday.com\/mobile\/20191014\/20191014135801_c9577f3ca9efd08e7934c21f51b0981d_2_mwpm_03200403.jpg" 297 | }, 298 | { 299 | "uniquekey":"e1978a2cc948c3a0997674d6cd444d68", 300 | "title":"韦德重申自己不会复出!还点评了新赛季的热火", 301 | "date":"2019-10-14 13:56", 302 | "category":"体育", 303 | "author_name":"老五撸体育", 304 | "url":"http:\/\/mini.eastday.com\/mobile\/191014135652090.html", 305 | "thumbnail_pic_s":"http:\/\/07imgmini.eastday.com\/mobile\/20191014\/2019101413_c09ff3eaf30843a5adf0c6b1dda3bad7_9653_mwpm_03200403.jpg", 306 | "thumbnail_pic_s02":"http:\/\/07imgmini.eastday.com\/mobile\/20191014\/2019101413_82c48e0e3d594dc2a170b892f27fed4e_1082_mwpm_03200403.jpg", 307 | "thumbnail_pic_s03":"http:\/\/07imgmini.eastday.com\/mobile\/20191014\/2019101413_5cfa477a1d594509b80589ae51460aec_5079_mwpm_03200403.jpg" 308 | } 309 | ] 310 | }, 311 | "error_code":0 312 | } -------------------------------------------------------------------------------- /ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 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 "Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /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 | 8 | -------------------------------------------------------------------------------- /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/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/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/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/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/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/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/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/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/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/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/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/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/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/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/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/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/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/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/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/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/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/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/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/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/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/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/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/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/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/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/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiyunrui007/Flutter_FinanceApp/8cec17c22bdef78ca550e88fdb62682b8781723c/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md: -------------------------------------------------------------------------------- 1 | # Launch Screen Assets 2 | 3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory. 4 | 5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | htjf_flutter_app 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | $(FLUTTER_BUILD_NAME) 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(FLUTTER_BUILD_NUMBER) 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UISupportedInterfaceOrientations 30 | 31 | UIInterfaceOrientationPortrait 32 | UIInterfaceOrientationLandscapeLeft 33 | UIInterfaceOrientationLandscapeRight 34 | 35 | UISupportedInterfaceOrientations~ipad 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationPortraitUpsideDown 39 | UIInterfaceOrientationLandscapeLeft 40 | UIInterfaceOrientationLandscapeRight 41 | 42 | UIViewControllerBasedStatusBarAppearance 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /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/base/baseLoadingWidget.dart: -------------------------------------------------------------------------------- 1 | /* 2 | * 自定义等待加载提示框 3 | * Created by ZhangJun on 2018-11-29 4 | */ 5 | 6 | import 'package:flutter/material.dart'; 7 | 8 | class LoadingDialog extends Dialog { 9 | final String text; 10 | 11 | LoadingDialog({Key key, @required this.text}) : super(key: key); 12 | 13 | @override 14 | Widget build(BuildContext context) { 15 | return new Material( 16 | type: MaterialType.transparency, 17 | child: new Center( 18 | child: Column( 19 | mainAxisAlignment: MainAxisAlignment.center, 20 | crossAxisAlignment: CrossAxisAlignment.center, 21 | children: [ 22 | new CircularProgressIndicator(), 23 | new Padding( 24 | padding: const EdgeInsets.only( 25 | top: 20.0, 26 | ), 27 | child: new Text(text, style: TextStyle(color: Colors.white),), 28 | ), 29 | ], 30 | ), 31 | ), 32 | ); 33 | } 34 | } -------------------------------------------------------------------------------- /lib/base/baseNetWidget.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | ///网络请求的基类,用于请求网络和loading页面 4 | 5 | //网络请求的状态 分为成功,失败,加载中,无数据 6 | enum requestStatus{ Success, Error, Loading, Empty} 7 | 8 | class BaseNetWidget extends StatefulWidget{ 9 | 10 | //当前的状态 11 | var _currentStatus = requestStatus.Loading; 12 | final State successState; 13 | BaseNetWidget(this.successState); 14 | 15 | 16 | @override 17 | State createState() { 18 | return successState; 19 | } 20 | } -------------------------------------------------------------------------------- /lib/base/baseUiWidget.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class BaseUIWidget{ 4 | //UI相关 5 | Text getBaseText(String title){ 6 | return Text( 7 | title, 8 | style: getBaseTextStyle(), 9 | ); 10 | } 11 | 12 | TextStyle getBaseTextStyle(){ 13 | return TextStyle( 14 | fontSize: 16.0, 15 | color: Colors.black, 16 | ); 17 | } 18 | 19 | //产品分类的title 20 | Widget getTitle(String title) { 21 | return Container( 22 | margin: EdgeInsets.only(top: 16.0), 23 | child: Row( 24 | children: [ 25 | Container( 26 | height: 20.0, 27 | width: 4.0, 28 | color: Color(0xffDFB379), 29 | ), 30 | Container( 31 | margin: EdgeInsets.only(left: 12.0), 32 | child: Text(title, 33 | style: TextStyle( 34 | color: Color(0xff333333), 35 | fontSize: 20.0, 36 | fontWeight: FontWeight.bold)), 37 | ) 38 | ], 39 | ), 40 | ); 41 | } 42 | 43 | //分割线 居上边8dp 44 | Widget getDividerLineMargin() { 45 | return Container( 46 | height: 8.0, 47 | margin: EdgeInsets.only(top: 16.0), 48 | color: Color(0xfff4f4f4), 49 | ); 50 | } 51 | 52 | //分割线 没有margin 53 | Widget getDividerLine() { 54 | return Container( 55 | height: 8.0, 56 | color: Color(0xfff4f4f4), 57 | ); 58 | } 59 | 60 | } -------------------------------------------------------------------------------- /lib/base/baseWidget.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import '../model/config.dart'; 3 | import '../net/requestAPI.dart'; 4 | import 'baseLoadingWidget.dart'; 5 | import 'dart:async'; 6 | 7 | //是否在请求网络加载数据 是的话展示loading框 8 | bool isLoading = false; 9 | 10 | abstract class BaseStatefulWidget extends StatelessWidget{ 11 | 12 | //每个页面初始化的参数 自定义 13 | Config setConfig(); 14 | 15 | State setBody(); 16 | 17 | @override 18 | Widget build(BuildContext context) { 19 | return Scaffold( 20 | appBar: PreferredSize( 21 | //通过这种形式来控制是否显示AppBar 22 | child: Offstage( 23 | offstage: setConfig().dismissAppBar, 24 | child: new AppBar( 25 | backgroundColor: Color(0xff333333), 26 | iconTheme: IconThemeData(size: 12), 27 | centerTitle: true, 28 | leading: GestureDetector( 29 | child: Container( 30 | padding: EdgeInsets.only(top: 9, bottom: 9), 31 | child: Image.asset("assets/images/ic_back_arrow.png", fit: BoxFit.fitHeight,), 32 | ), 33 | onTap: (){ 34 | //返回上一个页面 35 | Navigator.of(context).pop(); 36 | }, 37 | ), 38 | title: new Text(setConfig().title, style: TextStyle(fontSize: 17),), 39 | ), 40 | ), 41 | preferredSize: Size.fromHeight(45), 42 | ), 43 | body: _BaseStatefullWidget(setBody()), 44 | ); 45 | } 46 | } 47 | 48 | class _BaseStatefullWidget extends StatefulWidget{ 49 | 50 | State bodyWidget; 51 | 52 | _BaseStatefullWidget(this.bodyWidget); 53 | 54 | @override 55 | State createState() { 56 | return bodyWidget; 57 | } 58 | } 59 | 60 | //获取loading的Widget 61 | Widget getLoadingWidget(){ 62 | return new Material( 63 | type: MaterialType.transparency, 64 | child: new Center( 65 | child: Column( 66 | mainAxisAlignment: MainAxisAlignment.center, 67 | crossAxisAlignment: CrossAxisAlignment.center, 68 | children: [ 69 | new CircularProgressIndicator(), 70 | new Padding( 71 | padding: const EdgeInsets.only( 72 | top: 20.0, 73 | ), 74 | child: new Text("加载中...", style: TextStyle(color: Color(0xff333333)),), 75 | ), 76 | ], 77 | ), 78 | ), 79 | ); 80 | } 81 | 82 | //跳转到下一个页面的函数 83 | void switchNextPage(BuildContext context, Widget widget){ 84 | Navigator.of(context).push(MaterialPageRoute(builder: (context){ 85 | return widget; 86 | })); 87 | } 88 | 89 | typedef RequestData = void Function(dynamic value); 90 | 91 | //基类封装的网络请求函数 92 | void requestAPI(String action, RequestData requestData, {Map params}) async { 93 | //请求网络时将isLoading置为true 展示loading框 94 | isLoading = true; 95 | RequestAPI().get(action).then((value){ 96 | //请求结束后将loading框dismiss掉 97 | isLoading = false; 98 | requestData(value); 99 | }); 100 | } -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'page/assetPage.dart'; 3 | import 'package:htjf_flutter_app/page/index/indexPage.dart'; 4 | import 'package:htjf_flutter_app/page/product/productPage/productPage.dart'; 5 | import 'page/minePage.dart'; 6 | import 'package:flutter/rendering.dart'; 7 | import 'page/news/newsPage.dart'; 8 | 9 | class BottomNavigationWidget extends StatefulWidget { 10 | @override 11 | State createState() { 12 | return new BottomNavigationWidgetState(); 13 | } 14 | } 15 | 16 | class BottomNavigationWidgetState extends State { 17 | List pages = new List(); 18 | int _currentIndex = 0; 19 | 20 | @override 21 | void initState() { 22 | pages 23 | ..add(IndexPage()) 24 | ..add(ProductPage()) 25 | ..add(NewsPage()) 26 | ..add(AssetPage()) 27 | ..add(MinePage()); 28 | } 29 | 30 | @override 31 | Widget build(BuildContext context) { 32 | /* 33 | 返回一个脚手架,里面包含两个属性,一个是底部导航栏,另一个就是主体内容 34 | */ 35 | return new Scaffold( 36 | bottomNavigationBar: BottomNavigationBar( 37 | //底部导航栏的创建需要对应的功能标签作为子项,这里我就写了3个,每个子项包含一个图标和一个title。 38 | items: [ 39 | getItem("assets/images/ic_index.png", "首页"), 40 | getItem("assets/images/ic_product.png", "产品"), 41 | getItem("assets/images/ic_news.png", "资讯"), 42 | getItem("assets/images/ic_asset.png", "资产"), 43 | getItem("assets/images/ic_mine.png", "我的"), 44 | ], 45 | type: BottomNavigationBarType.fixed, 46 | unselectedLabelStyle: TextStyle(color: Colors.black), 47 | selectedLabelStyle: TextStyle(color: Color(0xffDFB379)), 48 | //这是底部导航栏自带的位标属性,表示底部导航栏当前处于哪个导航标签。给他一个初始值0,也就是默认第一个标签页面。 49 | currentIndex: _currentIndex, 50 | //这是点击属性,会执行带有一个int值的回调函数,这个int值是系统自动返回的你点击的那个标签的位标 51 | onTap: (int i) { 52 | //进行状态更新,将系统返回的你点击的标签位标赋予当前位标属性,告诉系统当前要显示的导航标签被用户改变了。 53 | setState(() { 54 | _currentIndex = i; 55 | }); 56 | }, 57 | ), 58 | body: pages[_currentIndex], 59 | ); 60 | } 61 | 62 | BottomNavigationBarItem getItem(imgPath, title){ 63 | return BottomNavigationBarItem( 64 | icon: Image.asset( 65 | imgPath, 66 | width: 25, 67 | height: 25, 68 | ), 69 | title: new Text( 70 | title, 71 | style: new TextStyle( 72 | color: Colors.black 73 | ), 74 | ) 75 | ); 76 | } 77 | } 78 | 79 | void main(){ 80 | // debugPaintSizeEnabled = true; 81 | runApp(new MyApp()); 82 | } 83 | 84 | class MyApp extends StatelessWidget { 85 | @override 86 | Widget build(BuildContext context) { 87 | return new MaterialApp( 88 | title: '恒天财富Flutter', 89 | home: new BottomNavigationWidget(), 90 | debugShowCheckedModeBanner: false, 91 | ); 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /lib/model/NewsListModel.dart: -------------------------------------------------------------------------------- 1 | class NewsListModel { 2 | int status; 3 | String message; 4 | List newsList; 5 | 6 | NewsListModel({this.status, this.message, this.newsList}); 7 | 8 | NewsListModel.fromJson(Map json) { 9 | status = json['status']; 10 | message = json['message']; 11 | if (json['news_list'] != null) { 12 | newsList = new List(); 13 | json['news_list'].forEach((v) { 14 | newsList.add(new NewsList.fromJson(v)); 15 | }); 16 | } 17 | } 18 | 19 | Map toJson() { 20 | final Map data = new Map(); 21 | data['status'] = this.status; 22 | data['message'] = this.message; 23 | if (this.newsList != null) { 24 | data['news_list'] = this.newsList.map((v) => v.toJson()).toList(); 25 | } 26 | return data; 27 | } 28 | } 29 | 30 | class NewsList { 31 | String title; 32 | String date; 33 | 34 | NewsList({this.title, this.date}); 35 | 36 | NewsList.fromJson(Map json) { 37 | title = json['title']; 38 | date = json['date']; 39 | } 40 | 41 | Map toJson() { 42 | final Map data = new Map(); 43 | data['title'] = this.title; 44 | data['date'] = this.date; 45 | return data; 46 | } 47 | } -------------------------------------------------------------------------------- /lib/model/PrivateProductModel.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | ///私募产品model 4 | /// 5 | class PrivateProductModel{ 6 | 7 | PrivateProductModel({ 8 | Key key, 9 | @required this.productTitle, 10 | @required this.productCode, 11 | this.achievementValue = const [], 12 | this.achievementValueDesc = "7.2%~7.5%", 13 | this.timeLimit = "12", 14 | this.investAmount = "100", 15 | this.riskLevel = 2, 16 | this.riskLevelDesc = "平衡型", 17 | this.manageOrg = "东北证券公司", 18 | this.issuingScale = "10,000", 19 | this.raiseTime = "2016-01-01~2017-12-03" 20 | }); 21 | 22 | String productTitle;//产品名称 23 | String productCode;//产品Code 24 | String achievementValueDesc;//业绩比较基准描述 25 | List achievementValue;//业绩比较基准列表 26 | String timeLimit;//投资期限 27 | String investAmount;//起投金额 28 | 29 | int riskLevel = 2;//产品风险等级 代表几颗星 30 | String riskLevelDesc;//产品风险等级 31 | String manageOrg;//管理机构 32 | String issuingScale;//发行规模 33 | String raiseTime;//募集时间 34 | } 35 | 36 | class AchievementValueModel{ 37 | AchievementValueModel(this.desc, this.value); 38 | String desc; 39 | String value; 40 | } -------------------------------------------------------------------------------- /lib/model/bannerModel.dart: -------------------------------------------------------------------------------- 1 | class BannerModel { 2 | int status; 3 | String message; 4 | List bannerList; 5 | 6 | BannerModel({this.status, this.message, this.bannerList}); 7 | 8 | BannerModel.fromJson(Map json) { 9 | status = json['status']; 10 | message = json['message']; 11 | if (json['banner_list'] != null) { 12 | bannerList = new List(); 13 | json['banner_list'].forEach((v) { 14 | bannerList.add(new BannerList.fromJson(v)); 15 | }); 16 | } 17 | } 18 | 19 | Map toJson() { 20 | final Map data = new Map(); 21 | data['status'] = this.status; 22 | data['message'] = this.message; 23 | if (this.bannerList != null) { 24 | data['banner_list'] = this.bannerList.map((v) => v.toJson()).toList(); 25 | } 26 | return data; 27 | } 28 | } 29 | 30 | class BannerList { 31 | String title; 32 | String imgPath; 33 | 34 | BannerList({this.title, this.imgPath}); 35 | 36 | BannerList.fromJson(Map json) { 37 | title = json['title']; 38 | imgPath = json['img_path']; 39 | } 40 | 41 | Map toJson() { 42 | final Map data = new Map(); 43 | data['title'] = this.title; 44 | data['img_path'] = this.imgPath; 45 | return data; 46 | } 47 | } -------------------------------------------------------------------------------- /lib/model/config.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import '../base/baseWidget.dart'; 3 | 4 | typedef InitView = void Function(); 5 | typedef UpdateCallBack = void Function(); 6 | 7 | class Config { 8 | //传递的设置参数 9 | @required String title = ""; 10 | bool dismissAppBar; 11 | 12 | Config({Key key, this.title, this.dismissAppBar = false}); 13 | } 14 | -------------------------------------------------------------------------------- /lib/model/newsModel.dart: -------------------------------------------------------------------------------- 1 | 2 | 3 | class NewsModel { 4 | String reason; 5 | Result result; 6 | int errorCode; 7 | 8 | NewsModel({this.reason, this.result, this.errorCode}); 9 | 10 | NewsModel.fromJson(Map json) { 11 | reason = json['reason']; 12 | result = 13 | json['result'] != null ? new Result.fromJson(json['result']) : null; 14 | errorCode = json['error_code']; 15 | } 16 | 17 | Map toJson() { 18 | final Map data = new Map(); 19 | data['reason'] = this.reason; 20 | if (this.result != null) { 21 | data['result'] = this.result.toJson(); 22 | } 23 | data['error_code'] = this.errorCode; 24 | return data; 25 | } 26 | } 27 | 28 | class Result { 29 | String stat; 30 | List data; 31 | 32 | Result({this.stat, this.data}); 33 | 34 | Result.fromJson(Map json) { 35 | stat = json['stat']; 36 | if (json['data'] != null) { 37 | data = new List(); 38 | json['data'].forEach((v) { 39 | data.add(new Data.fromJson(v)); 40 | }); 41 | } 42 | } 43 | 44 | Map toJson() { 45 | final Map data = new Map(); 46 | data['stat'] = this.stat; 47 | if (this.data != null) { 48 | data['data'] = this.data.map((v) => v.toJson()).toList(); 49 | } 50 | return data; 51 | } 52 | } 53 | 54 | class Data { 55 | String uniquekey; 56 | String title; 57 | String date; 58 | String category; 59 | String authorName; 60 | String url; 61 | String thumbnailPicS; 62 | String thumbnailPicS02; 63 | String thumbnailPicS03; 64 | 65 | Data( 66 | {this.uniquekey, 67 | this.title, 68 | this.date, 69 | this.category, 70 | this.authorName, 71 | this.url, 72 | this.thumbnailPicS, 73 | this.thumbnailPicS02, 74 | this.thumbnailPicS03}); 75 | 76 | Data.fromJson(Map json) { 77 | uniquekey = json['uniquekey']; 78 | title = json['title']; 79 | date = json['date']; 80 | category = json['category']; 81 | authorName = json['author_name']; 82 | url = json['url']; 83 | thumbnailPicS = json['thumbnail_pic_s']; 84 | thumbnailPicS02 = json['thumbnail_pic_s02']; 85 | thumbnailPicS03 = json['thumbnail_pic_s03']; 86 | } 87 | 88 | Map toJson() { 89 | final Map data = new Map(); 90 | data['uniquekey'] = this.uniquekey; 91 | data['title'] = this.title; 92 | data['date'] = this.date; 93 | data['category'] = this.category; 94 | data['author_name'] = this.authorName; 95 | data['url'] = this.url; 96 | data['thumbnail_pic_s'] = this.thumbnailPicS; 97 | data['thumbnail_pic_s02'] = this.thumbnailPicS02; 98 | data['thumbnail_pic_s03'] = this.thumbnailPicS03; 99 | return data; 100 | } 101 | } -------------------------------------------------------------------------------- /lib/net/API.dart: -------------------------------------------------------------------------------- 1 | 2 | class API { 3 | //此处地址都是模拟的 4 | static const String BASE_URL = "https://api.xxx.com"; 5 | //获取banner信息 6 | static const String GET_BANNER_INFO = BASE_URL + "/get_banner_info"; 7 | 8 | 9 | } -------------------------------------------------------------------------------- /lib/net/requestAPI.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/services.dart' show rootBundle; 2 | import 'dart:convert'; 3 | 4 | ///网络请求的入口 5 | class RequestAPI { 6 | 7 | Future get(String action, {Map params}) async { 8 | var responseStr = await rootBundle.loadString('assets/mock/$action.json'); 9 | var responseJson = json.decode(responseStr); 10 | return responseJson; 11 | } 12 | } -------------------------------------------------------------------------------- /lib/page/assetPage.dart: -------------------------------------------------------------------------------- 1 | import '../base/baseWidget.dart'; 2 | import 'package:flutter/material.dart'; 3 | import '../model/config.dart'; 4 | import 'package:fl_chart/fl_chart.dart'; 5 | import 'product/productDetail/publicProductDetail.dart'; 6 | 7 | class AssetPage extends BaseStatefulWidget { 8 | @override 9 | Config setConfig() { 10 | return Config( 11 | title: "资产", 12 | dismissAppBar: true 13 | ); 14 | } 15 | 16 | @override 17 | State setBody() { 18 | return AssetState(); 19 | } 20 | } 21 | 22 | class AssetState extends State { 23 | //刚进来的时候默认是显示的 24 | bool isShow = true; 25 | String totalAssets = "6,200,800.00"; 26 | String yesterdayEarn = "-5,000,000.00"; 27 | List assetDetailModelList = new List(); 28 | 29 | List pieChartList = new List(); 30 | 31 | @override 32 | void initState() { 33 | // TODO: implement initState 34 | super.initState(); 35 | assetDetailModelList 36 | ..add(new AssetDetailModel(0xffE7B17C, "私募资产", 12000000.00, "12,000,000.00")) 37 | ..add(new AssetDetailModel(0xff4D73B2, "公募资产", 500000.00, "500,000.00")) 38 | ..add(new AssetDetailModel(0xffE6891E, "活期理财", 100000.00, "100,000.00")) 39 | ..add(new AssetDetailModel(0xff9A39AD, "定融定投", 4000000.00, "4,000,000.00")) 40 | ..add(new AssetDetailModel(0xffDBECF8, "公募智投", 650000.00, "650,000.00")); 41 | 42 | assetDetailModelList.forEach((model){ 43 | pieChartList.add(PieChartSectionData(showTitle: false, value: model.value, color: Color(model.color))); 44 | }); 45 | } 46 | 47 | @override 48 | Widget build(BuildContext context) { 49 | return Container( 50 | //主视图列表 51 | child: SingleChildScrollView( 52 | child: Column( 53 | children: [ 54 | getAssetHeader(), 55 | getPieChart(), 56 | getAssetDetail() 57 | ], 58 | ), 59 | ), 60 | ); 61 | } 62 | 63 | Widget getAssetHeader() { 64 | return Container( 65 | height: 190, 66 | child: Stack( 67 | alignment: Alignment.center, 68 | children: [ 69 | Positioned( 70 | top: 0, 71 | child: Image.asset("assets/images/iv_assets_bg.png", height: 155), 72 | ), 73 | Positioned( 74 | top: 44, 75 | child: Text( 76 | "账户资产", 77 | style: TextStyle(fontSize: 20, color: Color(0xffDFB379)), 78 | textAlign: TextAlign.center, 79 | ), 80 | ), 81 | Positioned( 82 | left: 20, 83 | top: 92, 84 | child: Text( 85 | "尊敬的李先生", 86 | style: TextStyle(fontSize: 16, color: Color(0xffDFB379)), 87 | textAlign: TextAlign.center, 88 | ), 89 | ), 90 | Align( 91 | alignment: Alignment.bottomCenter, 92 | child: Container( 93 | height: 65, 94 | decoration: BoxDecoration( 95 | borderRadius: BorderRadius.only( 96 | topLeft: Radius.circular(20), 97 | topRight: Radius.circular(20)), 98 | color: Color(0xffF1F6FB)), 99 | ), 100 | ), 101 | Positioned( 102 | left: 20, 103 | bottom: 8, 104 | child: Column( 105 | crossAxisAlignment: CrossAxisAlignment.start, 106 | children: [ 107 | Row( 108 | children: [ 109 | Text( 110 | "总资产 ", 111 | style: TextStyle(fontSize: 14, color: Color(0xff7D7C7D)), 112 | textAlign: TextAlign.left, 113 | ), 114 | GestureDetector( 115 | child: Image.asset( 116 | isShow 117 | ? "assets/images/icon_show.png" 118 | : "assets/images/icon_dismiss.png", 119 | width: 18, 120 | height: 12, 121 | ), 122 | onTap: () { 123 | setState(() { 124 | isShow = !isShow; 125 | }); 126 | }, 127 | ) 128 | ], 129 | ), 130 | Container( 131 | child: Text( 132 | isShow ? totalAssets : "********", 133 | style: TextStyle( 134 | fontSize: 20, 135 | color: Color(0xff333333), 136 | fontWeight: FontWeight.bold), 137 | ), 138 | ) 139 | ], 140 | ), 141 | ), 142 | Positioned( 143 | left: 190, 144 | bottom: 8, 145 | child: Column( 146 | crossAxisAlignment: CrossAxisAlignment.start, 147 | children: [ 148 | Text( 149 | "昨日收益(元)", 150 | style: TextStyle(fontSize: 14, color: Color(0xff7D7C7D)), 151 | textAlign: TextAlign.left, 152 | ), 153 | Container( 154 | child: Text( 155 | isShow ? yesterdayEarn : "********", 156 | style: TextStyle( 157 | fontSize: 20, 158 | color: isShow 159 | ? yesterdayEarn.substring(0, 1) == "-" 160 | ? Colors.green 161 | : Colors.red 162 | : Color(0xff333333), 163 | fontWeight: FontWeight.bold), 164 | ), 165 | ) 166 | ], 167 | ), 168 | ) 169 | ], 170 | ), 171 | ); 172 | } 173 | 174 | Widget getPieChart() { 175 | return Container( 176 | child: FlChart( 177 | chart: PieChart(PieChartData( 178 | sections: pieChartList, 179 | centerSpaceRadius: 40, 180 | borderData: FlBorderData(show: false), 181 | sectionsSpace: 0))), 182 | ); 183 | } 184 | 185 | Widget getAssetDetail() { 186 | return Container( 187 | margin: EdgeInsets.only(left: 16, right: 16, bottom: 16), 188 | padding: EdgeInsets.only(left: 24), 189 | decoration: BoxDecoration( 190 | borderRadius: BorderRadius.all(Radius.circular(10)), 191 | color: Color(0xffFBFBFB) 192 | ), 193 | child: GridView.builder( 194 | itemCount: assetDetailModelList.length, 195 | physics: NeverScrollableScrollPhysics(), 196 | shrinkWrap: true, 197 | gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( 198 | //横向数量 199 | crossAxisCount: 2, 200 | childAspectRatio: 5/2 201 | ), 202 | itemBuilder: (BuildContext context, int index){ 203 | return getAssetDetailItem(assetDetailModelList[index]); 204 | }), 205 | ); 206 | } 207 | 208 | Widget getAssetDetailItem(AssetDetailModel model) { 209 | return GestureDetector( 210 | onTap: () { 211 | switchNextPage(context, PublicProductDetail(model.valueDesc, model.title)); 212 | }, 213 | child: Container( 214 | child: Stack( 215 | overflow: Overflow.clip, 216 | children: [ 217 | Positioned( 218 | top: 17, 219 | child: Container( 220 | color: Color(model.color), 221 | width: 10, 222 | height: 10, 223 | ), 224 | ), 225 | Positioned( 226 | top: 12, 227 | left: 16, 228 | child: Text(model.title, 229 | style: TextStyle(fontSize: 13, color: Color(0xff82878D)),), 230 | ), 231 | Positioned( 232 | top: 32, 233 | child: Text(model.valueDesc, 234 | style: TextStyle(fontSize: 13, color: Color(0xff333333)),), 235 | ) 236 | ], 237 | ), 238 | ), 239 | ); 240 | } 241 | } 242 | 243 | class AssetDetailModel{ 244 | AssetDetailModel(this.color, this.title, this.value, this.valueDesc); 245 | int color; 246 | String title; 247 | double value; 248 | String valueDesc; 249 | } -------------------------------------------------------------------------------- /lib/page/details/bannerDetail.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:htjf_flutter_app/model/config.dart'; 3 | import '../../base/baseWidget.dart'; 4 | 5 | class BannerDetail extends BaseStatefulWidget{ 6 | String imgPath; 7 | BannerDetail(this.imgPath); 8 | @override 9 | State setBody() { 10 | return BannerState(imgPath); 11 | } 12 | 13 | @override 14 | Config setConfig() { 15 | return Config( 16 | title: "详情", 17 | ); 18 | } 19 | 20 | } 21 | 22 | class BannerState extends State{ 23 | String imgPath; 24 | BannerState(this.imgPath); 25 | @override 26 | Widget build(BuildContext context) { 27 | return Container( 28 | child: getImg(imgPath) 29 | ); 30 | } 31 | 32 | Widget getImg(String imgPath){ 33 | if (imgPath.contains("http")){ 34 | return Image.network(imgPath, fit: BoxFit.fill); 35 | } else { 36 | return Image.asset(imgPath, fit: BoxFit.fill); 37 | } 38 | } 39 | } -------------------------------------------------------------------------------- /lib/page/details/newsDetail.dart: -------------------------------------------------------------------------------- 1 | ///WebView 展示链接 2 | /// 3 | /// 4 | 5 | import "package:flutter/material.dart"; 6 | import 'package:htjf_flutter_app/model/config.dart'; 7 | import '../../base/baseWidget.dart'; 8 | import 'package:webview_flutter/webview_flutter.dart'; 9 | 10 | class NewsDetail extends BaseStatefulWidget{ 11 | 12 | String _url; 13 | NewsDetail(this._url); 14 | 15 | @override 16 | State setBody() { 17 | return _NewsDetail(_url); 18 | } 19 | 20 | @override 21 | Config setConfig() { 22 | return Config( 23 | title: "基金详情" 24 | ); 25 | } 26 | } 27 | 28 | class _NewsDetail extends State{ 29 | 30 | String _url; 31 | _NewsDetail(this._url); 32 | 33 | @override 34 | Widget build(BuildContext context) { 35 | return Container( 36 | child: WebView( 37 | initialUrl: _url, 38 | ), 39 | ); 40 | } 41 | 42 | } -------------------------------------------------------------------------------- /lib/page/index/indexPage.dart: -------------------------------------------------------------------------------- 1 | import 'package:htjf_flutter_app/model/config.dart'; 2 | import '../../base/baseWidget.dart'; 3 | import 'package:flutter/material.dart'; 4 | import '../../model/config.dart'; 5 | import 'package:flutter_swiper/flutter_swiper.dart'; 6 | import '../../model/bannerModel.dart'; 7 | import '../details/bannerDetail.dart'; 8 | import '../../base/baseUiWidget.dart' as BaseUI; 9 | import '../../model/NewsListModel.dart'; 10 | import '../details/newsDetail.dart'; 11 | 12 | class IndexPage extends BaseStatefulWidget { 13 | @override 14 | Config setConfig() { 15 | return Config(title: "首页", dismissAppBar: true); 16 | } 17 | 18 | @override 19 | State setBody() { 20 | return IndexState(); 21 | } 22 | } 23 | 24 | class IndexState extends State with TickerProviderStateMixin { 25 | BuildContext buildContext; 26 | List gridList = new List(); 27 | NewsListModel _newsListModel; 28 | //banner相关的model 29 | BannerModel _bannerModel; 30 | 31 | @override 32 | void initState() { 33 | super.initState(); 34 | //initView放在里面 35 | gridList 36 | ..add(new KingKangModel("assets/images/icon_account.png", "开户/认证")) 37 | ..add(new KingKangModel("assets/images/icon_private.png", "热销私募")) 38 | ..add(new KingKangModel("assets/images/icon_cash.png", "现金管理")) 39 | ..add(new KingKangModel("assets/images/icon_current.png", "活期理财")) 40 | ..add(new KingKangModel("assets/images/icon_public_group.png", "公募组合")) 41 | ..add(new KingKangModel("assets/images/icon_public_fixed.png", "公募定投")) 42 | ..add(new KingKangModel("assets/images/icon_public_smart.png", "公募智投")) 43 | ..add(new KingKangModel("assets/images/icon_heng_shop.png", "恒乐汇商场")); 44 | 45 | requestAPI("get_banner_info", (value){ 46 | //请求banner图的数据 47 | setState(() { 48 | _bannerModel = new BannerModel.fromJson(value); 49 | }); 50 | }); 51 | 52 | requestAPI("get_news_list", (value){ 53 | //请求新闻列表的数据 54 | setState(() { 55 | _newsListModel = new NewsListModel.fromJson(value); 56 | }); 57 | }); 58 | } 59 | 60 | @override 61 | Widget build(BuildContext context) { 62 | return getBody(); 63 | } 64 | 65 | Widget getBody(){ 66 | return Stack( 67 | children: [ 68 | SingleChildScrollView( 69 | child: Column( 70 | children: [ 71 | getRow(), 72 | getGrideView(), 73 | BaseUI.BaseUIWidget().getDividerLine(), 74 | getBanner(), 75 | getNewsView(), 76 | getMoreInfo(), 77 | BaseUI.BaseUIWidget().getDividerLine(), 78 | BaseUI.BaseUIWidget().getTitle("精选专题"), 79 | getSelectedTopic(), 80 | BaseUI.BaseUIWidget().getDividerLineMargin(), 81 | BaseUI.BaseUIWidget().getTitle("平台资质"), 82 | getQualifications() 83 | ], 84 | ), 85 | ), 86 | Offstage( 87 | offstage: !isLoading, 88 | child: getLoadingWidget(), 89 | ) 90 | ], 91 | ); 92 | } 93 | 94 | Widget getGrideView() { 95 | return Container( 96 | margin: EdgeInsets.only(left: 16, right: 16), 97 | child: GridView.builder( 98 | physics: NeverScrollableScrollPhysics(), 99 | shrinkWrap: true, 100 | itemCount: gridList.length, 101 | gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( 102 | //横向数量 103 | crossAxisCount: 4, 104 | childAspectRatio: 5 / 4), 105 | itemBuilder: (BuildContext context, int index) { 106 | return getGrideItem(gridList[index]); 107 | }), 108 | ); 109 | } 110 | 111 | Widget getGrideItem(KingKangModel model) { 112 | return Container( 113 | width: 30, 114 | child: Column( 115 | children: [ 116 | Image.asset(model.imgPath, width: 30.0, height: 30.0), 117 | Container( 118 | margin: EdgeInsets.only(top: 2), 119 | child: Text( 120 | model.title, 121 | style: TextStyle(fontSize: 12, color: Color(0xff222222)), 122 | ), 123 | ) 124 | ], 125 | ), 126 | ); 127 | } 128 | 129 | //获取信息列表 130 | //下面使用PageView来实现 不用ListView 131 | Widget getNewsTab() { 132 | TabController tabController = new TabController(length: 3, vsync: this); 133 | return Container( 134 | width: 200, 135 | child: TabBar( 136 | labelPadding: EdgeInsets.all(10.0), 137 | //选中的字体样式 138 | labelStyle: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), 139 | //未选中的字体样式 140 | unselectedLabelStyle: 141 | TextStyle(fontSize: 16, fontWeight: FontWeight.normal), 142 | //选中的字体颜色 143 | labelColor: Color(0xffDFB379), 144 | //未选中的字体颜色 145 | unselectedLabelColor: Color(0xff999999), 146 | //下面标识条的颜色 147 | indicatorColor: Color(0xffDFB379), 148 | indicatorPadding: EdgeInsets.only(bottom: 7), 149 | tabs: [ 150 | Container( 151 | child: Text("市场"), 152 | ), 153 | Container( 154 | child: Text("快讯"), 155 | ), 156 | Container( 157 | child: Text("研报"), 158 | ), 159 | ], 160 | indicatorSize: TabBarIndicatorSize.label, 161 | controller: tabController, 162 | // onTap: (int index) { 163 | // setState(() { 164 | // newsList.forEach((model){ 165 | // model.title = model.title + index.toString(); 166 | // }); 167 | // }); 168 | // }, 169 | ), 170 | ); 171 | } 172 | 173 | Widget getNewsListViewArea() { 174 | return Container( 175 | child: getNewsListView()); 176 | } 177 | 178 | Widget getNewsListView(){ 179 | if (_newsListModel != null && _newsListModel.newsList.isNotEmpty){ 180 | return ListView.builder( 181 | shrinkWrap: true, 182 | physics: NeverScrollableScrollPhysics(), 183 | itemBuilder: (BuildContext context, int index) { 184 | return GestureDetector( 185 | child: Container( 186 | margin: EdgeInsets.only(left: 16), 187 | padding: EdgeInsets.only(right: 16, top: 12, bottom: 12), 188 | decoration: BoxDecoration( 189 | border: Border( 190 | bottom: BorderSide(color: Color(0xffeeeeee), width: 0.5))), 191 | child: Column( 192 | children: [ 193 | Container( 194 | alignment: Alignment.centerLeft, 195 | child: Text( 196 | _newsListModel.newsList[index].title + index.toString(), 197 | style: TextStyle(fontSize: 14, color: Color(0xff222222)), 198 | maxLines: 2, 199 | overflow: TextOverflow.ellipsis, 200 | ), 201 | ), 202 | Container( 203 | alignment: Alignment.centerLeft, 204 | margin: EdgeInsets.only(top: 12), 205 | child: Text( 206 | _newsListModel.newsList[index].date, 207 | style: TextStyle(fontSize: 12, color: Color(0xff999999)), 208 | textAlign: TextAlign.left, 209 | ), 210 | ) 211 | ], 212 | ), 213 | ), 214 | onTap: (){ 215 | switchNextPage(context, NewsDetail("http://www.jnlc.com/article/20191012248576.shtml")); 216 | }, 217 | ); 218 | }, 219 | itemCount: _newsListModel.newsList.length, 220 | ); 221 | } else { 222 | return SizedBox(); 223 | } 224 | } 225 | 226 | Widget getNewsView() { 227 | return Container( 228 | child: Column( 229 | children: [ 230 | Container( 231 | alignment: Alignment.centerLeft, 232 | margin: EdgeInsets.only(left: 16), 233 | height: 50, 234 | child: getNewsTab(), 235 | ), 236 | Container( 237 | child: getNewsPageView(), 238 | ) 239 | ], 240 | ), 241 | ); 242 | } 243 | 244 | Widget getNewsPageView() { 245 | return Container( 246 | alignment: Alignment.topCenter, 247 | child: getNewsListViewArea(), 248 | ); 249 | } 250 | 251 | Widget getBanner() { 252 | return Container( 253 | margin: EdgeInsets.only(left: 16.0, top: 16.0, right: 16.0), 254 | height: 80.0, 255 | child: ClipRRect( 256 | borderRadius: BorderRadius.all(Radius.circular(10.0)), 257 | child: getSwiper() 258 | ), 259 | ); 260 | } 261 | 262 | Widget getSwiper(){ 263 | if (_bannerModel != null && _bannerModel.bannerList.isNotEmpty){ 264 | return Swiper( 265 | itemCount: _bannerModel.bannerList.length, 266 | itemBuilder: (BuildContext context, int index) { 267 | return GestureDetector( 268 | child: Image.network(_bannerModel.bannerList[index].imgPath, fit: BoxFit.fill), 269 | onTap: (){ 270 | switchNextPage(context, BannerDetail(_bannerModel.bannerList[index].imgPath)); 271 | }, 272 | ); 273 | }, 274 | autoplay: true, 275 | autoplayDelay: 2000, 276 | autoplayDisableOnInteraction: true, 277 | duration: 500, 278 | plugins: [], 279 | ); 280 | } else { 281 | return SizedBox(); 282 | } 283 | } 284 | 285 | Widget getRow() { 286 | return Container( 287 | margin: EdgeInsets.only(left: 16.0, top: 32.0, right: 16.0, bottom: 16.0), 288 | child: Row( 289 | mainAxisAlignment: MainAxisAlignment.spaceAround, 290 | children: [ 291 | new GestureDetector( 292 | child: Image.asset("assets/images/index_header_1.png", 293 | width: 100, height: 50), 294 | onTap: () { 295 | }, 296 | ), 297 | new GestureDetector( 298 | child: Image.asset("assets/images/index_header_2.png", 299 | width: 100, height: 50), 300 | onTap: () {}, 301 | ), 302 | new GestureDetector( 303 | child: Image.asset("assets/images/index_header_3.png", 304 | width: 100, height: 50), 305 | onTap: () {}, 306 | ) 307 | ], 308 | ), 309 | ); 310 | } 311 | 312 | Widget getMoreInfo() { 313 | return Container( 314 | padding: EdgeInsets.only(left: 13, right: 13, top: 3, bottom: 3), 315 | margin: EdgeInsets.only(top: 12, bottom: 12), 316 | decoration: BoxDecoration( 317 | border: Border.all(color: Color(0xffDFB379), width: 0.5), 318 | borderRadius: BorderRadius.all(Radius.circular(5))), 319 | child: Text("查看更多", 320 | style: TextStyle(fontSize: 12, color: Color(0xffDFB379))), 321 | ); 322 | } 323 | 324 | //精选专题 325 | Widget getSelectedTopic() { 326 | return Container( 327 | margin: EdgeInsets.only(left: 16, right: 16, top: 16), 328 | child: Column( 329 | children: [ 330 | GestureDetector( 331 | child: Container( 332 | height: 130, 333 | decoration: BoxDecoration( 334 | image: DecorationImage(image: NetworkImage("http://img1.gtimg.com/sports/pics/hv1/202/84/1781/115831147.jpg"), fit: BoxFit.fill), 335 | borderRadius: BorderRadius.all(Radius.circular(10))), 336 | ), 337 | onTap: (){ 338 | switchNextPage(context, BannerDetail("http://img1.gtimg.com/sports/pics/hv1/202/84/1781/115831147.jpg")); 339 | }, 340 | ), 341 | GestureDetector( 342 | child: Container( 343 | height: 130, 344 | margin: EdgeInsets.only(top: 12), 345 | decoration: BoxDecoration( 346 | image: DecorationImage(image: NetworkImage("http://b.hiphotos.baidu.com/zhidao/wh%3D450%2C600/sign=9e30f243ca3d70cf4cafa209cdecfd36/adaf2edda3cc7cd96c1e94a33a01213fb80e919d.jpg"), fit: BoxFit.fill), 347 | borderRadius: BorderRadius.all(Radius.circular(10))), 348 | ), 349 | onTap: (){ 350 | switchNextPage(context, BannerDetail("http://b.hiphotos.baidu.com/zhidao/wh%3D450%2C600/sign=9e30f243ca3d70cf4cafa209cdecfd36/adaf2edda3cc7cd96c1e94a33a01213fb80e919d.jpg")); 351 | }, 352 | ) 353 | ], 354 | ), 355 | ); 356 | } 357 | 358 | //精选专题 359 | Widget getQualifications() { 360 | return Container( 361 | height: 90, 362 | margin: EdgeInsets.only(top: 16, left: 16, right: 16, bottom: 20), 363 | child: Row( 364 | children: [ 365 | Expanded( 366 | child: GestureDetector( 367 | child: Container( 368 | decoration: BoxDecoration( 369 | image: DecorationImage(image: AssetImage("assets/images/ic_team.png"), fit: BoxFit.fill), 370 | borderRadius: BorderRadius.all(Radius.circular(10))), 371 | ), 372 | onTap: (){ 373 | switchNextPage(context, BannerDetail("assets/images/ic_team.png")); 374 | }, 375 | ), 376 | ), 377 | Expanded( 378 | child: GestureDetector( 379 | child: Container( 380 | margin: EdgeInsets.only(left: 12), 381 | decoration: BoxDecoration( 382 | image: DecorationImage(image: AssetImage("assets/images/ic_qualifacation.png"), fit: BoxFit.fill), 383 | borderRadius: BorderRadius.all(Radius.circular(10))), 384 | ), 385 | onTap: (){ 386 | switchNextPage(context, BannerDetail("assets/images/ic_qualifacation.png")); 387 | }, 388 | ), 389 | ) 390 | ], 391 | ), 392 | ); 393 | } 394 | } 395 | 396 | class KingKangModel { 397 | String imgPath; 398 | String title; 399 | 400 | KingKangModel(this.imgPath, this.title); 401 | 402 | void tapListener() {} 403 | } 404 | -------------------------------------------------------------------------------- /lib/page/minePage.dart: -------------------------------------------------------------------------------- 1 | import '../base/baseWidget.dart'; 2 | import 'package:flutter/material.dart'; 3 | import '../model/config.dart'; 4 | import '../base/baseUiWidget.dart' as BaseUI; 5 | 6 | class MinePage extends BaseStatefulWidget{ 7 | @override 8 | Config setConfig() { 9 | return Config( 10 | title: "我的", 11 | dismissAppBar: true 12 | ); 13 | } 14 | 15 | @override 16 | State setBody() { 17 | return MineState(); 18 | } 19 | 20 | } 21 | 22 | class MineState extends State{ 23 | @override 24 | Widget build(BuildContext context) { 25 | return SingleChildScrollView( 26 | child: Column( 27 | children: [ 28 | getMineHeader(), 29 | BaseUI.BaseUIWidget().getDividerLine(), 30 | getOpenArea(), 31 | BaseUI.BaseUIWidget().getDividerLine(), 32 | getItem("我的信息", "assets/images/ic_basic_info.png"), 33 | getDividerLineSine(), 34 | getItem("我的银行卡", "assets/images/ic_bank_card.png"), 35 | getDividerLineSine(), 36 | getItem("我的理财师", "assets/images/ic_licaishi.png"), 37 | getDividerLineSine(), 38 | getItem("我的银行卡", "assets/images/ic_bank_card.png"), 39 | getDividerLineSine(), 40 | getItem("风险测评", "assets/images/ic_risk_test.png"), 41 | getDividerLineSine(), 42 | getItem("监管账户查询", "assets/images/ic_employee_info.png"), 43 | BaseUI.BaseUIWidget().getDividerLine() 44 | ], 45 | ), 46 | ); 47 | } 48 | 49 | Widget getMineHeader(){ 50 | return Container( 51 | height: 184, 52 | decoration: BoxDecoration( 53 | image: DecorationImage(image: AssetImage("assets/images/iv_mine_header.png"), fit: BoxFit.fill) 54 | ), 55 | child: Stack( 56 | alignment: Alignment.center, 57 | children: [ 58 | Positioned( 59 | top: 60, 60 | width: 35, 61 | child: Image.asset("assets/images/icon_mine_header.png"), 62 | ), 63 | Positioned( 64 | bottom: 52, 65 | child: Text("186****0970,您好!", style: TextStyle(fontSize: 14, color: Colors.white),), 66 | ), 67 | Positioned( 68 | top: 32, 69 | right: 16, 70 | child: GestureDetector( 71 | child: Row( 72 | children: [ 73 | Icon(Icons.settings_applications), 74 | Text("设置", style: TextStyle(fontSize: 12, color: Colors.white),) 75 | ], 76 | ), 77 | onTap: (){ 78 | //todo 去设置页面 79 | }, 80 | ) 81 | ) 82 | ], 83 | ), 84 | ); 85 | } 86 | 87 | Widget getOpenArea(){ 88 | return Container( 89 | height: 70, 90 | child: Stack( 91 | alignment: Alignment.centerLeft, 92 | children: [ 93 | Positioned( 94 | top: 14, 95 | left: 16, 96 | child: Text("公募开户", style: TextStyle(fontSize: 14, color: Color(0xff333333))), 97 | ), 98 | Positioned( 99 | bottom: 14, 100 | left: 16, 101 | child: Text("涓涓细流,可汇江海", style: TextStyle(fontSize: 12, color: Color(0xff7d7c7d))), 102 | ), 103 | Positioned( 104 | right: 16, 105 | child: Container( 106 | padding: EdgeInsets.only(left: 5, right: 5, top: 3, bottom: 3), 107 | decoration: BoxDecoration( 108 | border: Border.all(color: Color(0xffF4CF5C)), 109 | borderRadius: BorderRadius.all(Radius.circular(5)) 110 | ), 111 | child: Text("立即开户", style: TextStyle(fontSize: 14, color: Color(0xffF4CF5C))), 112 | ), 113 | ) 114 | ], 115 | ), 116 | ); 117 | } 118 | 119 | Widget getItem(String title, String imgPath){ 120 | return Container( 121 | height: 40, 122 | child: Stack( 123 | alignment: Alignment.centerLeft, 124 | children: [ 125 | Positioned( 126 | left: 20, 127 | top: 15, 128 | child: Image.asset(imgPath, height: 14, width: 14,), 129 | ), 130 | Positioned( 131 | left: 42, 132 | child: Text(title, style: TextStyle(fontSize: 14, color: Color(0xff333333)),), 133 | ), 134 | Positioned( 135 | right: 12, 136 | child: Image.asset("assets/images/ic_right_arrow.png", height: 12, width: 7,), 137 | ), 138 | ], 139 | ), 140 | ); 141 | } 142 | 143 | Widget getDividerLineSine() { 144 | return Container( 145 | margin: EdgeInsets.only(left: 16), 146 | height: 1.0, 147 | color: Color(0xfff8f8f8), 148 | ); 149 | } 150 | 151 | } -------------------------------------------------------------------------------- /lib/page/news/newsList.dart: -------------------------------------------------------------------------------- 1 | 2 | import 'package:flutter/material.dart'; 3 | import 'package:htjf_flutter_app/model/config.dart'; 4 | import '../../base/baseWidget.dart'; 5 | import '../details/newsDetail.dart'; 6 | import '../../model/newsModel.dart'; 7 | 8 | class NewsList extends BaseStatefulWidget{ 9 | 10 | String _url;//当前的类型 0:头条 1:社会 2:体育 3:科技 4:财经 11 | NewsList(this._url); 12 | 13 | @override 14 | State setBody() { 15 | // TODO: implement setBody 16 | return _NewsList(_url); 17 | } 18 | 19 | @override 20 | Config setConfig() { 21 | return Config( 22 | title: "", 23 | dismissAppBar: true 24 | ); 25 | } 26 | } 27 | 28 | class _NewsList extends State{ 29 | 30 | _NewsList(this._url); 31 | 32 | List _newsListData = new List(); 33 | String _url; 34 | int _currentPage = 1;//当前的页数 35 | ScrollController _scrollController; 36 | bool _noMoreData = false; 37 | 38 | @override 39 | void initState() { 40 | // TODO: implement initState 41 | super.initState(); 42 | //请求网络 拿到数据 43 | requestData(true); 44 | _scrollController = ScrollController(); 45 | _scrollController.addListener((){ 46 | //test 47 | if (_currentPage == 1){ 48 | _noMoreData = true; 49 | } 50 | 51 | if (_noMoreData){ 52 | //无更多数据了 不允许上拉加载更多了 53 | return; 54 | } 55 | if (_scrollController.position.pixels == _scrollController.position.maxScrollExtent){ 56 | //滚动到了底部 57 | requestData(false); 58 | } 59 | }); 60 | } 61 | 62 | @override 63 | Widget build(BuildContext context) { 64 | return Stack( 65 | children: [ 66 | RefreshIndicator( 67 | onRefresh: _onRefresh, 68 | child: ListView.builder( 69 | controller: _scrollController, 70 | physics: BouncingScrollPhysics(), 71 | //这里+1是为了放上拉加载的结果Widget 72 | itemCount: _newsListData.isEmpty? 0: _newsListData.length + 1, 73 | itemBuilder: (BuildContext context, int index){ 74 | if (index == _newsListData.length){ 75 | return getPullUpResultWidget(); 76 | } 77 | return GestureDetector( 78 | child: Container( 79 | height: 80, 80 | child: Stack( 81 | alignment: Alignment.centerLeft, 82 | children: [ 83 | Positioned( 84 | child: Image.network(_newsListData[index].thumbnailPicS, height: 70, width: 70, fit: BoxFit.fill,), 85 | left: 16, 86 | ), 87 | Positioned( 88 | top: 5, 89 | left: 102, 90 | right: 16, 91 | child: Text(_newsListData[index].title, maxLines: 2, overflow: TextOverflow.ellipsis, style: TextStyle(fontSize: 15, color: Color(0xff333333)),), 92 | ), 93 | Positioned( 94 | left: 102, 95 | right: 16, 96 | bottom: 5, 97 | child: Text(_newsListData[index].authorName + " " + _newsListData[index].date, style: TextStyle(color: Color(0x6f333333), fontSize: 12), maxLines: 1, overflow: TextOverflow.ellipsis,), 98 | ) 99 | ], 100 | ), 101 | ), 102 | onTap: (){ 103 | switchNextPage(context, NewsDetail(_newsListData[index].url)); 104 | }, 105 | ); 106 | } 107 | ), 108 | ), 109 | Offstage( 110 | offstage: !isLoading, 111 | child: getLoadingWidget(), 112 | ) 113 | ], 114 | ); 115 | } 116 | 117 | //下拉刷新函数 118 | Future _onRefresh() async{ 119 | requestData(true); 120 | } 121 | 122 | void requestData(bool isFirstRequest){ 123 | //isFirstRequest用来区分是第一次加载还是上拉加载更多 如果是第一次加载或者下拉刷新 124 | //这里要分页加载 注意传参 125 | if (isFirstRequest){ 126 | _newsListData.clear(); 127 | _currentPage = 1; 128 | _noMoreData = false; 129 | } 130 | requestAPI(_url, (value){ 131 | setState(() { 132 | _newsListData.addAll(NewsModel.fromJson(value).result.data); 133 | _currentPage ++; 134 | }); 135 | }); 136 | } 137 | 138 | 139 | //上拉加载更多的Widget 包括上拉加载更多和暂无更多数据两种类型 140 | Widget getPullUpResultWidget(){ 141 | if (!_noMoreData){ 142 | //加载更多 143 | return Container( 144 | height: 45, 145 | padding: EdgeInsets.only(), 146 | child: Row( 147 | mainAxisAlignment: MainAxisAlignment.center, 148 | children: [ 149 | SizedBox( 150 | width: 25, 151 | height: 25, 152 | child: CircularProgressIndicator(strokeWidth: 3,), 153 | ), 154 | Container( 155 | margin: EdgeInsets.only(left: 10), 156 | child: Text("加载中..."), 157 | ) 158 | ], 159 | ) 160 | ); 161 | } else { 162 | //暂无更多数据 163 | return Container( 164 | alignment: Alignment.center, 165 | height: 45, 166 | child: Text("暂无更多数据") 167 | ); 168 | } 169 | } 170 | 171 | @override 172 | void dispose() { 173 | super.dispose(); 174 | _scrollController.dispose(); 175 | } 176 | } -------------------------------------------------------------------------------- /lib/page/news/newsPage.dart: -------------------------------------------------------------------------------- 1 | ///新闻列表页 2 | 3 | 4 | import 'package:flutter/material.dart'; 5 | import 'package:htjf_flutter_app/model/config.dart'; 6 | import '../../base/baseWidget.dart'; 7 | import 'newsList.dart'; 8 | 9 | class NewsPage extends BaseStatefulWidget{ 10 | @override 11 | State setBody() { 12 | return _NewsPage(); 13 | } 14 | 15 | @override 16 | Config setConfig() { 17 | return Config(title: "", dismissAppBar: true); 18 | } 19 | } 20 | 21 | class _NewsPage extends State with TickerProviderStateMixin{ 22 | 23 | TabController _tabController; 24 | PageController _pageController; 25 | 26 | @override 27 | void initState() { 28 | super.initState(); 29 | _tabController = TabController(length: 5, vsync: this); 30 | _pageController = PageController(initialPage: 0); 31 | } 32 | 33 | @override 34 | Widget build(BuildContext context) { 35 | return Column( 36 | children: [ 37 | Container( 38 | height: 45, 39 | margin: EdgeInsets.only(left: 16, right: 16, top: 23), 40 | child: TabBar( 41 | labelColor: Color(0xffE7B17C), 42 | labelStyle: TextStyle(fontWeight: FontWeight.bold, fontSize: 14), 43 | unselectedLabelColor: Colors.black, 44 | unselectedLabelStyle: TextStyle(fontWeight: FontWeight.normal, fontSize: 14), 45 | indicatorSize: TabBarIndicatorSize.label, 46 | indicatorColor: Color(0xffE7B17C), 47 | controller: _tabController, 48 | onTap: (index){ 49 | _pageController.animateToPage(index, duration: Duration(milliseconds: 200), curve: Curves.ease); 50 | }, 51 | tabs: [ 52 | Text("头条"), 53 | Text("社会"), 54 | Text("体育"), 55 | Text("科技"), 56 | Text("财经"), 57 | ], 58 | ), 59 | ), 60 | Expanded( 61 | child: PageView.builder( 62 | physics: BouncingScrollPhysics(), 63 | itemCount: 5, 64 | itemBuilder: (context, index){ 65 | return NewsList(getUrl(index)); 66 | }, 67 | controller: _pageController, 68 | onPageChanged: (index){ 69 | _tabController.animateTo(index, duration: Duration(milliseconds: 200)); 70 | }, 71 | ), 72 | ) 73 | ], 74 | ); 75 | } 76 | 77 | //通过当前的页面 获取URL 78 | String getUrl(int index){ 79 | switch(index){ 80 | case 0: 81 | return "index"; 82 | 83 | case 1: 84 | return "shehui"; 85 | 86 | case 2: 87 | return "tiyu"; 88 | 89 | case 3: 90 | return "keji"; 91 | 92 | case 4: 93 | return "caijing"; 94 | 95 | default: 96 | return "index"; 97 | } 98 | } 99 | } -------------------------------------------------------------------------------- /lib/page/product/productDetail/privateProductDetail.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:htjf_flutter_app/model/config.dart'; 3 | import '../../../base/baseWidget.dart'; 4 | import '../../../model/PrivateProductModel.dart'; 5 | import '../../../base/baseUiWidget.dart' as BaseUI; 6 | 7 | class PrivateProductDetail extends BaseStatefulWidget { 8 | PrivateProductModel model; 9 | 10 | PrivateProductDetail(this.model); 11 | 12 | @override 13 | State setBody() { 14 | return PrivateProductState(model); 15 | } 16 | 17 | @override 18 | Config setConfig() { 19 | return Config( 20 | title: "产品详情", 21 | ); 22 | } 23 | } 24 | 25 | class PrivateProductState extends State { 26 | PrivateProductModel model; 27 | 28 | PrivateProductState(this.model); 29 | 30 | @override 31 | Widget build(BuildContext context) { 32 | return Column( 33 | children: [ 34 | Expanded( 35 | child: SingleChildScrollView( 36 | child: Column( 37 | children: [ 38 | BaseUI.BaseUIWidget().getDividerLine(), 39 | getDetailHeader(), 40 | getProductInfoArea(), 41 | BaseUI.BaseUIWidget().getDividerLine(), 42 | getAchievementArea(), 43 | BaseUI.BaseUIWidget().getDividerLine(), 44 | getProductDescArea(), 45 | BaseUI.BaseUIWidget().getDividerLineMargin(), 46 | getProductData() 47 | ], 48 | )), 49 | ), 50 | //下方的按钮部分 51 | Align( 52 | alignment: Alignment.bottomCenter, 53 | child: Container( 54 | decoration: BoxDecoration( 55 | border: Border(top: BorderSide(color: Color(0xffcccccc), width: 0.5)) 56 | ), 57 | height: 40, 58 | child: Row( 59 | children: [ 60 | Container( 61 | width: 75, 62 | decoration: BoxDecoration( 63 | border: Border(top: BorderSide(color: Color(0xffcccccc), width: 0.5)) 64 | ), 65 | child: Stack( 66 | alignment: Alignment.center, 67 | children: [ 68 | Positioned( 69 | top: 2, 70 | child: Image.asset("assets/images/ic_phone.png", width: 20, height: 20,), 71 | ), 72 | Positioned( 73 | bottom: 2, 74 | child: Text("咨询热线", style: TextStyle(color: Color(0xff7d7c7d), fontSize: 10),) 75 | ) 76 | ] 77 | ) 78 | ), 79 | Expanded( 80 | child: Container( 81 | alignment: Alignment.center, 82 | height: 40, 83 | color: Color(0xffF4CF5C), 84 | child: Text("预约产品", style: TextStyle(fontSize: 14, color: Colors.white),), 85 | ), 86 | ) 87 | ], 88 | ), 89 | ) 90 | ) 91 | ], 92 | ); 93 | } 94 | 95 | Widget getDetailHeader() { 96 | return Container( 97 | alignment: Alignment.centerLeft, 98 | padding: EdgeInsets.only(left: 16, right: 16, top: 11, bottom: 11), 99 | child: RichText( 100 | text: TextSpan(children: [ 101 | TextSpan( 102 | text: model.productTitle + " ", 103 | style: TextStyle(fontSize: 16, color: Color(0xff333333))), 104 | TextSpan( 105 | text: model.productCode, 106 | style: TextStyle(fontSize: 14, color: Color(0xff7d7c7d))), 107 | ])), 108 | ); 109 | } 110 | 111 | Widget getProductInfoArea() { 112 | return Container( 113 | height: 80, 114 | margin: EdgeInsets.only(left: 16, right: 16), 115 | child: Row( 116 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 117 | children: [ 118 | Container( 119 | child: Column( 120 | crossAxisAlignment: CrossAxisAlignment.start, 121 | mainAxisAlignment: MainAxisAlignment.spaceAround, 122 | children: [ 123 | Text(model.achievementValueDesc, 124 | style: TextStyle(fontSize: 16, color: Color(0xffF4CF5C))), 125 | Text("业绩比较基准", 126 | style: TextStyle(fontSize: 12, color: Color(0xffbbbbbb))) 127 | ], 128 | ), 129 | ), 130 | Container( 131 | child: Column( 132 | mainAxisAlignment: MainAxisAlignment.spaceAround, 133 | children: [ 134 | Text(model.timeLimit, 135 | style: TextStyle(fontSize: 16, color: Color(0xff333333))), 136 | Text("投资期限(月)", 137 | style: TextStyle(fontSize: 12, color: Color(0xffbbbbbb))) 138 | ], 139 | ), 140 | ), 141 | Container( 142 | child: Column( 143 | mainAxisAlignment: MainAxisAlignment.spaceAround, 144 | crossAxisAlignment: CrossAxisAlignment.end, 145 | children: [ 146 | Text(model.investAmount, 147 | style: TextStyle(fontSize: 16, color: Color(0xff333333))), 148 | Text("起投金额(万)", 149 | style: TextStyle(fontSize: 12, color: Color(0xffbbbbbb))) 150 | ], 151 | ), 152 | ), 153 | ], 154 | ), 155 | ); 156 | } 157 | 158 | //业绩比较基准区域 159 | Widget getAchievementArea() { 160 | return Container( 161 | padding: EdgeInsets.only(left: 16, right: 16, top: 15, bottom: 20), 162 | child: Column( 163 | crossAxisAlignment: CrossAxisAlignment.start, 164 | children: [ 165 | Text( 166 | "业绩比较基准说明", 167 | style: TextStyle(fontSize: 14, color: Color(0xff333333)), 168 | ), 169 | Container( 170 | margin: EdgeInsets.only(top: 10), 171 | child: ListView.builder( 172 | shrinkWrap: true, 173 | physics: NeverScrollableScrollPhysics(), 174 | itemCount: model.achievementValue.length, 175 | itemBuilder: (BuildContext context, int index) { 176 | return Container( 177 | margin: EdgeInsets.only(top: 13), 178 | child: Row( 179 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 180 | children: [ 181 | Text( 182 | model.achievementValue[index].desc, 183 | style: 184 | TextStyle(color: Color(0xff7d7c7d), fontSize: 12), 185 | ), 186 | Text( 187 | model.achievementValue[index].value, 188 | textAlign: TextAlign.end, 189 | style: 190 | TextStyle(color: Color(0xff333333), fontSize: 12), 191 | ), 192 | ], 193 | ), 194 | ); 195 | }), 196 | ), 197 | ], 198 | ), 199 | ); 200 | } 201 | 202 | //产品简介区域 203 | Widget getProductDescArea() { 204 | return Container( 205 | padding: EdgeInsets.all(16), 206 | child: Column( 207 | crossAxisAlignment: CrossAxisAlignment.start, 208 | children: [ 209 | Container( 210 | margin: EdgeInsets.only(bottom: 10), 211 | child: Text( 212 | "产品简介", 213 | style: TextStyle(fontSize: 14, color: Color(0xff333333)), 214 | ), 215 | ), 216 | Container( 217 | margin: EdgeInsets.only(top: 13), 218 | child: Row( 219 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 220 | children: [ 221 | Text( 222 | "风险等级", 223 | style: TextStyle(color: Color(0xff7d7c7d), fontSize: 12), 224 | ), 225 | Row( 226 | mainAxisAlignment: MainAxisAlignment.end, 227 | children: [ 228 | getRiskStar(0, model.riskLevel), 229 | getRiskStar(1, model.riskLevel), 230 | getRiskStar(2, model.riskLevel), 231 | getRiskStar(3, model.riskLevel), 232 | getRiskStar(4, model.riskLevel), 233 | Text(" " + model.riskLevelDesc, style:TextStyle(color: Color(0xff333333), fontSize: 12)) 234 | ], 235 | ), 236 | ], 237 | ), 238 | ), 239 | Container( 240 | margin: EdgeInsets.only(top: 13), 241 | child: Row( 242 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 243 | children: [ 244 | Text( 245 | "管理机构", 246 | style: TextStyle(color: Color(0xff7d7c7d), fontSize: 12), 247 | ), 248 | Text(model.manageOrg, style:TextStyle(color: Color(0xff333333), fontSize: 12)) 249 | ], 250 | ), 251 | ), 252 | Container( 253 | margin: EdgeInsets.only(top: 13), 254 | child: Row( 255 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 256 | children: [ 257 | Text( 258 | "发行规模", 259 | style: TextStyle(color: Color(0xff7d7c7d), fontSize: 12), 260 | ), 261 | Text(model.issuingScale, style:TextStyle(color: Color(0xff333333), fontSize: 12)) 262 | ], 263 | ), 264 | ), 265 | Container( 266 | margin: EdgeInsets.only(top: 13), 267 | child: Row( 268 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 269 | children: [ 270 | Text( 271 | "募集时间", 272 | textAlign: TextAlign.left, 273 | style: TextStyle(color: Color(0xff7d7c7d), fontSize: 12), 274 | ), 275 | Text( 276 | model.raiseTime, style:TextStyle(color: Color(0xff333333), fontSize: 12)) 277 | ], 278 | ), 279 | ) 280 | ], 281 | ), 282 | ); 283 | } 284 | 285 | Widget getRiskStar(int currentIndex, int startCount){ 286 | return Image.asset(currentIndex < startCount? "assets/images/ic_star_full.png": "assets/images/ic_star_empty.png", width: 8, height: 8,); 287 | } 288 | 289 | Widget getProductData(){ 290 | return Container( 291 | height: 40, 292 | child: Stack( 293 | alignment: Alignment.centerLeft, 294 | children: [ 295 | Positioned( 296 | left: 16, 297 | child: Text("产品材料", style: TextStyle(fontSize: 14, color: Color(0xff333333)),), 298 | ), 299 | Positioned( 300 | right: 16, 301 | child: Image.asset("assets/images/ic_right_arrow.png", width: 7, height: 12,), 302 | ) 303 | ], 304 | ), 305 | ); 306 | } 307 | } 308 | -------------------------------------------------------------------------------- /lib/page/product/productDetail/publicProductDetail.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:htjf_flutter_app/model/config.dart'; 3 | import '../../../base/baseWidget.dart'; 4 | 5 | 6 | ///此页面隐藏掉baseAppBar,自定义一个类似于appBar的空间浮在上面,搞成沉浸式 7 | //总资产数量 8 | String _totalAsset = ""; 9 | //页面title 10 | String _pageTitle = ""; 11 | 12 | class PublicProductDetail extends BaseStatefulWidget { 13 | 14 | PublicProductDetail(totalAsset, pageTitle){ 15 | _totalAsset = totalAsset; 16 | _pageTitle = pageTitle; 17 | } 18 | 19 | @override 20 | State setBody() { 21 | return _PublicProductDetail(); 22 | } 23 | 24 | @override 25 | Config setConfig() { 26 | return Config(title: "", dismissAppBar: true); 27 | } 28 | } 29 | 30 | class _PublicProductDetail extends State with SingleTickerProviderStateMixin{ 31 | 32 | bool _isShow = false; 33 | TabController _tabController; 34 | PageController _pageController; 35 | 36 | @override 37 | void initState() { 38 | super.initState(); 39 | _pageController = PageController(initialPage: 0); 40 | _tabController = TabController(length: 2, vsync: this); 41 | _tabController.addListener((){ 42 | _pageController.animateToPage(_tabController.index, duration: Duration(milliseconds: 200), curve: Curves.ease); 43 | }); 44 | } 45 | 46 | @override 47 | Widget build(BuildContext context) { 48 | return Stack( 49 | children: [ 50 | NotificationListener( 51 | child: SingleChildScrollView( 52 | controller: ScrollController(), 53 | child: Column( 54 | children: [ 55 | getHeader(), 56 | getTabBar(), 57 | getPageView() 58 | ], 59 | ), 60 | ), 61 | onNotification: (ScrollNotification scrollNotification) { 62 | if (scrollNotification.metrics.axisDirection == AxisDirection.down && scrollNotification is ScrollEndNotification){ 63 | //只有在上下滚动且滚动到头或者底 才去做判断 64 | if (scrollNotification.metrics.extentAfter == 0){ 65 | //滚动到底部 66 | //ScrollView滚动到了底部 这个时候让listview可以滚动 67 | setState(() { 68 | _isShow = true; 69 | }); 70 | } 71 | if (scrollNotification.metrics.extentBefore == 0){ 72 | //滚动到顶部 73 | //这个时候禁止listview滚动事件, 让scrollview来滚动 74 | setState(() { 75 | _isShow = false; 76 | }); 77 | } 78 | } 79 | return true; 80 | } 81 | ), 82 | Offstage( 83 | offstage: !_isShow, 84 | child: Container( 85 | margin: EdgeInsets.only(top: 68), 86 | child: getTabBar(), 87 | ), 88 | ), 89 | Positioned( 90 | left: 0, 91 | right: 0, 92 | child: getAppBar(), 93 | ) 94 | ], 95 | ); 96 | } 97 | 98 | Widget getHeader(){ 99 | return Container( 100 | height: 282, 101 | color: Color(0xfff5f5f5), 102 | child: Stack( 103 | alignment: Alignment.topCenter, 104 | children: [ 105 | Positioned( 106 | child: Image.asset("assets/images/ic_header.png", height: 208, fit: BoxFit.fill,) 107 | ), 108 | Positioned( 109 | top: 82, 110 | child: Row( 111 | mainAxisAlignment: MainAxisAlignment.center, 112 | children: [ 113 | Text("总资产(元)", style: TextStyle(fontSize: 12, color: Color.fromARGB(127, 255, 255, 255)),), 114 | Container( 115 | margin: EdgeInsets.only(left: 10), 116 | child: Image.asset("assets/images/ic_tip_yellow.png", width: 12, height: 12, color: Colors.white,), 117 | ) 118 | ], 119 | ), 120 | ), 121 | Positioned( 122 | top: 111, 123 | child: Text(_totalAsset, style: TextStyle(fontSize: 30, fontWeight: FontWeight.bold, color: Colors.white),), 124 | ), 125 | Positioned( 126 | bottom: 0, 127 | left: 16, 128 | right: 16, 129 | child: Container( 130 | height: 118, 131 | decoration: BoxDecoration( 132 | color: Colors.white, 133 | borderRadius: BorderRadius.all(Radius.circular(5)) 134 | ), 135 | child: Stack( 136 | children: [ 137 | Positioned( 138 | top: 20, 139 | left: 60, 140 | child: Text("已持仓(元)", style: TextStyle(fontSize: 12, color: Color(0xff999999)),), 141 | ), 142 | Positioned( 143 | top: 20, 144 | left: 200, 145 | child: Text("待确认(元)", style: TextStyle(fontSize: 12, color: Color(0xff999999)),), 146 | ), 147 | Positioned( 148 | top: 43, 149 | left: 60, 150 | child: Text("+98,87", style: TextStyle(fontSize: 14, color: Color(0xff695a37)),), 151 | ), 152 | Positioned( 153 | top: 43, 154 | left: 200, 155 | child: Text("2098.00", style: TextStyle(fontSize: 14, color: Color(0xffd75e33)),), 156 | ), 157 | Align( 158 | alignment: Alignment.bottomCenter, 159 | child: Container( 160 | margin: EdgeInsets.only(left: 16, right: 16), 161 | decoration: BoxDecoration( 162 | border: Border(top: BorderSide(color: Color(0xfff5f5f5))) 163 | ), 164 | height: 45, 165 | child: Stack( 166 | alignment: Alignment.center, 167 | children: [ 168 | Positioned( 169 | left: 0, 170 | child: Image.asset("assets/images/ic_asset_profit.png", width: 14,), 171 | ), 172 | Positioned( 173 | left: 19, 174 | child: Text("资产证明", style: TextStyle(fontSize: 14, color: Color(0xff333333)),), 175 | ), 176 | Positioned( 177 | right: 0, 178 | child: Image.asset("assets/images/ic_right_triangle.png", width: 6,), 179 | ) 180 | ], 181 | ), 182 | ), 183 | ) 184 | ], 185 | ), 186 | ), 187 | ) 188 | ], 189 | ), 190 | ); 191 | } 192 | 193 | Widget getAppBar(){ 194 | return Container( 195 | padding: EdgeInsets.only(top: 23), 196 | color: _isShow? Colors.white: Colors.transparent, 197 | height: 68, 198 | child: Stack( 199 | alignment: Alignment.center, 200 | children: [ 201 | Positioned( 202 | left: 16, 203 | child: GestureDetector( 204 | child: Container( 205 | child: Image.asset("assets/images/ic_back_arrow.png", height: 20, color: getChangedColor(),), 206 | ), 207 | onTap: (){ 208 | Navigator.of(context).pop(); 209 | }, 210 | ), 211 | ), 212 | Positioned( 213 | child: Text(_pageTitle, style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold, color: getChangedColor())), 214 | ), 215 | Positioned( 216 | right: 16, 217 | child: Image.asset("assets/images/ic_detail.png", height: 12, width: 20, color: getChangedColor()), 218 | ) 219 | ], 220 | ), 221 | ); 222 | } 223 | 224 | Widget getTabBar(){ 225 | return Container( 226 | color: Color(0xfff5f5f5), 227 | padding: EdgeInsets.only(left: 60, right: 60), 228 | height: 45, 229 | child: TabBar( 230 | controller: _tabController, 231 | labelStyle: TextStyle(fontSize: 15, fontWeight: FontWeight.bold), 232 | unselectedLabelStyle: TextStyle(fontSize: 15, fontWeight: FontWeight.normal), 233 | labelColor: Color(0xff3c3c3c), 234 | indicatorColor: Colors.redAccent, 235 | tabs: [ 236 | Container( 237 | child: Text("已持仓资产"), 238 | ), 239 | Container( 240 | child: Text("待确认资产"), 241 | ) 242 | ], 243 | ), 244 | ); 245 | } 246 | 247 | Color getChangedColor(){ 248 | if (!_isShow){ 249 | return Colors.white; 250 | } else { 251 | return Colors.black; 252 | } 253 | } 254 | 255 | ScrollPhysics getScrollPhysics(bool isShow){ 256 | if (isShow){ 257 | return BouncingScrollPhysics(); 258 | } else { 259 | return NeverScrollableScrollPhysics(); 260 | } 261 | } 262 | 263 | Widget getPageView(){ 264 | return Container( 265 | //高度为屏幕的高度 266 | height: MediaQuery.of(context).size.height - 113, 267 | color: Color(0xfff5f5f5), 268 | child: PageView.builder( 269 | controller: _pageController, 270 | onPageChanged: (int index){ 271 | if (_tabController != null){ 272 | _tabController.animateTo(index); 273 | } 274 | }, 275 | itemCount: 2, 276 | itemBuilder: (BuildContext context, int index){ 277 | if (index == 0){ 278 | return ListView.builder( 279 | shrinkWrap: true, 280 | physics: getScrollPhysics(_isShow), 281 | itemBuilder: (BuildContext context, int index){ 282 | return getListItem(index); 283 | }, 284 | itemCount: 8, 285 | ); 286 | } else { 287 | return ListView.builder ( 288 | shrinkWrap: true, 289 | physics: getScrollPhysics(_isShow), 290 | itemBuilder: (BuildContext context, int index){ 291 | return getListItem(index); 292 | }, 293 | itemCount: 13, 294 | ); 295 | } 296 | } 297 | ) 298 | ); 299 | } 300 | 301 | Widget getListItem(int index){ 302 | return Container( 303 | margin: EdgeInsets.only(left: 16, right: 16, top: 10), 304 | padding: EdgeInsets.only(left: 16, right: 16, top: 20, bottom: 15), 305 | decoration: BoxDecoration( 306 | borderRadius: BorderRadius.all(Radius.circular(5)), 307 | color: Colors.white, 308 | ), 309 | child: Column( 310 | children: [ 311 | Container( 312 | margin: EdgeInsets.only(bottom: 12), 313 | child: Text("北京中泰项目北京中泰项目北京中泰项目北京中泰项目北京中泰项目北京中泰项目北京中泰项目北京中泰项目北京中泰项目北京中泰项目北京中泰项目北京中泰项目北京中泰项目北京中泰项目北京中泰项目北京中泰项目北京中泰项目北京中泰项目北京中泰项目", 314 | style: TextStyle(fontSize: 14, color: Color(0xff3c3c3c), fontWeight: FontWeight.bold), textAlign: TextAlign.center, maxLines: 2, overflow: TextOverflow.ellipsis,), 315 | ), 316 | getListItemChild("认购金额", "100,000,000.00万"), 317 | getListItemChild("成立日期", "2019-09-09"), 318 | getListItemChild("index", index.toString()), 319 | ], 320 | ), 321 | ); 322 | } 323 | 324 | Widget getListItemChild(String title, String value){ 325 | return Container( 326 | color: Color(0xfff5f5f5), 327 | padding: EdgeInsets.only(left: 8, right: 8), 328 | margin: EdgeInsets.only(top: 4), 329 | height: 28, 330 | child: Stack( 331 | alignment: Alignment.centerLeft, 332 | children: [ 333 | Text(title, style: TextStyle(color: Color(0xffa48e5f), fontSize: 12),), 334 | Align( 335 | alignment: Alignment.centerRight, 336 | child: Text(value, style: TextStyle(fontSize: 12, color: Color(0xff695a37)),), 337 | ) 338 | ], 339 | ), 340 | ); 341 | } 342 | } 343 | -------------------------------------------------------------------------------- /lib/page/product/productPage/privateProduct.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_swiper/flutter_swiper.dart'; 3 | import '../../../base/baseWidget.dart'; 4 | import '../../details/bannerDetail.dart'; 5 | import '../../../model/PrivateProductModel.dart'; 6 | import '../../product/productDetail/privateProductDetail.dart'; 7 | import '../../../base/baseUiWidget.dart' as baseUI; 8 | 9 | class PrivateProduct extends StatefulWidget { 10 | @override 11 | _PrivateProduct createState() { 12 | return _PrivateProduct(); 13 | } 14 | } 15 | 16 | class _PrivateProduct extends State { 17 | final List bannerList = new List(); 18 | final List recommendList = new List(); 19 | final List hotProductList = new List(); 20 | BuildContext buildContext; 21 | 22 | @override 23 | void initState() { 24 | // TODO: implement initState 25 | super.initState(); 26 | bannerList 27 | ..add( 28 | "https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1815325960,1420769943&fm=26&gp=0.jpg") 29 | ..add( 30 | "https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=1798815788,2155743867&fm=26&gp=0.jpg") 31 | ..add( 32 | "https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=1891676854,3495265304&fm=26&gp=0.jpg"); 33 | 34 | recommendList 35 | ..add(new RecommendModel( 36 | "人气产品", "1.1197", "单位净值", "04-19", "(春华68号)琅琊3号母基金")) 37 | ..add(new RecommendModel( 38 | "把握新经济", "4.3445", "最新净值", "11-14", "(春华68号)琅琊3号母基金 (春华68号)琅琊3号母基金")) 39 | ..add(new RecommendModel( 40 | "CTA策划", "5.13537", "万份收益", "06-09", "(春华68号)琅琊3号母基金")) 41 | ..add(new RecommendModel( 42 | "琅琊母基金", "9.4667", "累计净值", "08-25", "(春华68号)琅琊3号母基金")); 43 | 44 | hotProductList 45 | ..add(HotProductModel( 46 | productName: "(DZ银杏40号)恒天财富稳1号第一次开放", 47 | productType: "灵活配置", 48 | value: "1.1130", 49 | valueType: "单位净值", 50 | data: "04-19", 51 | type: ["期限短", "流动性强", "定期开放"])) 52 | ..add(HotProductModel( 53 | productName: "(DZ银杏40号)恒天财富稳1号第一次开放", 54 | productType: "股权投资", 55 | value: "1.1130", 56 | valueType: "单位净值", 57 | data: "04-19", 58 | type: ["期限短", "流动性强", "定期开放"])) 59 | ..add(HotProductModel( 60 | productName: "(DZ银杏40号)恒天财富稳1号第一次开放", 61 | productType: "百亿私募", 62 | value: "1.1130", 63 | valueType: "单位净值", 64 | data: "04-19", 65 | type: ["期限短", "流动性强", "定期开放"])) 66 | ..add(HotProductModel( 67 | productName: "(DZ银杏40号)恒天财富稳1号第一次开放", 68 | productType: "灵活配置", 69 | value: "1.1130", 70 | valueType: "单位净值", 71 | data: "04-19", 72 | type: ["期限短", "流动性强", "定期开放"])); 73 | } 74 | 75 | @override 76 | Widget build(BuildContext context) { 77 | buildContext = context; 78 | return SingleChildScrollView( 79 | child: Column( 80 | children: [ 81 | getBanner(), 82 | getFunctionArea(), 83 | baseUI.BaseUIWidget().getDividerLineMargin(), 84 | baseUI.BaseUIWidget().getTitle("精品推荐"), 85 | getRecommendArea(), 86 | baseUI.BaseUIWidget().getDividerLineMargin(), 87 | baseUI.BaseUIWidget().getTitle("猜你喜欢"), 88 | getLikeArea(), 89 | baseUI.BaseUIWidget().getDividerLineMargin(), 90 | baseUI.BaseUIWidget().getTitle("热门私募"), 91 | getHotProductArea() 92 | ], 93 | ), 94 | ); 95 | } 96 | 97 | Widget getBanner() { 98 | return Container( 99 | margin: EdgeInsets.only(left: 16.0, top: 16.0, right: 16.0), 100 | height: 80.0, 101 | child: ClipRRect( 102 | borderRadius: BorderRadius.all(Radius.circular(10.0)), 103 | child: Swiper( 104 | itemCount: bannerList.length, 105 | itemBuilder: (BuildContext context, int index) { 106 | return GestureDetector( 107 | child: Image.network(bannerList[index], fit: BoxFit.fill), 108 | onTap: () { 109 | switchNextPage(context, BannerDetail(bannerList[index])); 110 | }, 111 | ); 112 | }, 113 | autoplay: true, 114 | autoplayDelay: 2000, 115 | autoplayDisableOnInteraction: true, 116 | duration: 500, 117 | controller: SwiperController(), 118 | plugins: [], 119 | ), 120 | ), 121 | ); 122 | } 123 | 124 | Widget getFunctionArea() { 125 | return Container( 126 | height: 70.0, 127 | margin: EdgeInsets.only(left: 16.0, top: 16.0, right: 16.0), 128 | child: Row( 129 | children: [ 130 | Expanded(child: Image.asset("assets/images/iv_private_market.png")), 131 | Container( 132 | width: 12.0, 133 | ), 134 | Expanded(child: Image.asset("assets/images/iv_video.png")) 135 | ], 136 | ), 137 | ); 138 | } 139 | 140 | //精品推荐 141 | Widget getRecommendArea() { 142 | return Container( 143 | margin: EdgeInsets.only(top: 16.0), 144 | height: 151.0, 145 | child: ListView.builder( 146 | itemCount: recommendList.length, 147 | itemBuilder: (BuildContext context, int index) { 148 | return getRecommendItem(recommendList[index]); 149 | }, 150 | scrollDirection: Axis.horizontal, 151 | )); 152 | } 153 | 154 | Widget getRecommendItem(RecommendModel model) { 155 | return GestureDetector( 156 | onTap: () { 157 | switchNextPage( 158 | buildContext, 159 | PrivateProductDetail(PrivateProductModel( 160 | productTitle: model.desc, 161 | productCode: "003274", 162 | achievementValue: [ 163 | AchievementValueModel("100万(含)-300万", "7.2%"), 164 | AchievementValueModel("300万(含)-500万", "8.2%"), 165 | AchievementValueModel("500万(含)以上", "9.5%"), 166 | ]))); 167 | }, 168 | child: Container( 169 | width: 136.0, 170 | margin: EdgeInsets.only(left: 16.0), 171 | child: ClipRRect( 172 | borderRadius: BorderRadius.all(Radius.circular(10.0)), 173 | child: Container( 174 | color: Color(0xfff8f8f8), 175 | child: Column( 176 | children: [ 177 | Container( 178 | margin: EdgeInsets.only(top: 12), 179 | child: Text(model.productName, 180 | textAlign: TextAlign.left, 181 | style: TextStyle( 182 | fontSize: 14, 183 | color: Color(0xff333333), 184 | fontWeight: FontWeight.bold)), 185 | ), 186 | Container( 187 | margin: EdgeInsets.only(top: 15), 188 | child: Text( 189 | model.value, 190 | textAlign: TextAlign.left, 191 | style: TextStyle( 192 | fontSize: 18, 193 | color: Color(0xff333333), 194 | fontWeight: FontWeight.bold), 195 | ), 196 | ), 197 | Container( 198 | child: Text( 199 | model.valueType + "(" + model.data + ")", 200 | style: TextStyle(fontSize: 10, color: Color(0xff7d7c7d)), 201 | textAlign: TextAlign.left, 202 | ), 203 | ), 204 | Container( 205 | margin: EdgeInsets.only(left: 12, top: 13, right: 12), 206 | child: Text( 207 | model.desc, 208 | style: TextStyle(fontSize: 12, color: Color(0xff7d7c7d)), 209 | overflow: TextOverflow.ellipsis, 210 | maxLines: 2, 211 | textAlign: TextAlign.left, 212 | ), 213 | ) 214 | ], 215 | ), 216 | )), 217 | ), 218 | ); 219 | } 220 | 221 | Widget getLikeArea() { 222 | return GestureDetector( 223 | onTap: () { 224 | switchNextPage( 225 | buildContext, 226 | PrivateProductDetail(PrivateProductModel( 227 | productTitle: "新手推荐产品", 228 | productCode: "003274", 229 | achievementValue: [ 230 | AchievementValueModel("100万(含)-300万", "7.2%"), 231 | AchievementValueModel("300万(含)-500万", "8.2%"), 232 | AchievementValueModel("500万(含)以上", "9.5%"), 233 | ]))); 234 | }, 235 | child: Container( 236 | height: 80, 237 | margin: EdgeInsets.only(left: 16, right: 16, top: 16), 238 | child: Stack( 239 | children: [ 240 | Image.asset("assets/images/iv_guest_like.png", fit: BoxFit.fill), 241 | Positioned( 242 | left: 18, 243 | top: 13, 244 | child: Text("尊敬的王先生", 245 | style: TextStyle(fontSize: 16, color: Colors.white)), 246 | ), 247 | Positioned( 248 | left: 18, 249 | bottom: 13, 250 | child: Container( 251 | padding: EdgeInsets.only(left: 5, right: 5, top: 3, bottom: 3), 252 | color: Color(0xffDFB379), 253 | child: Text("适合您的产品在这里", 254 | style: TextStyle(fontSize: 13, color: Colors.white)), 255 | ), 256 | ) 257 | ], 258 | )), 259 | ); 260 | } 261 | 262 | Widget getHotProductArea() { 263 | return ListView.builder( 264 | shrinkWrap: true, 265 | physics: NeverScrollableScrollPhysics(), 266 | itemCount: hotProductList.length, 267 | scrollDirection: Axis.vertical, 268 | itemBuilder: (BuildContext context, int index) { 269 | return getHotProductItem(hotProductList[index]); 270 | }); 271 | } 272 | 273 | Widget getHotProductItem(HotProductModel model) { 274 | return GestureDetector( 275 | onTap: () { 276 | switchNextPage( 277 | buildContext, 278 | PrivateProductDetail(PrivateProductModel( 279 | productTitle: model.productName, 280 | productCode: "003274", 281 | achievementValue: [ 282 | AchievementValueModel("100万(含)-300万", "7.2%"), 283 | AchievementValueModel("300万(含)-500万", "8.2%"), 284 | AchievementValueModel("500万(含)以上", "9.5%"), 285 | ]))); 286 | }, 287 | child: Container( 288 | margin: EdgeInsets.only(left: 16, right: 16, top: 16), 289 | height: 103, 290 | child: ClipRRect( 291 | borderRadius: BorderRadius.all(Radius.circular(10)), 292 | child: Container( 293 | color: Color(0xfff8f8f8), 294 | child: Stack( 295 | children: [ 296 | Positioned( 297 | child: Image.asset("assets/images/icon_tip_red.png"), 298 | ), 299 | Positioned( 300 | left: 14, 301 | child: Text( 302 | model.productType, 303 | style: TextStyle(fontSize: 15, color: Colors.white), 304 | ), 305 | ), 306 | Positioned( 307 | left: 10, 308 | top: 40, 309 | child: Text(model.value, 310 | style: TextStyle( 311 | fontSize: 18, 312 | color: Color(0xff222222), 313 | fontWeight: FontWeight.bold)), 314 | ), 315 | Positioned( 316 | top: 40, 317 | left: 110, 318 | right: 16, 319 | child: Text(model.productName, 320 | maxLines: 1, 321 | overflow: TextOverflow.ellipsis, 322 | style: TextStyle(fontSize: 16, color: Color(0xff222222))), 323 | ), 324 | Positioned( 325 | left: 8, 326 | bottom: 16, 327 | child: Text(model.valueType + "(" + model.data + ")", 328 | style: TextStyle(fontSize: 12, color: Color(0xff999999))), 329 | ), 330 | Positioned( 331 | height: 20, 332 | left: 112, 333 | bottom: 15, 334 | child: ListView.builder( 335 | shrinkWrap: true, 336 | physics: NeverScrollableScrollPhysics(), 337 | scrollDirection: Axis.horizontal, 338 | itemCount: model.type.length, 339 | itemBuilder: (context, index) { 340 | return Container( 341 | margin: EdgeInsets.only(left: 5), 342 | decoration: BoxDecoration( 343 | border: 344 | Border.all(color: Color(0xffDFB379), width: 1), 345 | borderRadius: BorderRadius.all(Radius.circular(3))), 346 | padding: EdgeInsets.only(left: 3, right: 3), 347 | child: Text(model.type[index], 348 | style: TextStyle( 349 | fontSize: 12, color: Color(0xffDFB379))), 350 | ); 351 | }), 352 | ) 353 | ], 354 | ), 355 | ), 356 | ), 357 | ) 358 | ); 359 | } 360 | } 361 | 362 | class RecommendModel { 363 | RecommendModel( 364 | this.productName, this.value, this.valueType, this.data, this.desc); 365 | 366 | String productName; 367 | String value; 368 | String valueType; 369 | String data; 370 | String desc; 371 | } 372 | 373 | class HotProductModel { 374 | HotProductModel( 375 | {Key key, 376 | this.productName, 377 | this.productType, 378 | this.value, 379 | this.valueType, 380 | this.data, 381 | this.type}); 382 | 383 | String productName; 384 | String productType; 385 | String value; 386 | String valueType; 387 | String data; 388 | List type; 389 | } 390 | -------------------------------------------------------------------------------- /lib/page/product/productPage/productPage.dart: -------------------------------------------------------------------------------- 1 | import '../../../base/baseWidget.dart'; 2 | import 'package:flutter/material.dart'; 3 | import '../../../model/config.dart'; 4 | import 'package:htjf_flutter_app/page/product/productPage/privateProduct.dart'; 5 | import 'package:htjf_flutter_app/page/product/productPage/publicProduct.dart'; 6 | 7 | 8 | class ProductPage extends BaseStatefulWidget { 9 | @override 10 | Config setConfig() { 11 | return Config( 12 | title: "产品", 13 | dismissAppBar: true 14 | ); 15 | } 16 | 17 | @override 18 | State setBody() { 19 | return bodyWidget(); 20 | } 21 | } 22 | 23 | class bodyWidget extends State with SingleTickerProviderStateMixin { 24 | //tabview的controller 25 | TabController _tabController; 26 | //pageview的controller 27 | PageController _pageController; 28 | 29 | @override 30 | void initState() { 31 | super.initState(); 32 | _tabController = TabController(length: 2, vsync: this); 33 | _tabController.addListener((){ 34 | //添加tabview的监听 35 | pageChange(_tabController.index, true); 36 | }); 37 | //下方的pageView的controller 38 | _pageController = PageController(initialPage: 0); 39 | } 40 | 41 | @override 42 | Widget build(BuildContext context) { 43 | return Column( 44 | children: [getTabView(), getPageView()], 45 | ); 46 | } 47 | 48 | void pageChange(int currentPage, bool isTabViewChange){ 49 | if (isTabViewChange){ 50 | //如果是tabview切换 则让下方的pageView联动 51 | _pageController.animateToPage(currentPage, duration: Duration(milliseconds: 200), curve: Curves.ease); 52 | } else { 53 | //如果是pageivew切换 则让上方的tabview联动 54 | _tabController..animateTo(currentPage, duration: Duration(milliseconds: 200), curve: Curves.ease); 55 | } 56 | } 57 | 58 | Widget getTabView() { 59 | return Container( 60 | margin: EdgeInsets.only(top: 30.0, left: 90, right: 90), 61 | child: TabBar( 62 | labelColor: Color(0xffE7B17C), 63 | labelStyle: TextStyle(fontWeight: FontWeight.bold, fontSize: 20), 64 | unselectedLabelColor: Colors.black, 65 | unselectedLabelStyle: TextStyle(fontWeight: FontWeight.normal, fontSize: 16), 66 | indicatorSize: TabBarIndicatorSize.label, 67 | indicatorColor: Color(0xffE7B17C), 68 | tabs: [ 69 | Container( 70 | padding: EdgeInsets.only(top: 5, bottom: 5), 71 | child: Text("私募"), 72 | ), 73 | Container( 74 | padding: EdgeInsets.only(top: 5, bottom: 5), 75 | child: Text("公募"), 76 | ) 77 | ], 78 | controller: _tabController, 79 | ), 80 | ); 81 | } 82 | 83 | Widget getPageView() { 84 | return Expanded( 85 | child: PageView.builder( 86 | itemCount: 2, 87 | itemBuilder: (BuildContext context, int index) { 88 | //第一页是私募 第二页是公募 89 | if(0 == index){ 90 | return PrivateProduct(); 91 | } else { 92 | return PublicProduct(); 93 | } 94 | }, 95 | controller: _pageController, 96 | onPageChanged: (int index) { 97 | pageChange(index, false); 98 | }, 99 | ), 100 | ); 101 | } 102 | } 103 | 104 | -------------------------------------------------------------------------------- /lib/page/product/productPage/publicProduct.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_swiper/flutter_swiper.dart'; 3 | import '../../../base/baseWidget.dart'; 4 | import '../../details/bannerDetail.dart'; 5 | import '../../../base/baseUiWidget.dart' as BaseUI; 6 | import '../../details/newsDetail.dart'; 7 | 8 | class PublicProduct extends StatefulWidget { 9 | @override 10 | _PublicProduct createState() { 11 | return _PublicProduct(); 12 | } 13 | } 14 | 15 | class _PublicProduct extends State { 16 | final List bannerList = new List(); 17 | final List goodFundList = new List(); 18 | final List fundNewInfoList = new List(); 19 | final List fundReportInfoList = new List(); 20 | 21 | @override 22 | void initState() { 23 | // TODO: implement initState 24 | super.initState(); 25 | bannerList 26 | ..add( 27 | "https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1815325960,1420769943&fm=26&gp=0.jpg") 28 | ..add( 29 | "https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=1798815788,2155743867&fm=26&gp=0.jpg") 30 | ..add( 31 | "https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=1891676854,3495265304&fm=26&gp=0.jpg"); 32 | 33 | goodFundList 34 | ..add(new GoodFundModel( 35 | productName: "天天货币A(100135)", 36 | valueType: "近一年涨幅", 37 | value: "3.45%", 38 | riskList: ["1000元起投", "中风险"])) 39 | ..add(new GoodFundModel( 40 | productName: "招商安达灵活配置混合(002103)", 41 | valueType: "近十年涨幅", 42 | value: "-5.45%", 43 | riskList: ["100000元起投", "高风险"])) 44 | ..add(new GoodFundModel( 45 | productName: "金鹰主题优势混合(210005)", 46 | valueType: "近两年涨幅", 47 | value: "6.87%", 48 | riskList: ["6000元起投", "中风险"])) 49 | ..add(new GoodFundModel( 50 | productName: "景顺长城内需增长贰号混合…", 51 | valueType: "近三个月涨幅", 52 | value: "12.09%", 53 | riskList: ["1000元起投", "中低风险"])) 54 | ..add(new GoodFundModel( 55 | productName: "金鹰主题优势混合(210005)", 56 | valueType: "近半年涨幅", 57 | value: "-45%", 58 | riskList: ["1000元起投", "中高风险"])); 59 | 60 | fundNewInfoList 61 | ..add(new FundInfoModel( 62 | title: "国海证券,三种技术风格融为一体,你该如何抉择,标题两行展示标题两行展示标题两行展示标题两行展示标题两…", 63 | type: "基金观点", 64 | data: "2019-10-03")) 65 | ..add(new FundInfoModel( 66 | title: "国海证券,三种技术风格融为一体。", type: "基金观点", data: "2019-10-03")) 67 | ..add(new FundInfoModel( 68 | title: "国海证券,三种技术风格融为一体,你该如何抉择,标题两行展示标题两行展示标题两行展示标题两行展示标题两…", 69 | type: "基金观点", 70 | data: "2019-10-03")) 71 | ..add(new FundInfoModel( 72 | title: "国海证券,三种技术风格融为一体,你该如何抉择,标题两行展示标题两行展示标题两行展示标题两行展示标题两…", 73 | type: "基金观点", 74 | data: "2019-10-03")) 75 | ..add(new FundInfoModel( 76 | title: "国海证券,三种技术风格融为一体。", type: "基金观点", data: "2019-10-03")); 77 | 78 | fundReportInfoList 79 | ..add( 80 | new FundInfoModel(title: "公募基金市场业绩周回顾(2019年15期)", data: "2019-10-03")) 81 | ..add( 82 | new FundInfoModel(title: "公募基金市场业绩周回顾(2019年15期)", data: "2019-10-03")) 83 | ..add( 84 | new FundInfoModel(title: "公募基金市场业绩周回顾(2019年15期)", data: "2019-10-03")) 85 | ..add( 86 | new FundInfoModel(title: "公募基金市场业绩周回顾(2019年15期)", data: "2019-10-03")) 87 | ..add(new FundInfoModel( 88 | title: "公募基金市场业绩周回顾(2019年15期)", data: "2019-10-03")); 89 | } 90 | 91 | @override 92 | Widget build(BuildContext context) { 93 | // TODO: implement build 94 | return SingleChildScrollView( 95 | child: Column( 96 | children: [ 97 | getBanner(), 98 | getFunctionArea(), 99 | BaseUI.BaseUIWidget().getDividerLineMargin(), 100 | BaseUI.BaseUIWidget().getTitle("优选基金"), 101 | getGoodFund(), 102 | BaseUI.BaseUIWidget().getDividerLineMargin(), 103 | BaseUI.BaseUIWidget().getTitle("基金时讯"), 104 | getFundInfo(fundNewInfoList), 105 | BaseUI.BaseUIWidget().getDividerLineMargin(), 106 | BaseUI.BaseUIWidget().getTitle("基金研报"), 107 | getFundInfo(fundReportInfoList), 108 | ], 109 | ), 110 | ); 111 | } 112 | 113 | Widget getBanner() { 114 | return Container( 115 | margin: EdgeInsets.only(left: 16.0, top: 16.0, right: 16.0), 116 | height: 80.0, 117 | child: ClipRRect( 118 | borderRadius: BorderRadius.all(Radius.circular(10.0)), 119 | child: Swiper( 120 | itemCount: bannerList.length, 121 | itemBuilder: (BuildContext context, int index) { 122 | return GestureDetector( 123 | child: Image.network(bannerList[index], fit: BoxFit.fill), 124 | onTap: (){ 125 | switchNextPage(context, BannerDetail(bannerList[index])); 126 | }, 127 | ); 128 | }, 129 | autoplay: true, 130 | autoplayDelay: 2000, 131 | autoplayDisableOnInteraction: true, 132 | duration: 500, 133 | controller: SwiperController(), 134 | plugins: [], 135 | ), 136 | ), 137 | ); 138 | } 139 | 140 | Widget getFunctionArea() { 141 | return Container( 142 | margin: EdgeInsets.only(top: 20, left: 16, right: 16), 143 | child: Row( 144 | children: [ 145 | Expanded( 146 | child: Column( 147 | children: [ 148 | Image.asset("assets/images/icon_public_rank.png", 149 | width: 30, height: 30), 150 | Container( 151 | margin: EdgeInsets.only(top: 2), 152 | child: Text("基金排行", 153 | style: 154 | TextStyle(fontSize: 12, color: Color(0xff222222)))) 155 | ], 156 | ), 157 | ), 158 | Expanded( 159 | child: Column( 160 | children: [ 161 | Image.asset("assets/images/icon_public_grad.png", 162 | width: 30, height: 30), 163 | Container( 164 | margin: EdgeInsets.only(top: 2), 165 | child: Text("基金评级", 166 | style: 167 | TextStyle(fontSize: 12, color: Color(0xff222222)))) 168 | ], 169 | ), 170 | ), 171 | Expanded( 172 | child: Column( 173 | children: [ 174 | Image.asset("assets/images/icon_new_public.png", 175 | width: 30, height: 30), 176 | Container( 177 | margin: EdgeInsets.only(top: 2), 178 | child: Text("新发基金", 179 | style: 180 | TextStyle(fontSize: 12, color: Color(0xff222222)))) 181 | ], 182 | ), 183 | ), 184 | Expanded( 185 | child: Column( 186 | children: [ 187 | Image.asset("assets/images/icon_selected_public.png", 188 | width: 30, height: 30), 189 | Container( 190 | margin: EdgeInsets.only(top: 2), 191 | child: Text("自选基金", 192 | style: 193 | TextStyle(fontSize: 12, color: Color(0xff222222)))) 194 | ], 195 | ), 196 | ), 197 | Expanded( 198 | child: Column( 199 | children: [ 200 | Image.asset("assets/images/icon_public_education.png", 201 | width: 30, height: 30), 202 | Container( 203 | margin: EdgeInsets.only(top: 2), 204 | child: Text("财商教育", 205 | style: 206 | TextStyle(fontSize: 12, color: Color(0xff222222)))) 207 | ], 208 | ), 209 | ) 210 | ], 211 | ), 212 | ); 213 | } 214 | 215 | Widget getGoodFund() { 216 | return Container( 217 | child: ListView.builder( 218 | shrinkWrap: true, 219 | physics: NeverScrollableScrollPhysics(), 220 | itemCount: goodFundList.length, 221 | itemBuilder: (BuildContext context, int index) { 222 | return getGoodFundItem(goodFundList[index], index); 223 | }), 224 | ); 225 | } 226 | 227 | Widget getGoodFundItem(GoodFundModel model, int index) { 228 | return Container( 229 | height: 76, 230 | margin: EdgeInsets.only(left: 16, right: 16), 231 | decoration: BoxDecoration( 232 | border: index == goodFundList.length - 1 233 | ? null 234 | : Border(bottom: BorderSide(color: Color(0xffeeeeee)))), 235 | child: Stack( 236 | children: [ 237 | Positioned( 238 | top: 16, 239 | child: Text(model.value, 240 | style: TextStyle( 241 | color: model.value.substring(0, 1) == "-" 242 | ? Colors.green 243 | : Colors.red, 244 | fontSize: 21, 245 | fontWeight: FontWeight.bold)), 246 | ), 247 | Positioned( 248 | left: 109, 249 | top: 18, 250 | child: Text(model.productName, 251 | maxLines: 1, 252 | overflow: TextOverflow.ellipsis, 253 | style: TextStyle(color: Color(0xff222222), fontSize: 15)), 254 | ), 255 | Positioned( 256 | bottom: 16, 257 | child: Text(model.valueType, 258 | maxLines: 1, 259 | overflow: TextOverflow.ellipsis, 260 | style: TextStyle(color: Color(0xff999999), fontSize: 12)), 261 | ), 262 | Positioned( 263 | height: 20, 264 | bottom: 14, 265 | left: 109, 266 | child: ListView.builder( 267 | shrinkWrap: true, 268 | physics: NeverScrollableScrollPhysics(), 269 | scrollDirection: Axis.horizontal, 270 | itemCount: model.riskList.length, 271 | itemBuilder: (BuildContext context, int index) { 272 | return Container( 273 | margin: EdgeInsets.only(right: 4), 274 | child: Text(model.riskList[index], 275 | style: 276 | TextStyle(color: Color(0xff999999), fontSize: 12)), 277 | ); 278 | }), 279 | ) 280 | ], 281 | ), 282 | ); 283 | } 284 | 285 | Widget getFundInfo(List list) { 286 | return Container( 287 | margin: EdgeInsets.only(left: 16, right: 16), 288 | child: ListView.builder( 289 | shrinkWrap: true, 290 | physics: NeverScrollableScrollPhysics(), 291 | itemCount: list.length, 292 | itemBuilder: (BuildContext context, int index) { 293 | return getFundInfoItem(list, index); 294 | }), 295 | ); 296 | } 297 | 298 | Widget getFundInfoItem(List list, int index) { 299 | FundInfoModel model = list[index]; 300 | String desc; 301 | if (model.type != null && model.type.isNotEmpty) { 302 | desc = model.type + " " + model.data; 303 | } else { 304 | desc = model.data; 305 | } 306 | return GestureDetector( 307 | child: Container( 308 | decoration: BoxDecoration( 309 | border: index == list.length - 1 310 | ? null 311 | : Border(bottom: BorderSide(color: Color(0xffeeeeee)))), 312 | child: Container( 313 | padding: EdgeInsets.only(top: 16, bottom: 12), 314 | child: Column( 315 | children: [ 316 | Container( 317 | alignment: Alignment.centerLeft, 318 | child: Text( 319 | model.title, 320 | maxLines: 2, 321 | overflow: TextOverflow.ellipsis, 322 | style: TextStyle(fontSize: 14, color: Color(0xff222222)), 323 | ), 324 | ) 325 | , 326 | Container( 327 | margin: EdgeInsets.only(top: 12), 328 | alignment: Alignment.centerLeft, 329 | child: Text( 330 | desc, 331 | style: TextStyle(fontSize: 12, color: Color(0xff999999)), 332 | ), 333 | ) 334 | ], 335 | ), 336 | ), 337 | ), 338 | onTap: (){ 339 | switchNextPage(context, NewsDetail("http://www.jnlc.com/article/20191012248576.shtml")); 340 | }, 341 | ); 342 | } 343 | } 344 | 345 | class GoodFundModel { 346 | GoodFundModel( 347 | {Key key, this.productName, this.valueType, this.value, this.riskList}); 348 | 349 | String productName; 350 | String value; 351 | String valueType; 352 | List riskList; 353 | } 354 | 355 | class FundInfoModel { 356 | FundInfoModel({Key key, this.title, this.type, this.data}); 357 | 358 | String title; 359 | String type; 360 | String data; 361 | } 362 | -------------------------------------------------------------------------------- /lib/utils/utils.dart: -------------------------------------------------------------------------------- 1 | 2 | class Utils{ 3 | 4 | 5 | } -------------------------------------------------------------------------------- /pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | analyzer: 5 | dependency: transitive 6 | description: 7 | name: analyzer 8 | url: "https://pub.flutter-io.cn" 9 | source: hosted 10 | version: "0.38.5" 11 | args: 12 | dependency: transitive 13 | description: 14 | name: args 15 | url: "https://pub.flutter-io.cn" 16 | source: hosted 17 | version: "1.5.2" 18 | async: 19 | dependency: transitive 20 | description: 21 | name: async 22 | url: "https://pub.flutter-io.cn" 23 | source: hosted 24 | version: "2.2.0" 25 | boolean_selector: 26 | dependency: transitive 27 | description: 28 | name: boolean_selector 29 | url: "https://pub.flutter-io.cn" 30 | source: hosted 31 | version: "1.0.4" 32 | build: 33 | dependency: transitive 34 | description: 35 | name: build 36 | url: "https://pub.flutter-io.cn" 37 | source: hosted 38 | version: "1.2.0" 39 | build_config: 40 | dependency: transitive 41 | description: 42 | name: build_config 43 | url: "https://pub.flutter-io.cn" 44 | source: hosted 45 | version: "0.4.1+1" 46 | build_daemon: 47 | dependency: transitive 48 | description: 49 | name: build_daemon 50 | url: "https://pub.flutter-io.cn" 51 | source: hosted 52 | version: "2.1.0" 53 | build_resolvers: 54 | dependency: transitive 55 | description: 56 | name: build_resolvers 57 | url: "https://pub.flutter-io.cn" 58 | source: hosted 59 | version: "1.1.1" 60 | build_runner: 61 | dependency: "direct main" 62 | description: 63 | name: build_runner 64 | url: "https://pub.flutter-io.cn" 65 | source: hosted 66 | version: "1.7.1" 67 | build_runner_core: 68 | dependency: transitive 69 | description: 70 | name: build_runner_core 71 | url: "https://pub.flutter-io.cn" 72 | source: hosted 73 | version: "4.1.0" 74 | built_collection: 75 | dependency: transitive 76 | description: 77 | name: built_collection 78 | url: "https://pub.flutter-io.cn" 79 | source: hosted 80 | version: "4.2.2" 81 | built_value: 82 | dependency: transitive 83 | description: 84 | name: built_value 85 | url: "https://pub.flutter-io.cn" 86 | source: hosted 87 | version: "6.7.1" 88 | charcode: 89 | dependency: transitive 90 | description: 91 | name: charcode 92 | url: "https://pub.flutter-io.cn" 93 | source: hosted 94 | version: "1.1.2" 95 | checked_yaml: 96 | dependency: transitive 97 | description: 98 | name: checked_yaml 99 | url: "https://pub.flutter-io.cn" 100 | source: hosted 101 | version: "1.0.2" 102 | code_builder: 103 | dependency: transitive 104 | description: 105 | name: code_builder 106 | url: "https://pub.flutter-io.cn" 107 | source: hosted 108 | version: "3.2.0" 109 | collection: 110 | dependency: transitive 111 | description: 112 | name: collection 113 | url: "https://pub.flutter-io.cn" 114 | source: hosted 115 | version: "1.14.11" 116 | convert: 117 | dependency: transitive 118 | description: 119 | name: convert 120 | url: "https://pub.flutter-io.cn" 121 | source: hosted 122 | version: "2.1.1" 123 | crypto: 124 | dependency: transitive 125 | description: 126 | name: crypto 127 | url: "https://pub.flutter-io.cn" 128 | source: hosted 129 | version: "2.1.3" 130 | csslib: 131 | dependency: transitive 132 | description: 133 | name: csslib 134 | url: "https://pub.flutter-io.cn" 135 | source: hosted 136 | version: "0.16.1" 137 | cupertino_icons: 138 | dependency: "direct main" 139 | description: 140 | name: cupertino_icons 141 | url: "https://pub.flutter-io.cn" 142 | source: hosted 143 | version: "0.1.2" 144 | dart_style: 145 | dependency: transitive 146 | description: 147 | name: dart_style 148 | url: "https://pub.flutter-io.cn" 149 | source: hosted 150 | version: "1.3.1" 151 | fixnum: 152 | dependency: transitive 153 | description: 154 | name: fixnum 155 | url: "https://pub.flutter-io.cn" 156 | source: hosted 157 | version: "0.10.9" 158 | fl_chart: 159 | dependency: "direct main" 160 | description: 161 | name: fl_chart 162 | url: "https://pub.flutter-io.cn" 163 | source: hosted 164 | version: "0.3.3" 165 | flutter: 166 | dependency: "direct main" 167 | description: flutter 168 | source: sdk 169 | version: "0.0.0" 170 | flutter_page_indicator: 171 | dependency: transitive 172 | description: 173 | name: flutter_page_indicator 174 | url: "https://pub.flutter-io.cn" 175 | source: hosted 176 | version: "0.0.3" 177 | flutter_swiper: 178 | dependency: "direct main" 179 | description: 180 | name: flutter_swiper 181 | url: "https://pub.flutter-io.cn" 182 | source: hosted 183 | version: "1.1.6" 184 | flutter_test: 185 | dependency: "direct dev" 186 | description: flutter 187 | source: sdk 188 | version: "0.0.0" 189 | front_end: 190 | dependency: transitive 191 | description: 192 | name: front_end 193 | url: "https://pub.flutter-io.cn" 194 | source: hosted 195 | version: "0.1.27" 196 | glob: 197 | dependency: transitive 198 | description: 199 | name: glob 200 | url: "https://pub.flutter-io.cn" 201 | source: hosted 202 | version: "1.1.7" 203 | graphs: 204 | dependency: transitive 205 | description: 206 | name: graphs 207 | url: "https://pub.flutter-io.cn" 208 | source: hosted 209 | version: "0.2.0" 210 | html: 211 | dependency: transitive 212 | description: 213 | name: html 214 | url: "https://pub.flutter-io.cn" 215 | source: hosted 216 | version: "0.14.0+3" 217 | http: 218 | dependency: transitive 219 | description: 220 | name: http 221 | url: "https://pub.flutter-io.cn" 222 | source: hosted 223 | version: "0.12.0+2" 224 | http_multi_server: 225 | dependency: transitive 226 | description: 227 | name: http_multi_server 228 | url: "https://pub.flutter-io.cn" 229 | source: hosted 230 | version: "2.1.0" 231 | http_parser: 232 | dependency: transitive 233 | description: 234 | name: http_parser 235 | url: "https://pub.flutter-io.cn" 236 | source: hosted 237 | version: "3.1.3" 238 | io: 239 | dependency: transitive 240 | description: 241 | name: io 242 | url: "https://pub.flutter-io.cn" 243 | source: hosted 244 | version: "0.3.3" 245 | js: 246 | dependency: transitive 247 | description: 248 | name: js 249 | url: "https://pub.flutter-io.cn" 250 | source: hosted 251 | version: "0.6.1+1" 252 | json_annotation: 253 | dependency: "direct main" 254 | description: 255 | name: json_annotation 256 | url: "https://pub.flutter-io.cn" 257 | source: hosted 258 | version: "3.0.0" 259 | json_serializable: 260 | dependency: "direct main" 261 | description: 262 | name: json_serializable 263 | url: "https://pub.flutter-io.cn" 264 | source: hosted 265 | version: "3.2.2" 266 | kernel: 267 | dependency: transitive 268 | description: 269 | name: kernel 270 | url: "https://pub.flutter-io.cn" 271 | source: hosted 272 | version: "0.3.27" 273 | logging: 274 | dependency: transitive 275 | description: 276 | name: logging 277 | url: "https://pub.flutter-io.cn" 278 | source: hosted 279 | version: "0.11.3+2" 280 | matcher: 281 | dependency: transitive 282 | description: 283 | name: matcher 284 | url: "https://pub.flutter-io.cn" 285 | source: hosted 286 | version: "0.12.5" 287 | meta: 288 | dependency: transitive 289 | description: 290 | name: meta 291 | url: "https://pub.flutter-io.cn" 292 | source: hosted 293 | version: "1.1.6" 294 | mime: 295 | dependency: transitive 296 | description: 297 | name: mime 298 | url: "https://pub.flutter-io.cn" 299 | source: hosted 300 | version: "0.9.6+3" 301 | oktoast: 302 | dependency: "direct main" 303 | description: 304 | name: oktoast 305 | url: "https://pub.flutter-io.cn" 306 | source: hosted 307 | version: "2.2.0" 308 | package_config: 309 | dependency: transitive 310 | description: 311 | name: package_config 312 | url: "https://pub.flutter-io.cn" 313 | source: hosted 314 | version: "1.1.0" 315 | package_resolver: 316 | dependency: transitive 317 | description: 318 | name: package_resolver 319 | url: "https://pub.flutter-io.cn" 320 | source: hosted 321 | version: "1.0.10" 322 | path: 323 | dependency: transitive 324 | description: 325 | name: path 326 | url: "https://pub.flutter-io.cn" 327 | source: hosted 328 | version: "1.6.2" 329 | pedantic: 330 | dependency: transitive 331 | description: 332 | name: pedantic 333 | url: "https://pub.flutter-io.cn" 334 | source: hosted 335 | version: "1.7.0" 336 | pool: 337 | dependency: transitive 338 | description: 339 | name: pool 340 | url: "https://pub.flutter-io.cn" 341 | source: hosted 342 | version: "1.4.0" 343 | pub_semver: 344 | dependency: transitive 345 | description: 346 | name: pub_semver 347 | url: "https://pub.flutter-io.cn" 348 | source: hosted 349 | version: "1.4.2" 350 | pubspec_parse: 351 | dependency: transitive 352 | description: 353 | name: pubspec_parse 354 | url: "https://pub.flutter-io.cn" 355 | source: hosted 356 | version: "0.1.5" 357 | quiver: 358 | dependency: transitive 359 | description: 360 | name: quiver 361 | url: "https://pub.flutter-io.cn" 362 | source: hosted 363 | version: "2.0.3" 364 | shelf: 365 | dependency: transitive 366 | description: 367 | name: shelf 368 | url: "https://pub.flutter-io.cn" 369 | source: hosted 370 | version: "0.7.5" 371 | shelf_web_socket: 372 | dependency: transitive 373 | description: 374 | name: shelf_web_socket 375 | url: "https://pub.flutter-io.cn" 376 | source: hosted 377 | version: "0.2.3" 378 | sky_engine: 379 | dependency: transitive 380 | description: flutter 381 | source: sdk 382 | version: "0.0.99" 383 | source_gen: 384 | dependency: transitive 385 | description: 386 | name: source_gen 387 | url: "https://pub.flutter-io.cn" 388 | source: hosted 389 | version: "0.9.4+5" 390 | source_span: 391 | dependency: transitive 392 | description: 393 | name: source_span 394 | url: "https://pub.flutter-io.cn" 395 | source: hosted 396 | version: "1.5.5" 397 | stack_trace: 398 | dependency: transitive 399 | description: 400 | name: stack_trace 401 | url: "https://pub.flutter-io.cn" 402 | source: hosted 403 | version: "1.9.3" 404 | stream_channel: 405 | dependency: transitive 406 | description: 407 | name: stream_channel 408 | url: "https://pub.flutter-io.cn" 409 | source: hosted 410 | version: "2.0.0" 411 | stream_transform: 412 | dependency: transitive 413 | description: 414 | name: stream_transform 415 | url: "https://pub.flutter-io.cn" 416 | source: hosted 417 | version: "0.0.19" 418 | string_scanner: 419 | dependency: transitive 420 | description: 421 | name: string_scanner 422 | url: "https://pub.flutter-io.cn" 423 | source: hosted 424 | version: "1.0.4" 425 | term_glyph: 426 | dependency: transitive 427 | description: 428 | name: term_glyph 429 | url: "https://pub.flutter-io.cn" 430 | source: hosted 431 | version: "1.1.0" 432 | test_api: 433 | dependency: transitive 434 | description: 435 | name: test_api 436 | url: "https://pub.flutter-io.cn" 437 | source: hosted 438 | version: "0.2.5" 439 | timing: 440 | dependency: transitive 441 | description: 442 | name: timing 443 | url: "https://pub.flutter-io.cn" 444 | source: hosted 445 | version: "0.1.1+2" 446 | transformer_page_view: 447 | dependency: transitive 448 | description: 449 | name: transformer_page_view 450 | url: "https://pub.flutter-io.cn" 451 | source: hosted 452 | version: "0.1.6" 453 | typed_data: 454 | dependency: transitive 455 | description: 456 | name: typed_data 457 | url: "https://pub.flutter-io.cn" 458 | source: hosted 459 | version: "1.1.6" 460 | vector_math: 461 | dependency: transitive 462 | description: 463 | name: vector_math 464 | url: "https://pub.flutter-io.cn" 465 | source: hosted 466 | version: "2.0.8" 467 | watcher: 468 | dependency: transitive 469 | description: 470 | name: watcher 471 | url: "https://pub.flutter-io.cn" 472 | source: hosted 473 | version: "0.9.7+12" 474 | web_socket_channel: 475 | dependency: transitive 476 | description: 477 | name: web_socket_channel 478 | url: "https://pub.flutter-io.cn" 479 | source: hosted 480 | version: "1.0.15" 481 | webview_flutter: 482 | dependency: "direct main" 483 | description: 484 | name: webview_flutter 485 | url: "https://pub.flutter-io.cn" 486 | source: hosted 487 | version: "0.3.14+1" 488 | yaml: 489 | dependency: transitive 490 | description: 491 | name: yaml 492 | url: "https://pub.flutter-io.cn" 493 | source: hosted 494 | version: "2.2.0" 495 | sdks: 496 | dart: ">=2.3.0 <3.0.0" 497 | flutter: ">=1.5.0 <2.0.0" 498 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: htjf_flutter_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 | 27 | oktoast: ^2.1.7 28 | 29 | flutter_swiper : ^1.1.6 30 | 31 | fl_chart: ^0.3.3 32 | 33 | json_annotation: ^3.0.0 34 | 35 | build_runner: ^1.0.0 36 | 37 | json_serializable: ^3.2.0 38 | 39 | webview_flutter: ^0.3.3+1 40 | 41 | dev_dependencies: 42 | 43 | flutter_test: 44 | sdk: flutter 45 | 46 | 47 | # For information on the generic Dart part of this file, see the 48 | # following page: https://dart.dev/tools/pub/pubspec 49 | 50 | # The following section is specific to Flutter. 51 | flutter: 52 | 53 | # The following line ensures that the Material Icons font is 54 | # included with your application, so that you can use the icons in 55 | # the material Icons class. 56 | uses-material-design: true 57 | assets: 58 | - assets/images/ 59 | - assets/mock/ 60 | 61 | # To add assets to your application, add an assets section, like this: 62 | # assets: 63 | # - images/a_dot_burr.jpeg 64 | # - images/a_dot_ham.jpeg 65 | 66 | # An image asset can refer to one or more resolution-specific "variants", see 67 | # https://flutter.dev/assets-and-images/#resolution-aware. 68 | 69 | # For details regarding adding assets from package dependencies, see 70 | # https://flutter.dev/assets-and-images/#from-packages 71 | 72 | # To add custom fonts to your application, add a fonts section here, 73 | # in this "flutter" section. Each entry in this list should have a 74 | # "family" key with the font family name, and a "fonts" key with a 75 | # list giving the asset and other descriptors for the font. For 76 | # example: 77 | # fonts: 78 | # - family: Schyler 79 | # fonts: 80 | # - asset: fonts/Schyler-Regular.ttf 81 | # - asset: fonts/Schyler-Italic.ttf 82 | # style: italic 83 | # - family: Trajan Pro 84 | # fonts: 85 | # - asset: fonts/TrajanPro.ttf 86 | # - asset: fonts/TrajanPro_Bold.ttf 87 | # weight: 700 88 | # 89 | # For details regarding fonts from package dependencies, 90 | # see https://flutter.dev/custom-fonts/#from-packages 91 | -------------------------------------------------------------------------------- /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:htjf_flutter_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 | --------------------------------------------------------------------------------