├── .github
└── FUNDING.yml
├── .gitignore
├── .metadata
├── LICENSE
├── README.md
├── android
├── .gitignore
├── app
│ ├── build.gradle
│ └── src
│ │ ├── debug
│ │ └── AndroidManifest.xml
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ ├── kotlin
│ │ │ └── com
│ │ │ │ └── xuexiang
│ │ │ │ └── flutter_template
│ │ │ │ └── MainActivity.kt
│ │ └── 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
│ │ │ ├── strings.xml
│ │ │ └── styles.xml
│ │ └── profile
│ │ └── AndroidManifest.xml
├── build.gradle
├── gradle.properties
├── gradle
│ └── wrapper
│ │ └── gradle-wrapper.properties
└── settings.gradle
├── assets
└── fonts
│ └── iconfont.ttf
├── i18n
├── en-US.json
└── zh-CN.json
├── i18nconfig.json
├── ios
├── .gitignore
├── Flutter
│ ├── .last_build_id
│ ├── AppFrameworkInfo.plist
│ ├── Debug.xcconfig
│ └── Release.xcconfig
├── Podfile
├── Podfile.lock
├── Runner.xcodeproj
│ ├── project.pbxproj
│ ├── project.xcworkspace
│ │ └── contents.xcworkspacedata
│ └── xcshareddata
│ │ └── xcschemes
│ │ └── Runner.xcscheme
├── Runner.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
└── Runner
│ ├── AppDelegate.swift
│ ├── Assets.xcassets
│ ├── AppIcon.appiconset
│ │ ├── Contents.json
│ │ ├── Icon-App-1024x1024@1x.png
│ │ ├── Icon-App-20x20@1x.png
│ │ ├── Icon-App-20x20@2x.png
│ │ ├── Icon-App-20x20@3x.png
│ │ ├── Icon-App-29x29@1x.png
│ │ ├── Icon-App-29x29@2x.png
│ │ ├── Icon-App-29x29@3x.png
│ │ ├── Icon-App-40x40@1x.png
│ │ ├── Icon-App-40x40@2x.png
│ │ ├── Icon-App-40x40@3x.png
│ │ ├── Icon-App-60x60@2x.png
│ │ ├── Icon-App-60x60@3x.png
│ │ ├── Icon-App-76x76@1x.png
│ │ ├── Icon-App-76x76@2x.png
│ │ └── Icon-App-83.5x83.5@2x.png
│ └── LaunchImage.imageset
│ │ ├── Contents.json
│ │ ├── LaunchImage.png
│ │ ├── LaunchImage@2x.png
│ │ ├── LaunchImage@3x.png
│ │ └── README.md
│ ├── Base.lproj
│ ├── LaunchScreen.storyboard
│ └── Main.storyboard
│ ├── Info.plist
│ ├── Runner-Bridging-Header.h
│ └── zh-Hans.lproj
│ ├── LaunchScreen.strings
│ └── Main.strings
├── lib
├── core
│ ├── http
│ │ └── http.dart
│ ├── utils
│ │ ├── click.dart
│ │ ├── event.dart
│ │ ├── locale.dart
│ │ ├── path.dart
│ │ ├── privacy.dart
│ │ ├── toast.dart
│ │ ├── utils.dart
│ │ ├── xuifont.dart
│ │ └── xupdate.dart
│ └── widget
│ │ ├── grid
│ │ └── grid_item.dart
│ │ ├── list
│ │ ├── article_item.dart
│ │ ├── list_item.dart
│ │ └── sample_list_item.dart
│ │ ├── loading_dialog.dart
│ │ └── web_view_page.dart
├── generated
│ └── i18n.dart
├── init
│ ├── app_init.dart
│ ├── default_app.dart
│ └── splash.dart
├── main.dart
├── page
│ ├── home
│ │ └── tab_home.dart
│ ├── index.dart
│ └── menu
│ │ ├── about.dart
│ │ ├── language.dart
│ │ ├── login.dart
│ │ ├── menu_drawer.dart
│ │ ├── register.dart
│ │ ├── settings.dart
│ │ ├── sponsor.dart
│ │ └── theme_color.dart
├── router
│ ├── route_map.dart
│ └── router.dart
└── utils
│ ├── provider.dart
│ └── sputils.dart
├── pubspec.yaml
└── test
└── widget_test.dart
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | custom: https://github.com/xuexiangjys/Resource/blob/master/doc/sponsor.md
4 |
--------------------------------------------------------------------------------
/.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 | pubspec.lock
32 | .flutter-plugins-dependencies
33 |
34 | # Android related
35 | **/android/**/gradle-wrapper.jar
36 | **/android/.gradle
37 | **/android/captures/
38 | **/android/gradlew
39 | **/android/gradlew.bat
40 | **/android/local.properties
41 | **/android/**/GeneratedPluginRegistrant.java
42 | **/android/keystores/
43 |
44 | # iOS/XCode related
45 | **/ios/**/*.mode1v3
46 | **/ios/**/*.mode2v3
47 | **/ios/**/*.moved-aside
48 | **/ios/**/*.pbxuser
49 | **/ios/**/*.perspectivev3
50 | **/ios/**/*sync/
51 | **/ios/**/.sconsign.dblite
52 | **/ios/**/.tags*
53 | **/ios/**/.vagrant/
54 | **/ios/**/DerivedData/
55 | **/ios/**/Icon?
56 | **/ios/**/Pods/
57 | **/ios/**/.symlinks/
58 | **/ios/**/profile
59 | **/ios/**/xcuserdata
60 | **/ios/.generated/
61 | **/ios/Flutter/App.framework
62 | **/ios/Flutter/Flutter.framework
63 | **/ios/Flutter/Generated.xcconfig
64 | **/ios/Flutter/app.flx
65 | **/ios/Flutter/app.zip
66 | **/ios/Flutter/flutter_assets/
67 | **/ios/Flutter/flutter_export_environment.sh
68 | **/ios/ServiceDefinitions.json
69 | **/ios/Runner/GeneratedPluginRegistrant.*
70 |
71 | # Exceptions to above rules.
72 | !**/ios/**/default.mode1v3
73 | !**/ios/**/default.mode2v3
74 | !**/ios/**/default.pbxuser
75 | !**/ios/**/default.perspectivev3
76 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
77 |
--------------------------------------------------------------------------------
/.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: fabeb2a16f1d008ab8230f450c49141d35669798
8 | channel: beta
9 |
10 | project_type: app
11 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction, and
10 | distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by the copyright
13 | owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all other entities
16 | that control, are controlled by, or are under common control with that entity.
17 | For the purposes of this definition, "control" means (i) the power, direct or
18 | indirect, to cause the direction or management of such entity, whether by
19 | contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the
20 | outstanding shares, or (iii) beneficial ownership of such entity.
21 |
22 | "You" (or "Your") shall mean an individual or Legal Entity exercising
23 | permissions granted by this License.
24 |
25 | "Source" form shall mean the preferred form for making modifications, including
26 | but not limited to software source code, documentation source, and configuration
27 | files.
28 |
29 | "Object" form shall mean any form resulting from mechanical transformation or
30 | translation of a Source form, including but not limited to compiled object code,
31 | generated documentation, and conversions to other media types.
32 |
33 | "Work" shall mean the work of authorship, whether in Source or Object form, made
34 | available under the License, as indicated by a copyright notice that is included
35 | in or attached to the work (an example is provided in the Appendix below).
36 |
37 | "Derivative Works" shall mean any work, whether in Source or Object form, that
38 | is based on (or derived from) the Work and for which the editorial revisions,
39 | annotations, elaborations, or other modifications represent, as a whole, an
40 | original work of authorship. For the purposes of this License, Derivative Works
41 | shall not include works that remain separable from, or merely link (or bind by
42 | name) to the interfaces of, the Work and Derivative Works thereof.
43 |
44 | "Contribution" shall mean any work of authorship, including the original version
45 | of the Work and any modifications or additions to that Work or Derivative Works
46 | thereof, that is intentionally submitted to Licensor for inclusion in the Work
47 | by the copyright owner or by an individual or Legal Entity authorized to submit
48 | on behalf of the copyright owner. For the purposes of this definition,
49 | "submitted" means any form of electronic, verbal, or written communication sent
50 | to the Licensor or its representatives, including but not limited to
51 | communication on electronic mailing lists, source code control systems, and
52 | issue tracking systems that are managed by, or on behalf of, the Licensor for
53 | the purpose of discussing and improving the Work, but excluding communication
54 | that is conspicuously marked or otherwise designated in writing by the copyright
55 | owner as "Not a Contribution."
56 |
57 | "Contributor" shall mean Licensor and any individual or Legal Entity on behalf
58 | of whom a Contribution has been received by Licensor and subsequently
59 | incorporated within the Work.
60 |
61 | 2. Grant of Copyright License.
62 |
63 | Subject to the terms and conditions of this License, each Contributor hereby
64 | grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
65 | irrevocable copyright license to reproduce, prepare Derivative Works of,
66 | publicly display, publicly perform, sublicense, and distribute the Work and such
67 | Derivative Works in Source or Object form.
68 |
69 | 3. Grant of Patent License.
70 |
71 | Subject to the terms and conditions of this License, each Contributor hereby
72 | grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
73 | irrevocable (except as stated in this section) patent license to make, have
74 | made, use, offer to sell, sell, import, and otherwise transfer the Work, where
75 | such license applies only to those patent claims licensable by such Contributor
76 | that are necessarily infringed by their Contribution(s) alone or by combination
77 | of their Contribution(s) with the Work to which such Contribution(s) was
78 | submitted. If You institute patent litigation against any entity (including a
79 | cross-claim or counterclaim in a lawsuit) alleging that the Work or a
80 | Contribution incorporated within the Work constitutes direct or contributory
81 | patent infringement, then any patent licenses granted to You under this License
82 | for that Work shall terminate as of the date such litigation is filed.
83 |
84 | 4. Redistribution.
85 |
86 | You may reproduce and distribute copies of the Work or Derivative Works thereof
87 | in any medium, with or without modifications, and in Source or Object form,
88 | provided that You meet the following conditions:
89 |
90 | You must give any other recipients of the Work or Derivative Works a copy of
91 | this License; and
92 | You must cause any modified files to carry prominent notices stating that You
93 | changed the files; and
94 | You must retain, in the Source form of any Derivative Works that You distribute,
95 | all copyright, patent, trademark, and attribution notices from the Source form
96 | of the Work, excluding those notices that do not pertain to any part of the
97 | Derivative Works; and
98 | If the Work includes a "NOTICE" text file as part of its distribution, then any
99 | Derivative Works that You distribute must include a readable copy of the
100 | attribution notices contained within such NOTICE file, excluding those notices
101 | that do not pertain to any part of the Derivative Works, in at least one of the
102 | following places: within a NOTICE text file distributed as part of the
103 | Derivative Works; within the Source form or documentation, if provided along
104 | with the Derivative Works; or, within a display generated by the Derivative
105 | Works, if and wherever such third-party notices normally appear. The contents of
106 | the NOTICE file are for informational purposes only and do not modify the
107 | License. You may add Your own attribution notices within Derivative Works that
108 | You distribute, alongside or as an addendum to the NOTICE text from the Work,
109 | provided that such additional attribution notices cannot be construed as
110 | modifying the License.
111 | You may add Your own copyright statement to Your modifications and may provide
112 | additional or different license terms and conditions for use, reproduction, or
113 | distribution of Your modifications, or for any such Derivative Works as a whole,
114 | provided Your use, reproduction, and distribution of the Work otherwise complies
115 | with the conditions stated in this License.
116 |
117 | 5. Submission of Contributions.
118 |
119 | Unless You explicitly state otherwise, any Contribution intentionally submitted
120 | for inclusion in the Work by You to the Licensor shall be under the terms and
121 | conditions of this License, without any additional terms or conditions.
122 | Notwithstanding the above, nothing herein shall supersede or modify the terms of
123 | any separate license agreement you may have executed with Licensor regarding
124 | such Contributions.
125 |
126 | 6. Trademarks.
127 |
128 | This License does not grant permission to use the trade names, trademarks,
129 | service marks, or product names of the Licensor, except as required for
130 | reasonable and customary use in describing the origin of the Work and
131 | reproducing the content of the NOTICE file.
132 |
133 | 7. Disclaimer of Warranty.
134 |
135 | Unless required by applicable law or agreed to in writing, Licensor provides the
136 | Work (and each Contributor provides its Contributions) on an "AS IS" BASIS,
137 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
138 | including, without limitation, any warranties or conditions of TITLE,
139 | NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
140 | solely responsible for determining the appropriateness of using or
141 | redistributing the Work and assume any risks associated with Your exercise of
142 | permissions under this License.
143 |
144 | 8. Limitation of Liability.
145 |
146 | In no event and under no legal theory, whether in tort (including negligence),
147 | contract, or otherwise, unless required by applicable law (such as deliberate
148 | and grossly negligent acts) or agreed to in writing, shall any Contributor be
149 | liable to You for damages, including any direct, indirect, special, incidental,
150 | or consequential damages of any character arising as a result of this License or
151 | out of the use or inability to use the Work (including but not limited to
152 | damages for loss of goodwill, work stoppage, computer failure or malfunction, or
153 | any and all other commercial damages or losses), even if such Contributor has
154 | been advised of the possibility of such damages.
155 |
156 | 9. Accepting Warranty or Additional Liability.
157 |
158 | While redistributing the Work or Derivative Works thereof, You may choose to
159 | offer, and charge a fee for, acceptance of support, warranty, indemnity, or
160 | other liability obligations and/or rights consistent with this License. However,
161 | in accepting such obligations, You may act only on Your own behalf and on Your
162 | sole responsibility, not on behalf of any other Contributor, and only if You
163 | agree to indemnify, defend, and hold each Contributor harmless for any liability
164 | incurred by, or claims asserted against, such Contributor by reason of your
165 | accepting any such warranty or additional liability.
166 |
167 | END OF TERMS AND CONDITIONS
168 |
169 | APPENDIX: How to apply the Apache License to your work
170 |
171 | To apply the Apache License to your work, attach the following boilerplate
172 | notice, with the fields enclosed by brackets "{}" replaced with your own
173 | identifying information. (Don't include the brackets!) The text should be
174 | enclosed in the appropriate comment syntax for the file format. We also
175 | recommend that a file or class name and description of purpose be included on
176 | the same "printed page" as the copyright notice for easier identification within
177 | third-party archives.
178 |
179 | Copyright 2020 xuexiangjys
180 |
181 | Licensed under the Apache License, Version 2.0 (the "License");
182 | you may not use this file except in compliance with the License.
183 | You may obtain a copy of the License at
184 |
185 | http://www.apache.org/licenses/LICENSE-2.0
186 |
187 | Unless required by applicable law or agreed to in writing, software
188 | distributed under the License is distributed on an "AS IS" BASIS,
189 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
190 | See the License for the specific language governing permissions and
191 | limitations under the License.
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # flutter_template
2 |
3 | Flutter空壳模板工程,已搭建基础框架,实现国际化、主题换肤、登录注册等功能,可在此基础上简单修改实现自己的应用功能。
4 |
5 | ## 关于我
6 |
7 | | 公众号 | 掘金 | 知乎 | CSDN | 简书 | 思否 | 哔哩哔哩 | 今日头条
8 | |---------|---------|--------- |---------|---------|---------|---------|---------|
9 | | [我的Android开源之旅](https://s1.ax1x.com/2022/04/27/LbG8yt.png) | [点我](https://juejin.im/user/598feef55188257d592e56ed/posts) | [点我](https://www.zhihu.com/people/xuexiangjys/posts) | [点我](https://xuexiangjys.blog.csdn.net/) | [点我](https://www.jianshu.com/u/6bf605575337) | [点我](https://segmentfault.com/u/xuexiangjys) | [点我](https://space.bilibili.com/483850585) | [点我](https://img.rruu.net/image/5ff34ff7b02dd)
10 |
11 | ## 效果
12 |
13 | 
14 |
15 | ## Star趋势图
16 |
17 | [](https://starchart.cc/xuexiangjys/flutter_template)
18 |
19 | ## 视频教程
20 |
21 | * [Flutter模板工程入门介绍](https://www.bilibili.com/video/BV1854y1W7hB)
22 |
23 | * [Flutter模板工程使用详解](https://www.bilibili.com/video/BV13N411d73X)
24 |
25 | * [Flutter系列视频教程](https://space.bilibili.com/483850585/channel/detail?cid=168279)
26 |
27 | ## 运行
28 |
29 | * 查看一下版本号是否正确, 要求flutter的版本是`2.x.x`的版本。
30 |
31 | ```
32 | flutter --version
33 | ```
34 |
35 | 这里推荐的flutter版本为`2.0.6`, 下载地址如下:
36 |
37 | * [windows_2.0.6-stable](https://storage.googleapis.com/flutter_infra_release/releases/stable/windows/flutter_windows_2.0.6-stable.zip)
38 | * [macos_2.0.6-stable](https://storage.googleapis.com/flutter_infra_release/releases/stable/macos/flutter_macos_2.0.6-stable.zip)
39 |
40 | **【注意】** 如果你的flutter版本是`1.x.x`版本,那么请将你的flutter版本进行升级,或者使用`flutter/1.0`的分支。
41 |
42 | * 运行以下命令查看是否需要安装其它依赖项来完成安装
43 | ```
44 | flutter doctor
45 | ```
46 |
47 | * 运行启动您的应用
48 | ```
49 | flutter packages get
50 | flutter run
51 | ```
52 |
53 | ## 项目集成介绍
54 |
55 | > 本项目精选了目前Flutter最实用的几个库,可大大提高开发的效率。
56 |
57 | * [flutter_i18n(国际化插件)](https://marketplace.visualstudio.com/items?itemName=esskar.vscode-flutter-i18n-json)
58 | * [GetX(路由、状态管理工具)](https://pub.dev/packages/get)
59 | * [cached_network_image (网络缓存图片)](https://pub.dev/packages/cached_network_image)
60 | * [dio (非常好用的网络请求库)](https://pub.dev/packages/dio)
61 | * [event_bus (事件工具)](https://pub.dev/packages/event_bus)
62 | * [flutter_easyrefresh (刷新组件)](https://pub.dev/packages/flutter_easyrefresh)
63 | * [flutter_webview_plugin (网页加载)](https://pub.dev/packages/flutter_webview_plugin)
64 | * [flutter_spinkit (loading加载动画)](https://pub.dev/packages/flutter_spinkit)
65 | * [flutter_swiper (轮播图组件)](https://pub.dev/packages/flutter_swiper)
66 | * [flutter_xupdate (应用版本更新)](https://pub.dev/packages/flutter_xupdate)
67 | * [oktoast](https://pub.dev/packages/oktoast)
68 | * [path_provider (路径)](https://pub.dev/packages/path_provider)
69 | * [package_info (应用包信息)](https://pub.dev/packages/url_launcher)
70 | * [permission_handler 权限申请](https://pub.dev/packages/permission_handler)
71 | * [provider (非常好用的数据共享工具)](https://pub.dev/packages/provider)
72 | * [share (分享)](https://pub.dev/packages/share)
73 | * [shared_preferences](https://pub.dev/packages/shared_preferences)
74 | * [url_launcher (链接处理)](https://pub.dev/packages/url_launcher)
75 |
76 | ## 使用指南
77 |
78 | 1.克隆项目
79 |
80 | ```
81 | git clone https://github.com/xuexiangjys/flutter_template.git
82 | ```
83 |
84 | 2.修改项目名(文件夹名),并删除目录下的.git文件夹(隐藏文件)
85 |
86 | 3.使用AS或者VSCode打开项目,然后分别修改flutter、Android、ios项目的包名、应用ID以及应用名等信息。
87 |
88 | 最简单的替换方法就是进行全局替换,搜索关键字`flutter_template`,然后替换你想要的项目包名,如下图所示:
89 |
90 | 
91 |
92 | ### Flutter目录修改
93 |
94 | * 修改项目根目录`pubspec.yaml`文件, 修改项目名、描述、版本等信息。
95 |
96 | 
97 |
98 | 【注意】这里修改完`pubspec.yaml`中的`name`属性后,flutter项目的包名将会修改,这里我推荐大家使用全局替换的方式修改比较快。例如我想要修改`name`为`flutter_app`,在VSCode中你可以选择`lib`文件夹之后右击,选择`在文件夹中寻找`, 进行全局替换:
99 |
100 | 
101 |
102 | * 修改`lib/core/http/http.dart`中的网络请求配置,包括:服务器地址、超时、拦截器等设置
103 |
104 | * 修改`lib/core/utils/privacy.dart`中隐私服务政策地址
105 |
106 | * 修改`lib/core/utils/xupdate.dart`中版本更新检查的地址
107 |
108 |
109 | ### Android目录修改
110 |
111 | * 修改android目录下的包名。
112 |
113 | 在VSCode中你可以选择`android`文件夹之后右击,选择`在文件夹中寻找`, 进行全局替换。
114 |
115 | 
116 |
117 | 【注意】修改包名之后,记住需要将存放`MainActivity.kt`类的文件夹名也一并修改,否则将会找不到类。
118 |
119 | * 修改应用ID。修改`android/app/build.gradle`文件中的`applicationId`
120 |
121 | * 修改应用名。修改`android/app/src/main/res/values/strings.xml`文件中的`app_name`
122 |
123 | ### IOS目录修改
124 |
125 | ios修改相对简单,直接使用XCode打开ios目录进行修改即可。如下图所示:
126 |
127 | 
128 |
129 | 
130 |
131 |
132 | ## 更新插件版本
133 |
134 | ```
135 | flutter packages upgrade
136 | flutter pub outdated
137 | flutter pub upgrade --major-versions
138 | ```
139 |
140 | ---
141 |
142 | ## 如果觉得项目还不错,可以考虑打赏一波
143 |
144 | > 你的打赏是我维护的动力,我将会列出所有打赏人员的清单在下方作为凭证,打赏前请留下打赏项目的备注!
145 |
146 | 
147 |
148 | ## 微信公众号
149 |
150 | > 更多资讯内容,欢迎扫描关注我的个人微信公众号:【我的Android开源之旅】
151 |
152 | 
153 |
154 |
--------------------------------------------------------------------------------
/android/.gitignore:
--------------------------------------------------------------------------------
1 | gradle-wrapper.jar
2 | /.gradle
3 | /captures/
4 | /gradlew
5 | /gradlew.bat
6 | /local.properties
7 | GeneratedPluginRegistrant.java
8 |
--------------------------------------------------------------------------------
/android/app/build.gradle:
--------------------------------------------------------------------------------
1 | def localProperties = new Properties()
2 | def localPropertiesFile = rootProject.file('local.properties')
3 | if (localPropertiesFile.exists()) {
4 | localPropertiesFile.withReader('UTF-8') { reader ->
5 | localProperties.load(reader)
6 | }
7 | }
8 |
9 | def flutterRoot = localProperties.getProperty('flutter.sdk')
10 | if (flutterRoot == null) {
11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
12 | }
13 |
14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
15 | if (flutterVersionCode == null) {
16 | flutterVersionCode = '1'
17 | }
18 |
19 | def flutterVersionName = localProperties.getProperty('flutter.versionName')
20 | if (flutterVersionName == null) {
21 | flutterVersionName = '1.0'
22 | }
23 |
24 | apply plugin: 'com.android.application'
25 | apply plugin: 'kotlin-android'
26 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
27 |
28 | android {
29 | compileSdkVersion 28
30 |
31 | sourceSets {
32 | main.java.srcDirs += 'src/main/kotlin'
33 | }
34 |
35 | lintOptions {
36 | disable 'InvalidPackage'
37 | }
38 |
39 | defaultConfig {
40 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
41 | applicationId "com.xuexiang.flutter_template"
42 | minSdkVersion 16
43 | targetSdkVersion 28
44 | versionCode flutterVersionCode.toInteger()
45 | versionName flutterVersionName
46 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
47 | }
48 |
49 | buildTypes {
50 | release {
51 | // TODO: Add your own signing config for the release build.
52 | // Signing with the debug keys for now, so `flutter run --release` works.
53 | signingConfig signingConfigs.debug
54 | }
55 | }
56 | }
57 |
58 | flutter {
59 | source '../..'
60 | }
61 |
62 | dependencies {
63 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
64 | testImplementation 'junit:junit:4.12'
65 | androidTestImplementation 'androidx.test:runner:1.1.1'
66 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
67 | }
68 |
--------------------------------------------------------------------------------
/android/app/src/debug/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
8 |
12 |
19 |
23 |
27 |
32 |
36 |
37 |
38 |
39 |
40 |
41 |
43 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/com/xuexiang/flutter_template/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package com.xuexiang.flutter_template
2 |
3 | import androidx.annotation.NonNull;
4 | import io.flutter.embedding.android.FlutterActivity
5 | import io.flutter.embedding.engine.FlutterEngine
6 | import io.flutter.plugins.GeneratedPluginRegistrant
7 |
8 | class MainActivity: FlutterActivity() {
9 | override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
10 | GeneratedPluginRegistrant.registerWith(flutterEngine);
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xuexiangjys/flutter_template/85177b1ba88820161420725d69327cb931fb822a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xuexiangjys/flutter_template/85177b1ba88820161420725d69327cb931fb822a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xuexiangjys/flutter_template/85177b1ba88820161420725d69327cb931fb822a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xuexiangjys/flutter_template/85177b1ba88820161420725d69327cb931fb822a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xuexiangjys/flutter_template/85177b1ba88820161420725d69327cb931fb822a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | flutter_template
3 |
4 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/android/app/src/profile/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/build.gradle:
--------------------------------------------------------------------------------
1 | buildscript {
2 | ext.kotlin_version = '1.3.50'
3 | repositories {
4 | google { url 'https://maven.aliyun.com/repository/google' }
5 | jcenter { url 'https://maven.aliyun.com/repository/jcenter' }
6 | }
7 |
8 | dependencies {
9 | classpath 'com.android.tools.build:gradle:3.5.0'
10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
11 | }
12 | }
13 |
14 | allprojects {
15 | repositories {
16 | google { url 'https://maven.aliyun.com/repository/google' }
17 | jcenter { url 'https://maven.aliyun.com/repository/jcenter' }
18 | }
19 | }
20 |
21 | rootProject.buildDir = '../build'
22 | subprojects {
23 | project.buildDir = "${rootProject.buildDir}/${project.name}"
24 | }
25 | subprojects {
26 | project.evaluationDependsOn(':app')
27 | }
28 |
29 | task clean(type: Delete) {
30 | delete rootProject.buildDir
31 | }
32 |
--------------------------------------------------------------------------------
/android/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx1536M
2 | android.enableR8=true
3 | android.useAndroidX=true
4 | android.enableJetifier=true
5 |
--------------------------------------------------------------------------------
/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-5.6.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/fonts/iconfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xuexiangjys/flutter_template/85177b1ba88820161420725d69327cb931fb822a/assets/fonts/iconfont.ttf
--------------------------------------------------------------------------------
/i18n/en-US.json:
--------------------------------------------------------------------------------
1 | {
2 | "title": "Flutter Template",
3 | "login": "Login",
4 | "logout": "Logout",
5 | "loginName": "LoginName",
6 | "loginNameHint": "Please enter your login name or email",
7 | "loginNameError": "LoginName cannot be empty!",
8 | "password": "Password",
9 | "passwordHint": "Please enter your password",
10 | "passwordError": "Password cannot be less than 6 digits!",
11 | "loginSuccess": "Login Success",
12 | "register": "Register",
13 | "repeatPassword": "Repeat Password",
14 | "registerSuccess": "Register Success",
15 | "settings": "Settings",
16 | "theme": "Theme",
17 | "language": "Language",
18 | "chinese": "Chinese",
19 | "english": "English",
20 | "auto": "Auto",
21 | "about": "About",
22 | "versionName": "Version",
23 | "author": "Author",
24 | "qqgroup": "QQ Group",
25 | "appupdate": "AppUpdate",
26 | "sponsor": "Sponsor",
27 | "sponsorDescription": "Your reward is the motivation for me to maintain. I will make a list of all reward staff on GitHub as a voucher.",
28 | "home": "Home",
29 | "category": "Category",
30 | "activity": "Activity",
31 | "message": "Message",
32 | "profile": "Profile",
33 | "reminder": "Reminder",
34 | "agree": "Agree",
35 | "disagree": "Disagree",
36 | "lookAgain": "Look Again",
37 | "stillDisagree": "Still Disagree",
38 | "thinkAboutItAgain": " Do you want to think about it again?",
39 | "privacyExplainAgain": " We attach great importance to the protection of your personal information and promise to protect and process your information in strict accordance with the 《{appName} privacy policy》. If you do not agree with the policy, we regret that we will not be able to provide you with services.",
40 | "exitApp": "Exit App",
41 | "privacyName": "《{appName} privacy policy》",
42 | "welcome": " Welcome to {appName}!",
43 | "welcome1": " We know the importance of personal information to you and thank you for your trust in us.",
44 | "welcome2": " In order to better protect your rights and interests and comply with the relevant regulatory requirements, we will explain to you through ",
45 | "welcome3": " how we will collect, store, protect, use and provide your information to the outside world, and explain your rights.",
46 | "welcome4": " For more details, please refer to",
47 | "welcome5": " the full text.",
48 | "agreePrivacy": "Privacy agreement agreed!",
49 | "darkTheme": "Dark Theme"
50 | }
--------------------------------------------------------------------------------
/i18n/zh-CN.json:
--------------------------------------------------------------------------------
1 | {
2 | "title": "Flutter模版工程",
3 | "login": "登录",
4 | "logout": "登出",
5 | "loginName": "用户名",
6 | "loginNameHint": "请输入您的用户名或邮箱",
7 | "loginNameError": "用户名不能为空!",
8 | "password": "密码",
9 | "passwordHint": "请输入您的密码",
10 | "passwordError": "密码不能少于6位!",
11 | "loginSuccess": "登录成功",
12 | "register": "注册",
13 | "repeatPassword": "重复密码",
14 | "registerSuccess": "注册成功",
15 | "settings": "设置",
16 | "theme": "主题",
17 | "language": "语言",
18 | "chinese": "简体中文",
19 | "english": "英语",
20 | "auto": "系统默认",
21 | "about": "关于",
22 | "versionName": "版本号",
23 | "author": "作者",
24 | "qqgroup": "QQ群",
25 | "appupdate": "版本更新",
26 | "sponsor": "赞助",
27 | "sponsorDescription": "你的打赏是我维护的动力,我将会列出所有打赏人员的清单在Github上作为凭证.",
28 | "home": "主页",
29 | "category": "分类",
30 | "activity": "活动",
31 | "message": "消息",
32 | "profile": "我的",
33 | "reminder": "温馨提醒",
34 | "agree": "同意",
35 | "disagree": "不同意",
36 | "lookAgain": "再次查看",
37 | "stillDisagree": "仍不同意",
38 | "thinkAboutItAgain": " 要不要再想想?",
39 | "privacyExplainAgain": " 我们非常重视对你个人信息的保护,承诺严格按照《{appName}隐私权政策》保护及处理你的信息。如果你不同意该政策,很遗憾我们将无法为你提供服务。",
40 | "exitApp": "退出应用",
41 | "privacyName": "《{appName}隐私权政策》",
42 | "welcome": " 欢迎来到{appName}!",
43 | "welcome1": " 我们深知个人信息对你的重要性,也感谢你对我们的信任。",
44 | "welcome2": " 为了更好地保护你的权益,同时遵守相关监管的要求,我们将通过",
45 | "welcome3": "向你说明我们会如何收集、存储、保护、使用及对外提供你的信息,并说明你享有的权利。",
46 | "welcome4": " 更多详情,敬请查阅",
47 | "welcome5": "全文。",
48 | "agreePrivacy": "已同意隐私协议!",
49 | "darkTheme": "深色主题"
50 | }
--------------------------------------------------------------------------------
/i18nconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "defaultLocale": "en-US",
3 | "locales": [
4 | "en-US",
5 | "zh-CN"
6 | ],
7 | "localePath": "i18n",
8 | "generatedPath": "lib/generated",
9 | "ltr": [
10 | "en-US",
11 | "zh-CN"
12 | ],
13 | "rtl": []
14 | }
--------------------------------------------------------------------------------
/ios/.gitignore:
--------------------------------------------------------------------------------
1 | *.mode1v3
2 | *.mode2v3
3 | *.moved-aside
4 | *.pbxuser
5 | *.perspectivev3
6 | **/*sync/
7 | .sconsign.dblite
8 | .tags*
9 | **/.vagrant/
10 | **/DerivedData/
11 | Icon?
12 | **/Pods/
13 | **/.symlinks/
14 | profile
15 | xcuserdata
16 | **/.generated/
17 | Flutter/App.framework
18 | Flutter/Flutter.framework
19 | Flutter/Flutter.podspec
20 | Flutter/Generated.xcconfig
21 | Flutter/app.flx
22 | Flutter/app.zip
23 | Flutter/flutter_assets/
24 | Flutter/flutter_export_environment.sh
25 | ServiceDefinitions.json
26 | Runner/GeneratedPluginRegistrant.*
27 |
28 | # Exceptions to above rules.
29 | !default.mode1v3
30 | !default.mode2v3
31 | !default.pbxuser
32 | !default.perspectivev3
33 |
--------------------------------------------------------------------------------
/ios/Flutter/.last_build_id:
--------------------------------------------------------------------------------
1 | 4d5518bed0b11145d1682b39e915be1d
--------------------------------------------------------------------------------
/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 "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
2 | #include "Generated.xcconfig"
3 |
--------------------------------------------------------------------------------
/ios/Flutter/Release.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
2 | #include "Generated.xcconfig"
3 |
--------------------------------------------------------------------------------
/ios/Podfile:
--------------------------------------------------------------------------------
1 | # Uncomment this line to define a global platform for your project
2 | # platform :ios, '9.0'
3 |
4 | # CocoaPods analytics sends network stats synchronously affecting flutter build latency.
5 | ENV['COCOAPODS_DISABLE_STATS'] = 'true'
6 |
7 | project 'Runner', {
8 | 'Debug' => :debug,
9 | 'Profile' => :release,
10 | 'Release' => :release,
11 | }
12 |
13 | def flutter_root
14 | generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
15 | unless File.exist?(generated_xcode_build_settings_path)
16 | raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
17 | end
18 |
19 | File.foreach(generated_xcode_build_settings_path) do |line|
20 | matches = line.match(/FLUTTER_ROOT\=(.*)/)
21 | return matches[1].strip if matches
22 | end
23 | raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
24 | end
25 |
26 | require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
27 |
28 | flutter_ios_podfile_setup
29 |
30 | target 'Runner' do
31 | use_frameworks!
32 | use_modular_headers!
33 |
34 | flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
35 | end
36 |
37 | post_install do |installer|
38 | installer.pods_project.targets.each do |target|
39 | flutter_additional_ios_build_settings(target)
40 | end
41 | end
42 |
--------------------------------------------------------------------------------
/ios/Podfile.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - Flutter (1.0.0)
3 | - flutter_webview_plugin (0.0.1):
4 | - Flutter
5 | - FMDB (2.7.5):
6 | - FMDB/standard (= 2.7.5)
7 | - FMDB/standard (2.7.5)
8 | - image_picker_saver (0.0.1):
9 | - Flutter
10 | - package_info (0.0.1):
11 | - Flutter
12 | - path_provider (0.0.1):
13 | - Flutter
14 | - "permission_handler (5.1.0+2)":
15 | - Flutter
16 | - share (0.0.1):
17 | - Flutter
18 | - shared_preferences (0.0.1):
19 | - Flutter
20 | - sqflite (0.0.2):
21 | - Flutter
22 | - FMDB (>= 2.7.5)
23 | - url_launcher (0.0.1):
24 | - Flutter
25 |
26 | DEPENDENCIES:
27 | - Flutter (from `Flutter`)
28 | - flutter_webview_plugin (from `.symlinks/plugins/flutter_webview_plugin/ios`)
29 | - image_picker_saver (from `.symlinks/plugins/image_picker_saver/ios`)
30 | - package_info (from `.symlinks/plugins/package_info/ios`)
31 | - path_provider (from `.symlinks/plugins/path_provider/ios`)
32 | - permission_handler (from `.symlinks/plugins/permission_handler/ios`)
33 | - share (from `.symlinks/plugins/share/ios`)
34 | - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`)
35 | - sqflite (from `.symlinks/plugins/sqflite/ios`)
36 | - url_launcher (from `.symlinks/plugins/url_launcher/ios`)
37 |
38 | SPEC REPOS:
39 | trunk:
40 | - FMDB
41 |
42 | EXTERNAL SOURCES:
43 | Flutter:
44 | :path: Flutter
45 | flutter_webview_plugin:
46 | :path: ".symlinks/plugins/flutter_webview_plugin/ios"
47 | image_picker_saver:
48 | :path: ".symlinks/plugins/image_picker_saver/ios"
49 | package_info:
50 | :path: ".symlinks/plugins/package_info/ios"
51 | path_provider:
52 | :path: ".symlinks/plugins/path_provider/ios"
53 | permission_handler:
54 | :path: ".symlinks/plugins/permission_handler/ios"
55 | share:
56 | :path: ".symlinks/plugins/share/ios"
57 | shared_preferences:
58 | :path: ".symlinks/plugins/shared_preferences/ios"
59 | sqflite:
60 | :path: ".symlinks/plugins/sqflite/ios"
61 | url_launcher:
62 | :path: ".symlinks/plugins/url_launcher/ios"
63 |
64 | SPEC CHECKSUMS:
65 | Flutter: 434fef37c0980e73bb6479ef766c45957d4b510c
66 | flutter_webview_plugin: ed9e8a6a96baf0c867e90e1bce2673913eeac694
67 | FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
68 | image_picker_saver: 4f28bd70e1efdca68ad88beab0f11d22cffe04f6
69 | package_info: 873975fc26034f0b863a300ad47e7f1ac6c7ec62
70 | path_provider: abfe2b5c733d04e238b0d8691db0cfd63a27a93c
71 | permission_handler: ccb20a9fad0ee9b1314a52b70b76b473c5f8dab0
72 | share: 0b2c3e82132f5888bccca3351c504d0003b3b410
73 | shared_preferences: af6bfa751691cdc24be3045c43ec037377ada40d
74 | sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904
75 | url_launcher: 6fef411d543ceb26efce54b05a0a40bfd74cbbef
76 |
77 | PODFILE CHECKSUM: aafe91acc616949ddb318b77800a7f51bffa2a4c
78 |
79 | COCOAPODS: 1.10.1
80 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
11 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
12 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
13 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
14 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
15 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
16 | ABA1167A6F012F337F5B2670 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 37E50CD4616E73039A0D71F5 /* Pods_Runner.framework */; };
17 | /* End PBXBuildFile section */
18 |
19 | /* Begin PBXCopyFilesBuildPhase section */
20 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = {
21 | isa = PBXCopyFilesBuildPhase;
22 | buildActionMask = 2147483647;
23 | dstPath = "";
24 | dstSubfolderSpec = 10;
25 | files = (
26 | );
27 | name = "Embed Frameworks";
28 | runOnlyForDeploymentPostprocessing = 0;
29 | };
30 | /* End PBXCopyFilesBuildPhase section */
31 |
32 | /* Begin PBXFileReference section */
33 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
34 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
35 | 1C9CD4CEEBA91E1E15F22DCC /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; };
36 | 23038588C31982282424F233 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
37 | 37E50CD4616E73039A0D71F5 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
38 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
39 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; };
40 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
41 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
42 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
43 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
44 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
45 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
46 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
47 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
48 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
49 | F92BE4FF12110F13B1E1E08D /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; };
50 | FDEADB8E2420E737006E9B22 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Main.strings"; sourceTree = ""; };
51 | FDEADB8F2420E737006E9B22 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/LaunchScreen.strings"; sourceTree = ""; };
52 | /* End PBXFileReference section */
53 |
54 | /* Begin PBXFrameworksBuildPhase section */
55 | 97C146EB1CF9000F007C117D /* Frameworks */ = {
56 | isa = PBXFrameworksBuildPhase;
57 | buildActionMask = 2147483647;
58 | files = (
59 | ABA1167A6F012F337F5B2670 /* Pods_Runner.framework in Frameworks */,
60 | );
61 | runOnlyForDeploymentPostprocessing = 0;
62 | };
63 | /* End PBXFrameworksBuildPhase section */
64 |
65 | /* Begin PBXGroup section */
66 | 76210EC4F3F37EED7873DD30 /* Pods */ = {
67 | isa = PBXGroup;
68 | children = (
69 | F92BE4FF12110F13B1E1E08D /* Pods-Runner.debug.xcconfig */,
70 | 23038588C31982282424F233 /* Pods-Runner.release.xcconfig */,
71 | 1C9CD4CEEBA91E1E15F22DCC /* Pods-Runner.profile.xcconfig */,
72 | );
73 | path = Pods;
74 | sourceTree = "";
75 | };
76 | 8234B6B7ED03DCEB71FBC78B /* Frameworks */ = {
77 | isa = PBXGroup;
78 | children = (
79 | 37E50CD4616E73039A0D71F5 /* Pods_Runner.framework */,
80 | );
81 | name = Frameworks;
82 | sourceTree = "";
83 | };
84 | 9740EEB11CF90186004384FC /* Flutter */ = {
85 | isa = PBXGroup;
86 | children = (
87 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
88 | 9740EEB21CF90195004384FC /* Debug.xcconfig */,
89 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
90 | 9740EEB31CF90195004384FC /* Generated.xcconfig */,
91 | );
92 | name = Flutter;
93 | sourceTree = "";
94 | };
95 | 97C146E51CF9000F007C117D = {
96 | isa = PBXGroup;
97 | children = (
98 | 9740EEB11CF90186004384FC /* Flutter */,
99 | 97C146F01CF9000F007C117D /* Runner */,
100 | 97C146EF1CF9000F007C117D /* Products */,
101 | 76210EC4F3F37EED7873DD30 /* Pods */,
102 | 8234B6B7ED03DCEB71FBC78B /* Frameworks */,
103 | );
104 | sourceTree = "";
105 | };
106 | 97C146EF1CF9000F007C117D /* Products */ = {
107 | isa = PBXGroup;
108 | children = (
109 | 97C146EE1CF9000F007C117D /* Runner.app */,
110 | );
111 | name = Products;
112 | sourceTree = "";
113 | };
114 | 97C146F01CF9000F007C117D /* Runner */ = {
115 | isa = PBXGroup;
116 | children = (
117 | 97C146FA1CF9000F007C117D /* Main.storyboard */,
118 | 97C146FD1CF9000F007C117D /* Assets.xcassets */,
119 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
120 | 97C147021CF9000F007C117D /* Info.plist */,
121 | 97C146F11CF9000F007C117D /* Supporting Files */,
122 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
123 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
124 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
125 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
126 | );
127 | path = Runner;
128 | sourceTree = "";
129 | };
130 | 97C146F11CF9000F007C117D /* Supporting Files */ = {
131 | isa = PBXGroup;
132 | children = (
133 | );
134 | name = "Supporting Files";
135 | sourceTree = "";
136 | };
137 | /* End PBXGroup section */
138 |
139 | /* Begin PBXNativeTarget section */
140 | 97C146ED1CF9000F007C117D /* Runner */ = {
141 | isa = PBXNativeTarget;
142 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
143 | buildPhases = (
144 | D6F07A58898EA60246BB2204 /* [CP] Check Pods Manifest.lock */,
145 | 9740EEB61CF901F6004384FC /* Run Script */,
146 | 97C146EA1CF9000F007C117D /* Sources */,
147 | 97C146EB1CF9000F007C117D /* Frameworks */,
148 | 97C146EC1CF9000F007C117D /* Resources */,
149 | 9705A1C41CF9048500538489 /* Embed Frameworks */,
150 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
151 | 8D5FA44DA80BF1300BE59A81 /* [CP] Embed Pods Frameworks */,
152 | );
153 | buildRules = (
154 | );
155 | dependencies = (
156 | );
157 | name = Runner;
158 | productName = Runner;
159 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
160 | productType = "com.apple.product-type.application";
161 | };
162 | /* End PBXNativeTarget section */
163 |
164 | /* Begin PBXProject section */
165 | 97C146E61CF9000F007C117D /* Project object */ = {
166 | isa = PBXProject;
167 | attributes = {
168 | LastUpgradeCheck = 1020;
169 | ORGANIZATIONNAME = "";
170 | TargetAttributes = {
171 | 97C146ED1CF9000F007C117D = {
172 | CreatedOnToolsVersion = 7.3.1;
173 | LastSwiftMigration = 1100;
174 | };
175 | };
176 | };
177 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
178 | compatibilityVersion = "Xcode 3.2";
179 | developmentRegion = en;
180 | hasScannedForEncodings = 0;
181 | knownRegions = (
182 | en,
183 | Base,
184 | "zh-Hans",
185 | );
186 | mainGroup = 97C146E51CF9000F007C117D;
187 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
188 | projectDirPath = "";
189 | projectRoot = "";
190 | targets = (
191 | 97C146ED1CF9000F007C117D /* Runner */,
192 | );
193 | };
194 | /* End PBXProject section */
195 |
196 | /* Begin PBXResourcesBuildPhase section */
197 | 97C146EC1CF9000F007C117D /* Resources */ = {
198 | isa = PBXResourcesBuildPhase;
199 | buildActionMask = 2147483647;
200 | files = (
201 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
202 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
203 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
204 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
205 | );
206 | runOnlyForDeploymentPostprocessing = 0;
207 | };
208 | /* End PBXResourcesBuildPhase section */
209 |
210 | /* Begin PBXShellScriptBuildPhase section */
211 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
212 | isa = PBXShellScriptBuildPhase;
213 | buildActionMask = 2147483647;
214 | files = (
215 | );
216 | inputPaths = (
217 | );
218 | name = "Thin Binary";
219 | outputPaths = (
220 | );
221 | runOnlyForDeploymentPostprocessing = 0;
222 | shellPath = /bin/sh;
223 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
224 | };
225 | 8D5FA44DA80BF1300BE59A81 /* [CP] Embed Pods Frameworks */ = {
226 | isa = PBXShellScriptBuildPhase;
227 | buildActionMask = 2147483647;
228 | files = (
229 | );
230 | inputPaths = (
231 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh",
232 | "${BUILT_PRODUCTS_DIR}/FMDB/FMDB.framework",
233 | "${BUILT_PRODUCTS_DIR}/flutter_webview_plugin/flutter_webview_plugin.framework",
234 | "${BUILT_PRODUCTS_DIR}/image_picker_saver/image_picker_saver.framework",
235 | "${BUILT_PRODUCTS_DIR}/package_info/package_info.framework",
236 | "${BUILT_PRODUCTS_DIR}/path_provider/path_provider.framework",
237 | "${BUILT_PRODUCTS_DIR}/share/share.framework",
238 | "${BUILT_PRODUCTS_DIR}/shared_preferences/shared_preferences.framework",
239 | "${BUILT_PRODUCTS_DIR}/sqflite/sqflite.framework",
240 | "${BUILT_PRODUCTS_DIR}/url_launcher/url_launcher.framework",
241 | );
242 | name = "[CP] Embed Pods Frameworks";
243 | outputPaths = (
244 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FMDB.framework",
245 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_webview_plugin.framework",
246 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/image_picker_saver.framework",
247 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/package_info.framework",
248 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/path_provider.framework",
249 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/share.framework",
250 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/shared_preferences.framework",
251 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/sqflite.framework",
252 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/url_launcher.framework",
253 | );
254 | runOnlyForDeploymentPostprocessing = 0;
255 | shellPath = /bin/sh;
256 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
257 | showEnvVarsInLog = 0;
258 | };
259 | 9740EEB61CF901F6004384FC /* Run Script */ = {
260 | isa = PBXShellScriptBuildPhase;
261 | buildActionMask = 2147483647;
262 | files = (
263 | );
264 | inputPaths = (
265 | );
266 | name = "Run Script";
267 | outputPaths = (
268 | );
269 | runOnlyForDeploymentPostprocessing = 0;
270 | shellPath = /bin/sh;
271 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
272 | };
273 | D6F07A58898EA60246BB2204 /* [CP] Check Pods Manifest.lock */ = {
274 | isa = PBXShellScriptBuildPhase;
275 | buildActionMask = 2147483647;
276 | files = (
277 | );
278 | inputFileListPaths = (
279 | );
280 | inputPaths = (
281 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
282 | "${PODS_ROOT}/Manifest.lock",
283 | );
284 | name = "[CP] Check Pods Manifest.lock";
285 | outputFileListPaths = (
286 | );
287 | outputPaths = (
288 | "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
289 | );
290 | runOnlyForDeploymentPostprocessing = 0;
291 | shellPath = /bin/sh;
292 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
293 | showEnvVarsInLog = 0;
294 | };
295 | /* End PBXShellScriptBuildPhase section */
296 |
297 | /* Begin PBXSourcesBuildPhase section */
298 | 97C146EA1CF9000F007C117D /* Sources */ = {
299 | isa = PBXSourcesBuildPhase;
300 | buildActionMask = 2147483647;
301 | files = (
302 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
303 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
304 | );
305 | runOnlyForDeploymentPostprocessing = 0;
306 | };
307 | /* End PBXSourcesBuildPhase section */
308 |
309 | /* Begin PBXVariantGroup section */
310 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = {
311 | isa = PBXVariantGroup;
312 | children = (
313 | 97C146FB1CF9000F007C117D /* Base */,
314 | FDEADB8E2420E737006E9B22 /* zh-Hans */,
315 | );
316 | name = Main.storyboard;
317 | sourceTree = "";
318 | };
319 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
320 | isa = PBXVariantGroup;
321 | children = (
322 | 97C147001CF9000F007C117D /* Base */,
323 | FDEADB8F2420E737006E9B22 /* zh-Hans */,
324 | );
325 | name = LaunchScreen.storyboard;
326 | sourceTree = "";
327 | };
328 | /* End PBXVariantGroup section */
329 |
330 | /* Begin XCBuildConfiguration section */
331 | 249021D3217E4FDB00AE95B9 /* Profile */ = {
332 | isa = XCBuildConfiguration;
333 | buildSettings = {
334 | ALWAYS_SEARCH_USER_PATHS = NO;
335 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
336 | CLANG_ANALYZER_NONNULL = YES;
337 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
338 | CLANG_CXX_LIBRARY = "libc++";
339 | CLANG_ENABLE_MODULES = YES;
340 | CLANG_ENABLE_OBJC_ARC = YES;
341 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
342 | CLANG_WARN_BOOL_CONVERSION = YES;
343 | CLANG_WARN_COMMA = YES;
344 | CLANG_WARN_CONSTANT_CONVERSION = YES;
345 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
346 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
347 | CLANG_WARN_EMPTY_BODY = YES;
348 | CLANG_WARN_ENUM_CONVERSION = YES;
349 | CLANG_WARN_INFINITE_RECURSION = YES;
350 | CLANG_WARN_INT_CONVERSION = YES;
351 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
352 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
353 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
354 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
355 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
356 | CLANG_WARN_STRICT_PROTOTYPES = YES;
357 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
358 | CLANG_WARN_UNREACHABLE_CODE = YES;
359 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
360 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
361 | COPY_PHASE_STRIP = NO;
362 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
363 | ENABLE_NS_ASSERTIONS = NO;
364 | ENABLE_STRICT_OBJC_MSGSEND = YES;
365 | GCC_C_LANGUAGE_STANDARD = gnu99;
366 | GCC_NO_COMMON_BLOCKS = YES;
367 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
368 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
369 | GCC_WARN_UNDECLARED_SELECTOR = YES;
370 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
371 | GCC_WARN_UNUSED_FUNCTION = YES;
372 | GCC_WARN_UNUSED_VARIABLE = YES;
373 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
374 | MTL_ENABLE_DEBUG_INFO = NO;
375 | SDKROOT = iphoneos;
376 | SUPPORTED_PLATFORMS = iphoneos;
377 | TARGETED_DEVICE_FAMILY = "1,2";
378 | VALIDATE_PRODUCT = YES;
379 | };
380 | name = Profile;
381 | };
382 | 249021D4217E4FDB00AE95B9 /* Profile */ = {
383 | isa = XCBuildConfiguration;
384 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
385 | buildSettings = {
386 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
387 | CLANG_ENABLE_MODULES = YES;
388 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
389 | ENABLE_BITCODE = NO;
390 | FRAMEWORK_SEARCH_PATHS = (
391 | "$(inherited)",
392 | "$(PROJECT_DIR)/Flutter",
393 | );
394 | INFOPLIST_FILE = Runner/Info.plist;
395 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
396 | LIBRARY_SEARCH_PATHS = (
397 | "$(inherited)",
398 | "$(PROJECT_DIR)/Flutter",
399 | );
400 | PRODUCT_BUNDLE_IDENTIFIER = com.xuexiang.flutter_template;
401 | PRODUCT_NAME = "$(TARGET_NAME)";
402 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
403 | SWIFT_VERSION = 5.0;
404 | VERSIONING_SYSTEM = "apple-generic";
405 | };
406 | name = Profile;
407 | };
408 | 97C147031CF9000F007C117D /* Debug */ = {
409 | isa = XCBuildConfiguration;
410 | buildSettings = {
411 | ALWAYS_SEARCH_USER_PATHS = NO;
412 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
413 | CLANG_ANALYZER_NONNULL = YES;
414 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
415 | CLANG_CXX_LIBRARY = "libc++";
416 | CLANG_ENABLE_MODULES = YES;
417 | CLANG_ENABLE_OBJC_ARC = YES;
418 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
419 | CLANG_WARN_BOOL_CONVERSION = YES;
420 | CLANG_WARN_COMMA = YES;
421 | CLANG_WARN_CONSTANT_CONVERSION = YES;
422 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
423 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
424 | CLANG_WARN_EMPTY_BODY = YES;
425 | CLANG_WARN_ENUM_CONVERSION = YES;
426 | CLANG_WARN_INFINITE_RECURSION = YES;
427 | CLANG_WARN_INT_CONVERSION = YES;
428 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
429 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
430 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
431 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
432 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
433 | CLANG_WARN_STRICT_PROTOTYPES = YES;
434 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
435 | CLANG_WARN_UNREACHABLE_CODE = YES;
436 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
437 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
438 | COPY_PHASE_STRIP = NO;
439 | DEBUG_INFORMATION_FORMAT = dwarf;
440 | ENABLE_STRICT_OBJC_MSGSEND = YES;
441 | ENABLE_TESTABILITY = YES;
442 | GCC_C_LANGUAGE_STANDARD = gnu99;
443 | GCC_DYNAMIC_NO_PIC = NO;
444 | GCC_NO_COMMON_BLOCKS = YES;
445 | GCC_OPTIMIZATION_LEVEL = 0;
446 | GCC_PREPROCESSOR_DEFINITIONS = (
447 | "DEBUG=1",
448 | "$(inherited)",
449 | );
450 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
451 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
452 | GCC_WARN_UNDECLARED_SELECTOR = YES;
453 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
454 | GCC_WARN_UNUSED_FUNCTION = YES;
455 | GCC_WARN_UNUSED_VARIABLE = YES;
456 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
457 | MTL_ENABLE_DEBUG_INFO = YES;
458 | ONLY_ACTIVE_ARCH = YES;
459 | SDKROOT = iphoneos;
460 | TARGETED_DEVICE_FAMILY = "1,2";
461 | };
462 | name = Debug;
463 | };
464 | 97C147041CF9000F007C117D /* Release */ = {
465 | isa = XCBuildConfiguration;
466 | buildSettings = {
467 | ALWAYS_SEARCH_USER_PATHS = NO;
468 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
469 | CLANG_ANALYZER_NONNULL = YES;
470 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
471 | CLANG_CXX_LIBRARY = "libc++";
472 | CLANG_ENABLE_MODULES = YES;
473 | CLANG_ENABLE_OBJC_ARC = YES;
474 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
475 | CLANG_WARN_BOOL_CONVERSION = YES;
476 | CLANG_WARN_COMMA = YES;
477 | CLANG_WARN_CONSTANT_CONVERSION = YES;
478 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
479 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
480 | CLANG_WARN_EMPTY_BODY = YES;
481 | CLANG_WARN_ENUM_CONVERSION = YES;
482 | CLANG_WARN_INFINITE_RECURSION = YES;
483 | CLANG_WARN_INT_CONVERSION = YES;
484 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
485 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
486 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
487 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
488 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
489 | CLANG_WARN_STRICT_PROTOTYPES = YES;
490 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
491 | CLANG_WARN_UNREACHABLE_CODE = YES;
492 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
493 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
494 | COPY_PHASE_STRIP = NO;
495 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
496 | ENABLE_NS_ASSERTIONS = NO;
497 | ENABLE_STRICT_OBJC_MSGSEND = YES;
498 | GCC_C_LANGUAGE_STANDARD = gnu99;
499 | GCC_NO_COMMON_BLOCKS = YES;
500 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
501 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
502 | GCC_WARN_UNDECLARED_SELECTOR = YES;
503 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
504 | GCC_WARN_UNUSED_FUNCTION = YES;
505 | GCC_WARN_UNUSED_VARIABLE = YES;
506 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
507 | MTL_ENABLE_DEBUG_INFO = NO;
508 | SDKROOT = iphoneos;
509 | SUPPORTED_PLATFORMS = iphoneos;
510 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
511 | TARGETED_DEVICE_FAMILY = "1,2";
512 | VALIDATE_PRODUCT = YES;
513 | };
514 | name = Release;
515 | };
516 | 97C147061CF9000F007C117D /* Debug */ = {
517 | isa = XCBuildConfiguration;
518 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
519 | buildSettings = {
520 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
521 | CLANG_ENABLE_MODULES = YES;
522 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
523 | ENABLE_BITCODE = NO;
524 | FRAMEWORK_SEARCH_PATHS = (
525 | "$(inherited)",
526 | "$(PROJECT_DIR)/Flutter",
527 | );
528 | INFOPLIST_FILE = Runner/Info.plist;
529 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
530 | LIBRARY_SEARCH_PATHS = (
531 | "$(inherited)",
532 | "$(PROJECT_DIR)/Flutter",
533 | );
534 | PRODUCT_BUNDLE_IDENTIFIER = com.xuexiang.flutter_template;
535 | PRODUCT_NAME = "$(TARGET_NAME)";
536 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
537 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
538 | SWIFT_VERSION = 5.0;
539 | VERSIONING_SYSTEM = "apple-generic";
540 | };
541 | name = Debug;
542 | };
543 | 97C147071CF9000F007C117D /* Release */ = {
544 | isa = XCBuildConfiguration;
545 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
546 | buildSettings = {
547 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
548 | CLANG_ENABLE_MODULES = YES;
549 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
550 | ENABLE_BITCODE = NO;
551 | FRAMEWORK_SEARCH_PATHS = (
552 | "$(inherited)",
553 | "$(PROJECT_DIR)/Flutter",
554 | );
555 | INFOPLIST_FILE = Runner/Info.plist;
556 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
557 | LIBRARY_SEARCH_PATHS = (
558 | "$(inherited)",
559 | "$(PROJECT_DIR)/Flutter",
560 | );
561 | PRODUCT_BUNDLE_IDENTIFIER = com.xuexiang.flutter_template;
562 | PRODUCT_NAME = "$(TARGET_NAME)";
563 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
564 | SWIFT_VERSION = 5.0;
565 | VERSIONING_SYSTEM = "apple-generic";
566 | };
567 | name = Release;
568 | };
569 | /* End XCBuildConfiguration section */
570 |
571 | /* Begin XCConfigurationList section */
572 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
573 | isa = XCConfigurationList;
574 | buildConfigurations = (
575 | 97C147031CF9000F007C117D /* Debug */,
576 | 97C147041CF9000F007C117D /* Release */,
577 | 249021D3217E4FDB00AE95B9 /* Profile */,
578 | );
579 | defaultConfigurationIsVisible = 0;
580 | defaultConfigurationName = Release;
581 | };
582 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
583 | isa = XCConfigurationList;
584 | buildConfigurations = (
585 | 97C147061CF9000F007C117D /* Debug */,
586 | 97C147071CF9000F007C117D /* Release */,
587 | 249021D4217E4FDB00AE95B9 /* Profile */,
588 | );
589 | defaultConfigurationIsVisible = 0;
590 | defaultConfigurationName = Release;
591 | };
592 | /* End XCConfigurationList section */
593 | };
594 | rootObject = 97C146E61CF9000F007C117D /* Project object */;
595 | }
596 |
--------------------------------------------------------------------------------
/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 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | import UIKit
2 | import Flutter
3 |
4 | @UIApplicationMain
5 | @objc class AppDelegate: FlutterAppDelegate {
6 | override func application(
7 | _ application: UIApplication,
8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
9 | ) -> Bool {
10 | GeneratedPluginRegistrant.register(with: self)
11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions)
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "size" : "20x20",
5 | "idiom" : "iphone",
6 | "filename" : "Icon-App-20x20@2x.png",
7 | "scale" : "2x"
8 | },
9 | {
10 | "size" : "20x20",
11 | "idiom" : "iphone",
12 | "filename" : "Icon-App-20x20@3x.png",
13 | "scale" : "3x"
14 | },
15 | {
16 | "size" : "29x29",
17 | "idiom" : "iphone",
18 | "filename" : "Icon-App-29x29@1x.png",
19 | "scale" : "1x"
20 | },
21 | {
22 | "size" : "29x29",
23 | "idiom" : "iphone",
24 | "filename" : "Icon-App-29x29@2x.png",
25 | "scale" : "2x"
26 | },
27 | {
28 | "size" : "29x29",
29 | "idiom" : "iphone",
30 | "filename" : "Icon-App-29x29@3x.png",
31 | "scale" : "3x"
32 | },
33 | {
34 | "size" : "40x40",
35 | "idiom" : "iphone",
36 | "filename" : "Icon-App-40x40@2x.png",
37 | "scale" : "2x"
38 | },
39 | {
40 | "size" : "40x40",
41 | "idiom" : "iphone",
42 | "filename" : "Icon-App-40x40@3x.png",
43 | "scale" : "3x"
44 | },
45 | {
46 | "size" : "60x60",
47 | "idiom" : "iphone",
48 | "filename" : "Icon-App-60x60@2x.png",
49 | "scale" : "2x"
50 | },
51 | {
52 | "size" : "60x60",
53 | "idiom" : "iphone",
54 | "filename" : "Icon-App-60x60@3x.png",
55 | "scale" : "3x"
56 | },
57 | {
58 | "size" : "20x20",
59 | "idiom" : "ipad",
60 | "filename" : "Icon-App-20x20@1x.png",
61 | "scale" : "1x"
62 | },
63 | {
64 | "size" : "20x20",
65 | "idiom" : "ipad",
66 | "filename" : "Icon-App-20x20@2x.png",
67 | "scale" : "2x"
68 | },
69 | {
70 | "size" : "29x29",
71 | "idiom" : "ipad",
72 | "filename" : "Icon-App-29x29@1x.png",
73 | "scale" : "1x"
74 | },
75 | {
76 | "size" : "29x29",
77 | "idiom" : "ipad",
78 | "filename" : "Icon-App-29x29@2x.png",
79 | "scale" : "2x"
80 | },
81 | {
82 | "size" : "40x40",
83 | "idiom" : "ipad",
84 | "filename" : "Icon-App-40x40@1x.png",
85 | "scale" : "1x"
86 | },
87 | {
88 | "size" : "40x40",
89 | "idiom" : "ipad",
90 | "filename" : "Icon-App-40x40@2x.png",
91 | "scale" : "2x"
92 | },
93 | {
94 | "size" : "76x76",
95 | "idiom" : "ipad",
96 | "filename" : "Icon-App-76x76@1x.png",
97 | "scale" : "1x"
98 | },
99 | {
100 | "size" : "76x76",
101 | "idiom" : "ipad",
102 | "filename" : "Icon-App-76x76@2x.png",
103 | "scale" : "2x"
104 | },
105 | {
106 | "size" : "83.5x83.5",
107 | "idiom" : "ipad",
108 | "filename" : "Icon-App-83.5x83.5@2x.png",
109 | "scale" : "2x"
110 | },
111 | {
112 | "size" : "1024x1024",
113 | "idiom" : "ios-marketing",
114 | "filename" : "Icon-App-1024x1024@1x.png",
115 | "scale" : "1x"
116 | }
117 | ],
118 | "info" : {
119 | "version" : 1,
120 | "author" : "xcode"
121 | }
122 | }
123 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xuexiangjys/flutter_template/85177b1ba88820161420725d69327cb931fb822a/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/xuexiangjys/flutter_template/85177b1ba88820161420725d69327cb931fb822a/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/xuexiangjys/flutter_template/85177b1ba88820161420725d69327cb931fb822a/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/xuexiangjys/flutter_template/85177b1ba88820161420725d69327cb931fb822a/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/xuexiangjys/flutter_template/85177b1ba88820161420725d69327cb931fb822a/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/xuexiangjys/flutter_template/85177b1ba88820161420725d69327cb931fb822a/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/xuexiangjys/flutter_template/85177b1ba88820161420725d69327cb931fb822a/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/xuexiangjys/flutter_template/85177b1ba88820161420725d69327cb931fb822a/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/xuexiangjys/flutter_template/85177b1ba88820161420725d69327cb931fb822a/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/xuexiangjys/flutter_template/85177b1ba88820161420725d69327cb931fb822a/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/xuexiangjys/flutter_template/85177b1ba88820161420725d69327cb931fb822a/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/xuexiangjys/flutter_template/85177b1ba88820161420725d69327cb931fb822a/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/xuexiangjys/flutter_template/85177b1ba88820161420725d69327cb931fb822a/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/xuexiangjys/flutter_template/85177b1ba88820161420725d69327cb931fb822a/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/xuexiangjys/flutter_template/85177b1ba88820161420725d69327cb931fb822a/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/xuexiangjys/flutter_template/85177b1ba88820161420725d69327cb931fb822a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xuexiangjys/flutter_template/85177b1ba88820161420725d69327cb931fb822a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xuexiangjys/flutter_template/85177b1ba88820161420725d69327cb931fb822a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md:
--------------------------------------------------------------------------------
1 | # Launch Screen Assets
2 |
3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory.
4 |
5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
--------------------------------------------------------------------------------
/ios/Runner/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/ios/Runner/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/ios/Runner/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleDisplayName
8 | flutter_template
9 | CFBundleExecutable
10 | $(EXECUTABLE_NAME)
11 | CFBundleIdentifier
12 | $(PRODUCT_BUNDLE_IDENTIFIER)
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleLocalizations
16 |
17 | en
18 | es
19 | ru
20 |
21 | CFBundleName
22 | $(PRODUCT_NAME)
23 | CFBundlePackageType
24 | APPL
25 | CFBundleShortVersionString
26 | $(FLUTTER_BUILD_NAME)
27 | CFBundleSignature
28 | ????
29 | CFBundleVersion
30 | $(FLUTTER_BUILD_NUMBER)
31 | LSRequiresIPhoneOS
32 |
33 | NSAppTransportSecurity
34 |
35 | NSAllowsArbitraryLoads
36 |
37 | NSAllowsArbitraryLoadsInWebContent
38 |
39 |
40 | UILaunchStoryboardName
41 | LaunchScreen
42 | UIMainStoryboardFile
43 | Main
44 | UISupportedInterfaceOrientations
45 |
46 | UIInterfaceOrientationPortrait
47 | UIInterfaceOrientationLandscapeLeft
48 | UIInterfaceOrientationLandscapeRight
49 |
50 | UISupportedInterfaceOrientations~ipad
51 |
52 | UIInterfaceOrientationPortrait
53 | UIInterfaceOrientationPortraitUpsideDown
54 | UIInterfaceOrientationLandscapeLeft
55 | UIInterfaceOrientationLandscapeRight
56 |
57 | UIViewControllerBasedStatusBarAppearance
58 |
59 |
60 |
61 |
--------------------------------------------------------------------------------
/ios/Runner/Runner-Bridging-Header.h:
--------------------------------------------------------------------------------
1 | #import "GeneratedPluginRegistrant.h"
2 |
--------------------------------------------------------------------------------
/ios/Runner/zh-Hans.lproj/LaunchScreen.strings:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/ios/Runner/zh-Hans.lproj/Main.strings:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/lib/core/http/http.dart:
--------------------------------------------------------------------------------
1 | import 'package:cookie_jar/cookie_jar.dart';
2 | import 'package:dio/dio.dart';
3 | import 'package:dio_cookie_manager/dio_cookie_manager.dart';
4 | import 'package:flutter_template/core/utils/path.dart';
5 |
6 | class XHttp {
7 | XHttp._internal();
8 |
9 | ///网络请求配置
10 | static final Dio dio = Dio(BaseOptions(
11 | baseUrl: "https://www.wanandroid.com",
12 | connectTimeout: 5000,
13 | receiveTimeout: 3000,
14 | ));
15 |
16 | ///初始化dio
17 | static void init() {
18 | ///初始化cookie
19 | PathUtils.getDocumentsDirPath().then((value) {
20 | var cookieJar =
21 | PersistCookieJar(storage: FileStorage(value + "/.cookies/"));
22 | dio.interceptors.add(CookieManager(cookieJar));
23 | });
24 |
25 | //添加拦截器
26 | dio.interceptors
27 | .add(InterceptorsWrapper(onRequest: (RequestOptions options, handler) {
28 | print("请求之前");
29 | return handler.next(options);
30 | }, onResponse: (Response response, handler) {
31 | print("响应之前");
32 | return handler.next(response);
33 | }, onError: (DioError e, handler) {
34 | print("错误之前");
35 | handleError(e);
36 | return handler.next(e);
37 | }));
38 | }
39 |
40 | ///error统一处理
41 | static void handleError(DioError e) {
42 | switch (e.type) {
43 | case DioErrorType.connectTimeout:
44 | print("连接超时");
45 | break;
46 | case DioErrorType.sendTimeout:
47 | print("请求超时");
48 | break;
49 | case DioErrorType.receiveTimeout:
50 | print("响应超时");
51 | break;
52 | case DioErrorType.response:
53 | print("出现异常");
54 | break;
55 | case DioErrorType.cancel:
56 | print("请求取消");
57 | break;
58 | default:
59 | print("未知错误");
60 | break;
61 | }
62 | }
63 |
64 | ///get请求
65 | static Future get(String url, [Map params]) async {
66 | Response response;
67 | if (params != null) {
68 | response = await dio.get(url, queryParameters: params);
69 | } else {
70 | response = await dio.get(url);
71 | }
72 | return response.data;
73 | }
74 |
75 | ///post 表单请求
76 | static Future post(String url, [Map params]) async {
77 | Response response = await dio.post(url, queryParameters: params);
78 | return response.data;
79 | }
80 |
81 | ///post body请求
82 | static Future postJson(String url, [Map data]) async {
83 | Response response = await dio.post(url, data: data);
84 | return response.data;
85 | }
86 |
87 | ///下载文件
88 | static Future downloadFile(urlPath, savePath) async {
89 | Response response;
90 | try {
91 | response = await dio.download(urlPath, savePath,
92 | onReceiveProgress: (int count, int total) {
93 | //进度
94 | print("$count $total");
95 | });
96 | } on DioError catch (e) {
97 | handleError(e);
98 | }
99 | return response.data;
100 | }
101 | }
102 |
--------------------------------------------------------------------------------
/lib/core/utils/click.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'toast.dart';
3 |
4 | class ClickUtils {
5 | ClickUtils._internal();
6 |
7 | static DateTime _lastPressedAt; //上次点击时间
8 |
9 | //双击返回
10 | static Future exitBy2Click(
11 | {int duration = 1000, ScaffoldState status}) async {
12 | if (status != null && status.isDrawerOpen) {
13 | return Future.value(true);
14 | }
15 |
16 | if (_lastPressedAt == null ||
17 | DateTime.now().difference(_lastPressedAt) >
18 | Duration(milliseconds: duration)) {
19 | //两次点击间隔超过1秒则重新计时
20 | ToastUtils.toast("再按一次退出程序");
21 | _lastPressedAt = DateTime.now();
22 | return Future.value(false);
23 | }
24 | return Future.value(true);
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/lib/core/utils/event.dart:
--------------------------------------------------------------------------------
1 | import 'dart:async';
2 |
3 | import 'package:event_bus/event_bus.dart';
4 |
5 | //EventBus工具类
6 | class XEvent {
7 | XEvent._internal();
8 |
9 | static Map sEventPool = {};
10 |
11 | static Map> sStreamPool = {};
12 |
13 | static EventBus getEvent(String eventName, {bool isSync = false}) {
14 | EventBus event = sEventPool[eventName];
15 | if (event == null) {
16 | event = new EventBus(sync: isSync);
17 | sEventPool[eventName] = event;
18 | }
19 | return event;
20 | }
21 |
22 | //订阅信息, 默认是异步的
23 | static StreamSubscription on(String eventName, void onData(T event),
24 | {bool isSync = false,
25 | Function onError,
26 | void onDone(),
27 | bool cancelOnError}) {
28 | StreamSubscription stream = getEvent(eventName, isSync: isSync)
29 | .on()
30 | .listen(onData,
31 | onError: onError, onDone: onDone, cancelOnError: cancelOnError);
32 |
33 | List streams = sStreamPool[eventName];
34 | if (streams == null) {
35 | streams = [];
36 | streams.add(stream);
37 | sStreamPool[eventName] = streams;
38 | } else {
39 | streams.add(stream);
40 | }
41 | return stream;
42 | }
43 |
44 | //事件发送
45 | static void post(String eventName, event) {
46 | EventBus eventBus = getEvent(eventName);
47 | eventBus.fire(event);
48 | }
49 |
50 | //订阅取消
51 | static void cancelAll(String eventName) {
52 | List streams = sStreamPool[eventName];
53 | if (streams != null) {
54 | for (StreamSubscription item in streams) {
55 | item.cancel();
56 | }
57 | streams.clear();
58 | }
59 | }
60 |
61 | //订阅取消
62 | static void cancel(String eventName, StreamSubscription subscription) {
63 | if (subscription == null) return;
64 | List streams = sStreamPool[eventName];
65 | if (streams != null) {
66 | subscription.cancel();
67 | streams.remove(subscription);
68 | }
69 | }
70 | }
71 |
--------------------------------------------------------------------------------
/lib/core/utils/locale.dart:
--------------------------------------------------------------------------------
1 | import 'dart:ui';
2 |
3 | import 'package:devicelocale/devicelocale.dart';
4 |
5 | class LocaleUtils {
6 |
7 | /// 内部构造方法,可避免外部暴露构造函数,进行实例化
8 | LocaleUtils._internal();
9 |
10 | static Locale _systemLocale;
11 |
12 | static Future init() async {
13 | _systemLocale = await getSystemLocaleAsync();
14 | }
15 |
16 | static Locale getSystemLocale() {
17 | return _systemLocale;
18 | }
19 |
20 | static Future getSystemLocaleAsync() async {
21 | String locale = await Devicelocale.currentLocale;
22 | var array = locale.split("_");
23 | if (array.length > 1) {
24 | return Locale(array[0], array[1]);
25 | }
26 | return null;
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/lib/core/utils/path.dart:
--------------------------------------------------------------------------------
1 | import 'dart:io';
2 | import 'package:path_provider/path_provider.dart';
3 |
4 | ///文件路径工具类
5 | class PathUtils {
6 | PathUtils._internal();
7 |
8 | ///获取缓存目录路径
9 | static Future getCacheDirPath() async {
10 | Directory directory = await getTemporaryDirectory();
11 | return directory.path;
12 | }
13 |
14 | ///获取文件缓存目录路径
15 | static Future getFilesDirPath() async {
16 | Directory directory = await getApplicationSupportDirectory();
17 | return directory.path;
18 | }
19 |
20 | ///获取文档存储目录路径
21 | static Future getDocumentsDirPath() async {
22 | Directory directory = await getApplicationDocumentsDirectory();
23 | return directory.path;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/lib/core/utils/privacy.dart:
--------------------------------------------------------------------------------
1 | import 'dart:io';
2 |
3 | import 'package:flutter/gestures.dart';
4 | import 'package:flutter/material.dart';
5 | import 'package:flutter_template/generated/i18n.dart';
6 | import 'package:flutter_template/router/router.dart';
7 | import 'utils.dart';
8 |
9 | //隐私弹窗工具
10 | class PrivacyUtils {
11 | PrivacyUtils._internal();
12 |
13 | //隐私服务政策地址
14 | static const PRIVACY_URL =
15 | 'https://gitee.com/xuexiangjys/flutter_template/raw/master/LICENSE';
16 |
17 | static void showPrivacyDialog(BuildContext context,
18 | {VoidCallback onAgressCallback}) {
19 | Utils.getPackageInfo().then((packageInfo) {
20 | showDialog(
21 | context: context,
22 | barrierDismissible: false,
23 | builder: (BuildContext context) {
24 | return AlertDialog(
25 | title: Text(I18n.of(context).reminder),
26 | content: SingleChildScrollView(
27 | child: ListBody(
28 | children: [
29 | Text(I18n.of(context).welcome(packageInfo.appName)),
30 | SizedBox(height: 5),
31 | Text(I18n.of(context).welcome1),
32 | SizedBox(height: 5),
33 | Text.rich(TextSpan(children: [
34 | TextSpan(text: I18n.of(context).welcome2),
35 | TextSpan(
36 | text: I18n.of(context).privacyName(packageInfo.appName),
37 | style: TextStyle(color: Theme.of(context).primaryColor),
38 | recognizer: TapGestureRecognizer()
39 | ..onTap = () {
40 | XRouter.goWeb(
41 | PRIVACY_URL,
42 | I18n.of(context)
43 | .privacyName(packageInfo.appName));
44 | }),
45 | TextSpan(text: I18n.of(context).welcome3),
46 | ])),
47 | SizedBox(height: 5),
48 | Text.rich(TextSpan(children: [
49 | TextSpan(text: I18n.of(context).welcome4),
50 | TextSpan(
51 | text: I18n.of(context).privacyName(packageInfo.appName),
52 | style: TextStyle(color: Theme.of(context).primaryColor),
53 | recognizer: TapGestureRecognizer()
54 | ..onTap = () {
55 | XRouter.goWeb(
56 | PRIVACY_URL,
57 | I18n.of(context)
58 | .privacyName(packageInfo.appName));
59 | }),
60 | TextSpan(text: I18n.of(context).welcome5),
61 | ])),
62 | ],
63 | ),
64 | ),
65 | actions: [
66 | TextButton(
67 | child: Text(I18n.of(context).disagree),
68 | onPressed: () {
69 | Navigator.of(context).pop();
70 | showPrivacySecond(context,
71 | onAgressCallback: onAgressCallback);
72 | },
73 | ),
74 | TextButton(
75 | child: Text(I18n.of(context).agree),
76 | onPressed: onAgressCallback == null
77 | ? () {
78 | Navigator.of(context).pop();
79 | }
80 | : onAgressCallback,
81 | ),
82 | ],
83 | );
84 | },
85 | );
86 | });
87 | }
88 |
89 | ///第二次提醒
90 | static void showPrivacySecond(BuildContext context,
91 | {VoidCallback onAgressCallback}) {
92 | Utils.getPackageInfo().then((packageInfo) {
93 | showDialog(
94 | context: context,
95 | barrierDismissible: false,
96 | builder: (BuildContext context) {
97 | return AlertDialog(
98 | title: Text(I18n.of(context).reminder),
99 | content: SingleChildScrollView(
100 | child: ListBody(
101 | children: [
102 | Text(I18n.of(context)
103 | .privacyExplainAgain(packageInfo.appName)),
104 | ],
105 | ),
106 | ),
107 | actions: [
108 | TextButton(
109 | child: Text(I18n.of(context).stillDisagree),
110 | onPressed: () {
111 | Navigator.of(context).pop();
112 | showPrivacyThird(context, onAgressCallback: onAgressCallback);
113 | },
114 | ),
115 | TextButton(
116 | child: Text(I18n.of(context).lookAgain),
117 | onPressed: () {
118 | Navigator.of(context).pop();
119 | showPrivacyDialog(context,
120 | onAgressCallback: onAgressCallback);
121 | },
122 | ),
123 | ],
124 | );
125 | },
126 | );
127 | });
128 | }
129 |
130 | ///第三次提醒
131 | static void showPrivacyThird(BuildContext context,
132 | {VoidCallback onAgressCallback}) {
133 | Utils.getPackageInfo().then((packageInfo) {
134 | showDialog(
135 | context: context,
136 | barrierDismissible: false,
137 | builder: (BuildContext context) {
138 | return AlertDialog(
139 | content: SingleChildScrollView(
140 | child: ListBody(
141 | children: [
142 | Text(I18n.of(context).thinkAboutItAgain),
143 | ],
144 | ),
145 | ),
146 | actions: [
147 | TextButton(
148 | child: Text(I18n.of(context).exitApp),
149 | onPressed: () {
150 | //退出程序
151 | // SystemNavigator.pop();
152 | exit(0);
153 | },
154 | ),
155 | TextButton(
156 | child: Text(I18n.of(context).lookAgain),
157 | onPressed: () {
158 | Navigator.of(context).pop();
159 | showPrivacyDialog(context,
160 | onAgressCallback: onAgressCallback);
161 | },
162 | ),
163 | ],
164 | );
165 | },
166 | );
167 | });
168 | }
169 | }
170 |
--------------------------------------------------------------------------------
/lib/core/utils/toast.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:oktoast/oktoast.dart';
3 |
4 | const DEFAULT_TOAST_DURATION = Duration(seconds: 2);
5 | const DEFAULT_TOAST_COLOR = Color(0xFF424242);
6 |
7 | class ToastUtils {
8 | ToastUtils._internal();
9 |
10 | ///全局初始化Toast配置, child为MaterialApp
11 | static init(Widget child) {
12 | return OKToast(
13 | ///字体大小
14 | textStyle: TextStyle(fontSize: 16, color: Colors.white),
15 | backgroundColor: DEFAULT_TOAST_COLOR,
16 | radius: 10,
17 | dismissOtherOnShow: true,
18 | textPadding: EdgeInsets.fromLTRB(20, 10, 20, 10),
19 | child: child,
20 | duration: DEFAULT_TOAST_DURATION,
21 | );
22 | }
23 |
24 | static void toast(String msg,
25 | {Duration duration = DEFAULT_TOAST_DURATION,
26 | Color color = DEFAULT_TOAST_COLOR}) {
27 | showToast(msg, duration: duration, backgroundColor: color);
28 | }
29 |
30 | static void waring(String msg, {Duration duration = DEFAULT_TOAST_DURATION}) {
31 | showToast(msg, duration: duration, backgroundColor: Colors.yellow);
32 | }
33 |
34 | static void error(String msg, {Duration duration = DEFAULT_TOAST_DURATION}) {
35 | showToast(msg, duration: duration, backgroundColor: Colors.red);
36 | }
37 |
38 | static void success(String msg,
39 | {Duration duration = DEFAULT_TOAST_DURATION}) {
40 | showToast(msg, duration: duration, backgroundColor: Colors.lightGreen);
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/lib/core/utils/utils.dart:
--------------------------------------------------------------------------------
1 |
2 | import 'package:date_format/date_format.dart';
3 | import 'package:package_info/package_info.dart';
4 | import 'package:url_launcher/url_launcher.dart';
5 |
6 | import 'toast.dart';
7 |
8 | ///常用工具类
9 | class Utils {
10 | Utils._internal();
11 |
12 | //=============url_launcher==================//
13 |
14 | ///处理链接
15 | static void launchURL(String url) async {
16 | if (await canLaunch(url)) {
17 | await launch(url);
18 | } else {
19 | ToastUtils.error("暂不能处理这条链接:$url");
20 | }
21 | }
22 |
23 | //=============package_info==================//
24 |
25 | ///获取应用包信息
26 | static Future getPackageInfo() {
27 | return PackageInfo.fromPlatform();
28 | }
29 |
30 | ///获取应用包信息
31 | static Future