├── .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 |
--------------------------------------------------------------------------------