From 0fd620051053c237c4cae90bf5ee4c9e049709a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B0=B8=E8=89=AF?= Date: Fri, 21 Jan 2022 15:29:53 +0800 Subject: [PATCH 01/22] =?UTF-8?q?=E6=9B=B4=E6=96=B0(=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E8=84=9A=E6=9C=AC&=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E6=9B=B4=E6=96=B0=E5=B1=95=E7=A4=BA)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- auto_build_push.sh | 2 +- lib/me/me_page.dart | 2 +- lib/me/service/me_service_impl.dart | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/auto_build_push.sh b/auto_build_push.sh index ee1a372..832108f 100644 --- a/auto_build_push.sh +++ b/auto_build_push.sh @@ -11,7 +11,7 @@ needUpload="on" buildType="" #构建输出目录 -outputs=build\\app\\outputs\\flutter-apk\\ +outputs=build/app/outputs/flutter-apk/ #文件名 filename="app-debug.apk" diff --git a/lib/me/me_page.dart b/lib/me/me_page.dart index c5ab884..11035e2 100644 --- a/lib/me/me_page.dart +++ b/lib/me/me_page.dart @@ -85,7 +85,7 @@ class _MePageState extends State with AutomaticKeepAliveClientMixin { await SPUtils.getInstance().getRememberPassword() ?? false; PackageInfo packageInfo = await PackageInfo.fromPlatform(); - versionName = packageInfo.version; + versionName = "v${packageInfo.version}"; setState(() {}); } diff --git a/lib/me/service/me_service_impl.dart b/lib/me/service/me_service_impl.dart index 21e7fec..bc9f7d4 100644 --- a/lib/me/service/me_service_impl.dart +++ b/lib/me/service/me_service_impl.dart @@ -48,6 +48,7 @@ class MeServiceImpl extends MeService { if (await _isNeedUpdate(value.data!)) { showEasyDialog( context: context, + title: "版本更新", type: EasyDialogType.NormalTwoRowBtn, content: updateContent, contentTextAlign: TextAlign.start, -- Gitee From ad78270fc8b3ed415ecb92a1a21ef4b81de3ab24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B0=B8=E8=89=AF?= Date: Fri, 21 Jan 2022 16:09:00 +0800 Subject: [PATCH 02/22] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/global_model.dart | 13 +++- lib/me/me_page.dart | 3 +- lib/me/service/me_service_impl.dart | 98 +++++++++++++++++------------ 3 files changed, 71 insertions(+), 43 deletions(-) diff --git a/lib/global_model.dart b/lib/global_model.dart index b1f89e0..6588ea3 100644 --- a/lib/global_model.dart +++ b/lib/global_model.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutterapp/common/base/base_mode.dart'; import 'package:flutterapp/common/util/log_utils.dart'; import 'package:flutterapp/common/util/theme_data_utils.dart'; +import 'package:package_info/package_info.dart'; import 'common/util/sp_utils.dart'; /// 全局数据模型类,需要在启动时放入 @@ -11,6 +12,9 @@ class GLobalModel extends BaseModel { /// 当前主题 ThemeData? curTheme; + /// 当前包的信息 + PackageInfo? packageInfo; + GLobalModel() { init(); } @@ -34,11 +38,16 @@ class GLobalModel extends BaseModel { }); } + Future initPackageInfo() { + return PackageInfo.fromPlatform().then((value) { + packageInfo = value; + return true; + }); + } + /// 刷新当前主题 void refreshCurTheme(int position) { curTheme = ThemeDataUtils.getThemeByIndex(position); notifyListeners(); } - - } diff --git a/lib/me/me_page.dart b/lib/me/me_page.dart index 11035e2..a0191bb 100644 --- a/lib/me/me_page.dart +++ b/lib/me/me_page.dart @@ -85,7 +85,8 @@ class _MePageState extends State with AutomaticKeepAliveClientMixin { await SPUtils.getInstance().getRememberPassword() ?? false; PackageInfo packageInfo = await PackageInfo.fromPlatform(); - versionName = "v${packageInfo.version}"; + bool haveUpdate = await MeServiceImpl.getInstance().checkNeedUpdate(); + versionName = "v${packageInfo.version}${haveUpdate ? "(有更新)" : ""}"; setState(() {}); } diff --git a/lib/me/service/me_service_impl.dart b/lib/me/service/me_service_impl.dart index bc9f7d4..ea50a36 100644 --- a/lib/me/service/me_service_impl.dart +++ b/lib/me/service/me_service_impl.dart @@ -2,7 +2,6 @@ import 'package:dio/dio.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutterapp/common/constant/API.dart'; import 'package:flutterapp/common/util/dialog_utils.dart'; -import 'package:flutterapp/common/util/log_utils.dart'; import 'package:flutterapp/common/util/toast_utils.dart'; import 'package:flutterapp/http/http_utils.dart'; import 'package:flutterapp/me/service/me_service.dart'; @@ -14,7 +13,7 @@ class MeServiceImpl extends MeService { static MeServiceImpl? _instance; /// 版本升级提示内容 - String updateContent = ''; + String _updateContent = ''; static MeServiceImpl getInstance() { if (_instance == null) _instance = MeServiceImpl._(); @@ -39,48 +38,67 @@ class MeServiceImpl extends MeService { } /// 自动检测下载安装 - void autoCheckUpdate(BuildContext context) { - appCheck().then((value) async { - if (value?.data?.downloadUrl == null || - value!.data!.downloadUrl!.isEmpty) { - shortToast('当前已是最新版本!'); + Future autoCheckUpdate(BuildContext context) async { + try { + // 请求后台数据 + AppCheckEntity? appCheckEntity = await appCheck(); + // 获取本地包的数据 + PackageInfo packageInfo = await PackageInfo.fromPlatform(); + //远程的版本号不同于本地,且版本编号大于本地 + int localBuildNo = int.tryParse(packageInfo.buildNumber) ?? 0; + int originBuildNo = + int.tryParse(appCheckEntity?.data?.buildVersionNo ?? '') ?? 0; + // 设置弹窗提示内容 + _updateContent = + "更新内容:\n${appCheckEntity?.data?.buildUpdateDescription ?? ''}\n\n版本: ${packageInfo.version}->${appCheckEntity?.data?.buildVersion}"; + + // 更新逻辑(版本名称不同且远程版本编号大于本地版本编号) + if (packageInfo.version != appCheckEntity?.data?.buildVersion && + originBuildNo > localBuildNo) { + showEasyDialog( + context: context, + title: "版本更新", + type: EasyDialogType.NormalTwoRowBtn, + content: _updateContent, + contentTextAlign: TextAlign.start, + leftOrTopBtnText: '忽略此版本', + rightOrBottomBtnText: '确定升级', + leftOrTopOnTap: (context) => Navigator.pop(context), + rightOrBottomOnTap: (context) { + Navigator.pop(context); + RUpgrade.upgrade( + appCheckEntity?.data?.downloadUrl ?? '', + fileName: 'wan-android-release.apk', + isAutoRequestInstall: true, + ); + }, + ); } else { - if (await _isNeedUpdate(value.data!)) { - showEasyDialog( - context: context, - title: "版本更新", - type: EasyDialogType.NormalTwoRowBtn, - content: updateContent, - contentTextAlign: TextAlign.start, - leftOrTopBtnText: '忽略此版本', - rightOrBottomBtnText: '确定升级', - leftOrTopOnTap: (context) => Navigator.pop(context), - rightOrBottomOnTap: (context) { - Navigator.pop(context); - RUpgrade.upgrade( - value.data?.downloadUrl ?? '', - fileName: 'wan-android-release.apk', - isAutoRequestInstall: true, - ); - }, - ); - } else { - shortToast('当前已是最新版本!'); - } + shortToast('当前已是最新版本!'); } - }); + } catch (e) { + shortToast(e.toString()); + } } - /// 是否有新版本 - Future _isNeedUpdate(AppCheckData data) { - return PackageInfo.fromPlatform().then((value) { - LogUtils.d('本地包的信息为:$value'); + /// 检测是否有更新 + Future checkNeedUpdate() async { + try { + // 请求后台数据 + AppCheckEntity? appCheckEntity = await appCheck(); + // 获取本地包的数据 + PackageInfo packageInfo = await PackageInfo.fromPlatform(); //远程的版本号不同于本地,且版本编号大于本地 - int localBuildNo = int.tryParse(value.buildNumber) ?? 0; - int originBuildNo = int.tryParse(data.buildVersionNo ?? '') ?? 0; - updateContent = - "更新内容:\n${data.buildUpdateDescription ?? ''}\n\n版本: ${value.version}->${data.buildVersion}"; - return value.version != data.buildVersion && originBuildNo > localBuildNo; - }); + int localBuildNo = int.tryParse(packageInfo.buildNumber) ?? 0; + int originBuildNo = + int.tryParse(appCheckEntity?.data?.buildVersionNo ?? '') ?? 0; + + // 更新逻辑(版本名称不同且远程版本编号大于本地版本编号) + return packageInfo.version != appCheckEntity?.data?.buildVersion && + originBuildNo > localBuildNo; + } catch (e) { + shortToast(e.toString()); + return false; + } } } -- Gitee From 21673de133dc5429f2b541a6daa1edd6216c1383 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B0=B8=E8=89=AF?= Date: Fri, 21 Jan 2022 16:26:31 +0800 Subject: [PATCH 03/22] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/local.properties | 4 +-- lib/main.dart | 8 +++-- lib/me/me_page.dart | 31 +++++++++++++++++++ lib/me/page/update_theme_page.dart | 4 +-- .../global_app_model.dart} | 19 +++++------- lib/provider/global_user_model.dart | 10 ++++++ pubspec.yaml | 2 +- 7 files changed, 58 insertions(+), 20 deletions(-) rename lib/{global_model.dart => provider/global_app_model.dart} (72%) create mode 100644 lib/provider/global_user_model.dart diff --git a/android/local.properties b/android/local.properties index 67f11e2..9ba4cdf 100644 --- a/android/local.properties +++ b/android/local.properties @@ -1,5 +1,5 @@ sdk.dir=C:\\Users\\admin\\AppData\\Local\\Android\\Sdk flutter.sdk=D:\\Smaboy\\source\\flutter flutter.buildMode=debug -flutter.versionName=1.0.4 -flutter.versionCode=5 \ No newline at end of file +flutter.versionName=1.0.5 +flutter.versionCode=6 \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index 985ad8a..a6fab4c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:flutterapp/global_model.dart'; +import 'package:flutterapp/provider/global_app_model.dart'; +import 'package:flutterapp/provider/global_user_model.dart'; import 'package:provider/provider.dart'; import 'common/util/global_utils.dart'; @@ -10,7 +11,8 @@ void main() { //程序入口 runApp(MultiProvider( providers: [ - ChangeNotifierProvider(create: (_) => GLobalModel()), + ChangeNotifierProvider(create: (_) => GLobalAppModel()), + ChangeNotifierProvider(create: (_) => GlobalUserModel()), ], child: MyApp(), )); @@ -25,7 +27,7 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( - theme: Provider.of(context).curTheme, + theme: Provider.of(context).curTheme, darkTheme: ThemeData.dark(), home: MyWillPopScope( child: MainPage(), diff --git a/lib/me/me_page.dart b/lib/me/me_page.dart index a0191bb..8ead7b8 100644 --- a/lib/me/me_page.dart +++ b/lib/me/me_page.dart @@ -338,3 +338,34 @@ class MeListItem extends StatelessWidget { ); } } + +// class MeModel extends BaseModel { + +// Image _backGroundImage = Image( +// image: AssetImage("images/lake.jpg"), +// fit: BoxFit.fill, +// ); +// final picker = ImagePicker(); + +// //判断用户是否登录 +// var isLogin = false; + +// //用户名称 +// var userName = ""; + +// //密码 +// var password = ""; + +// // 记住密码 +// var rememberPassword = false; + +// late StreamSubscription loginSubscription; + +// String? versionName; + + +// @override +// Future init() { +// return Future.value(true); +// } +// } diff --git a/lib/me/page/update_theme_page.dart b/lib/me/page/update_theme_page.dart index 8393e9d..b97182a 100644 --- a/lib/me/page/update_theme_page.dart +++ b/lib/me/page/update_theme_page.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutterapp/common/util/log_utils.dart'; import 'package:flutterapp/common/util/sp_utils.dart'; import 'package:flutterapp/common/util/theme_data_utils.dart'; -import 'package:flutterapp/global_model.dart'; +import 'package:flutterapp/provider/global_app_model.dart'; import 'package:provider/provider.dart'; class UpdateThemePage extends StatefulWidget { @@ -105,7 +105,7 @@ class _UpdateThemePageState extends State { }); // 发送通知,主题改变了 - Provider.of(context, listen: false) + Provider.of(context, listen: false) .refreshCurTheme(_selectedIndex); } diff --git a/lib/global_model.dart b/lib/provider/global_app_model.dart similarity index 72% rename from lib/global_model.dart rename to lib/provider/global_app_model.dart index 6588ea3..d790ba1 100644 --- a/lib/global_model.dart +++ b/lib/provider/global_app_model.dart @@ -1,31 +1,26 @@ import 'package:flutter/material.dart'; -import 'package:flutterapp/common/base/base_mode.dart'; import 'package:flutterapp/common/util/log_utils.dart'; import 'package:flutterapp/common/util/theme_data_utils.dart'; import 'package:package_info/package_info.dart'; -import 'common/util/sp_utils.dart'; +import '../common/util/sp_utils.dart'; /// 全局数据模型类,需要在启动时放入 /// -/// 放置一些全局的数据,比如登录数据,设备数据,主题数据等 -class GLobalModel extends BaseModel { +/// 放置一些全局的数据,比如包数据,主题数据等 +class GLobalAppModel extends ChangeNotifier { /// 当前主题 ThemeData? curTheme; /// 当前包的信息 PackageInfo? packageInfo; - GLobalModel() { + GLobalAppModel() { init(); } - @override - Future init() { - return Future.wait( - [ - initCurTheme(), - ], - ).then((value) => true); + init() { + initCurTheme(); + initPackageInfo(); } /// 初始化主题数据 diff --git a/lib/provider/global_user_model.dart b/lib/provider/global_user_model.dart new file mode 100644 index 0000000..5b356fe --- /dev/null +++ b/lib/provider/global_user_model.dart @@ -0,0 +1,10 @@ +import 'package:flutter/cupertino.dart'; + +/// 全局用户数据模型 +class GlobalUserModel extends ChangeNotifier { + + /// 是否登录 + bool isLogin = false; + + /// 用户名 +} diff --git a/pubspec.yaml b/pubspec.yaml index a7cd54a..0290b2a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -18,7 +18,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # version统一版本名称和版本号,'+'前面的为版本名称,后面的为版本号 -version: 1.0.6+7 +version: 1.0.5+6 environment: sdk: ">=2.12.0 <3.0.0" -- Gitee From e87fa419cdf387129a8df0fefe56c3da927afc76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B0=B8=E8=89=AF?= Date: Fri, 21 Jan 2022 17:03:50 +0800 Subject: [PATCH 04/22] =?UTF-8?q?=E6=9B=B4=E6=96=B0(=E4=BF=AE=E6=94=B9andr?= =?UTF-8?q?oid=E6=89=93=E5=8C=85=E9=85=8D=E7=BD=AE)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/app/build.gradle | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 2c178dd..763aad6 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -21,6 +21,11 @@ if (flutterVersionName == null) { flutterVersionName = '1.0.0' } +def isDebug = localProperties.getProperty('flutter.buildMode') +if (isDebug == null) { + isDebug= 'debug' +} + apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" @@ -53,17 +58,40 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.smaboy.f_wanandroid" + if(isDebug == 'debug'){ + applicationId "com.smaboy.f_wanandroid.debug" + }else{ + applicationId "com.smaboy.f_wanandroid" + } minSdkVersion 20 targetSdkVersion 31 versionCode flutterVersionCode.toInteger() versionName flutterVersionName + // multiDexEnabled true } buildTypes { release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig signingConfigs.release + minifyEnabled true + shrinkResources true + zipAlignEnabled true + // useProguard true + // proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + ndk { + //选择要添加的对应 cpu 类型的 .so 库。 + abiFilters "armeabi","armeabi-v7a" //"arm64-v8a" , + } + } + debug { signingConfig signingConfigs.debug + minifyEnabled false + // useProguard false + // proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + ndk { + //选择要添加的对应 cpu 类型的 .so 库。 + abiFilters "armeabi", "armeabi-v7a","arm64-v8a","x86","x86_64" + } } } } @@ -74,4 +102,5 @@ flutter { dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + // implementation group: 'androidx.multidex', name: 'multidex', version: '2.0.1' } -- Gitee From 3c75174eb4f2c3b5a72b48c14ce03b981313a721 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B0=B8=E8=89=AF?= Date: Fri, 21 Jan 2022 17:59:57 +0800 Subject: [PATCH 05/22] =?UTF-8?q?=E4=BD=93=E7=B3=BB=E5=92=8C=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E9=A1=B5=E9=9D=A2=E6=94=B9=E9=80=A0=E5=AE=8C=E6=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/item/ItemPage.dart | 90 ++++++++++-------- lib/system/SystemPage.dart | 190 +++++++++++++++++++------------------ 2 files changed, 146 insertions(+), 134 deletions(-) diff --git a/lib/item/ItemPage.dart b/lib/item/ItemPage.dart index 44f5c49..41624fd 100644 --- a/lib/item/ItemPage.dart +++ b/lib/item/ItemPage.dart @@ -1,5 +1,8 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:flutterapp/common/base/base_mode.dart'; +import 'package:flutterapp/common/base/base_page.dart'; +import 'package:flutterapp/common/base/base_provider.dart'; import 'package:flutterapp/common/util/router_helpe_utils.dart'; import 'package:flutterapp/common/util/log_utils.dart'; import 'package:flutterapp/common/page/webview_page.dart'; @@ -21,55 +24,40 @@ class ItemPage extends StatefulWidget { class _ItemPageState extends State with AutomaticKeepAliveClientMixin { - //项目子项集合 - List? data; - @override Widget build(BuildContext context) { super.build(context); - return DefaultTabController( - length: data?.length ?? 0, - initialIndex: 0, - child: Scaffold( - appBar: AppBar( - title: Text(widget.title ?? ''), - centerTitle: true, - bottom: TabBar( - isScrollable: true, - tabs: getTitleItems(), - ), - ), - body: TabBarView( - children: getContentItems(), - )), + return BaseProvider( + model: ItemModel(), + modelBuilder: (context, model) { + return DefaultTabController( + length: model.data?.length ?? 0, + initialIndex: 0, + child: BasePage( + appBar: AppBar( + title: Text(widget.title ?? ''), + centerTitle: true, + bottom: TabBar( + isScrollable: true, + tabs: getTitleItems(model), + ), + ), + child: TabBarView( + children: getContentItems(model), + )), + ); + }, ); } - @override - void initState() { - super.initState(); - initData(); - } - - void initData() async { - ItemTreeEntity itemTreeEntity = - await ItemServiceImpl.getInstance().getItemTree(); - setState(() { - if (itemTreeEntity.data != null && - (itemTreeEntity.data?.length ?? 0) > 0) { - this.data = itemTreeEntity.data; - } - }); - LogUtils.d("ItemTreeEntity==第一个标题==${itemTreeEntity.data![0].name}"); - } /// 项目页面标题组件子项集合 - List getTitleItems() { + List getTitleItems(ItemModel model) { var tabs = []; - if (data != null && (data?.length ?? 0) > 0) { - for (ItemTreeData itemTreeData in data!) { + if (model.data != null && (model.data?.length ?? 0) > 0) { + for (ItemTreeData itemTreeData in model.data!) { tabs.add(Tab( child: Text(itemTreeData.name ?? ''), )); @@ -79,10 +67,10 @@ class _ItemPageState extends State } /// 项目页面标题组件子项集合 - List getContentItems() { + List getContentItems(ItemModel model) { var tabViewChildren = []; - if (data != null && (data?.length ?? 0) > 0) { - for (ItemTreeData itemTreeData in data!) { + if (model.data != null && (model.data?.length ?? 0) > 0) { + for (ItemTreeData itemTreeData in model.data!) { tabViewChildren.add(ContentWidget(id: itemTreeData.id ?? 0)); } } @@ -368,3 +356,23 @@ class ContentEndWidget extends StatelessWidget { ); } } + +class ItemModel extends BaseModel { + //项目子项集合 + List? data; + + @override + Future init() { + return initData(); + } + + Future initData() { + return ItemServiceImpl.getInstance().getItemTree().then((value) { + if (value.data != null && (value.data?.length ?? 0) > 0) { + this.data = value.data; + return true; + } + return false; + }); + } +} diff --git a/lib/system/SystemPage.dart b/lib/system/SystemPage.dart index 8258fcc..73b9537 100644 --- a/lib/system/SystemPage.dart +++ b/lib/system/SystemPage.dart @@ -1,4 +1,7 @@ import 'package:flutter/material.dart'; +import 'package:flutterapp/common/base/base_mode.dart'; +import 'package:flutterapp/common/base/base_page.dart'; +import 'package:flutterapp/common/base/base_provider.dart'; import 'package:flutterapp/common/constant/API.dart'; import 'package:flutterapp/common/util/router_helpe_utils.dart'; import 'package:flutterapp/common/util/log_utils.dart'; @@ -21,97 +24,23 @@ class SystemPage extends StatefulWidget { class SystemPageState extends State with AutomaticKeepAliveClientMixin { - /// 标题数据 - SystemTreeEntity? _systemTreeEntity; - - /// 被选中的一级标题,默认选中第一个 - int _selectedPosition = 0; - - ///应该展示的二级目录标题数据 - var _secondTitleData = SystemTreeData(); - @override Widget build(BuildContext context) { super.build(context); - return Scaffold( - appBar: AppBar( - title: Text(widget.title ?? ''), - centerTitle: true, - ), - body: getTitleTreeWidget(), - ); - } - - @override - void initState() { - super.initState(); - - //初始化数据 - initTreeData(); - } - - ///初始化标题数据 - void initTreeData() async { - - SystemTreeEntity? data = await HttpUtils.getInstance().get2(API.systemTree, - isNeedCache: true); - setState(() { - //设置标题数据 - _systemTreeEntity = data; - //设置二级标题数据 - if (_systemTreeEntity?.data != null && - _systemTreeEntity!.data!.length > 0) { - _secondTitleData = _systemTreeEntity!.data![_selectedPosition]; - } - }); - } - - ///获取二级标题item组件集合 - List getSecondTitleTreeItemWidgets(SystemTreeData systemTreeData) { - var titleTreeWidgets = []; - if (systemTreeData.children != null && - systemTreeData.children!.length > 0) { - for (var i = 0; i < systemTreeData.children!.length; i++) { - var child = systemTreeData.children![i]; - titleTreeWidgets.add(ElevatedButton( - child: Text( - child.name ?? '', - ), - // color: Theme.of(context).primaryColor == MyColors.white ? Colors.blueAccent : Theme.of(context).primaryColor, - // highlightColor: Theme.of(context).primaryColor, - // colorBrightness: Brightness.dark, - // splashColor: Colors.grey[700], - // shape:RoundedRectangleBorder(borderRadius: BorderRadius.circular(10.0)), - onPressed: () { - RouteHelpUtils.push( - context, - SystemItemDetailsPage( - title: systemTreeData.name, - tabList: systemTreeData.children, - position: i, - )); - })); - } - - LogUtils.d("第一个标题为:${systemTreeData.children![0].name}"); - } - - LogUtils.d("titleTreeWidgets的长度为:${titleTreeWidgets.length}"); - - return titleTreeWidgets; - } - - ///获取标题树组件 - Widget getTitleTreeWidget() { - return Container( + return BaseProvider( + model: SystemModel(), + modelBuilder: (context, model) { + return BasePage( + title: widget.title ?? '', + child: Container( child: Row( mainAxisSize: MainAxisSize.max, children: [ Container( width: 100.0, child: ListView.separated( - itemCount: _systemTreeEntity?.data?.length ?? 0, + itemCount: model.systemTreeEntity?.data?.length ?? 0, separatorBuilder: (buildContext, index) { return Divider( height: 2.0, @@ -120,18 +49,18 @@ class SystemPageState extends State }, itemBuilder: (BuildContext context, int index) { return Container( - color: index == _selectedPosition + color: index == model.selectedPosition ? Colors.grey[100] : Colors.white, child: Row( children: [ Visibility( - visible: index == _selectedPosition, + visible: index == model.selectedPosition, child: Container( - color: - Theme.of(context).primaryColor == ThemeDataUtils.white - ? Colors.blueAccent - : Theme.of(context).primaryColor, + color: Theme.of(context).primaryColor == + ThemeDataUtils.white + ? Colors.blueAccent + : Theme.of(context).primaryColor, width: 5.0, height: 30.0, ), @@ -139,9 +68,9 @@ class SystemPageState extends State Expanded( child: ListTile( title: Text( - _systemTreeEntity!.data![index].name ?? '', + model.systemTreeEntity!.data![index].name ?? '', style: TextStyle( - color: index == _selectedPosition + color: index == model.selectedPosition ? (Theme.of(context).primaryColor == ThemeDataUtils.white ? Colors.blueAccent @@ -151,10 +80,10 @@ class SystemPageState extends State onTap: () { setState(() { //设置被点击位置 - _selectedPosition = index; + model.selectedPosition = index; //设置应该被展示的二级标题 - _secondTitleData = - _systemTreeEntity!.data![index]; + model.secondTitleData = + model.systemTreeEntity!.data![index]; }); }, ), @@ -177,7 +106,7 @@ class SystemPageState extends State spacing: 10.0, // 主轴(水平)方向间距 runSpacing: 4.0, // 纵轴(垂直)方向间距 alignment: WrapAlignment.start, //沿主轴方向居中 - children: getSecondTitleTreeItemWidgets(_secondTitleData), + children: getSecondTitleTreeItemWidgets(model.secondTitleData), ), ), ), @@ -185,9 +114,84 @@ class SystemPageState extends State //二级标题 ], ), + ), + ); + }, ); } + @override + void initState() { + super.initState(); + } + + ///获取二级标题item组件集合 + List getSecondTitleTreeItemWidgets(SystemTreeData? systemTreeData) { + var titleTreeWidgets = []; + if (systemTreeData?.children != null && + systemTreeData!.children!.length > 0) { + for (var i = 0; i < systemTreeData.children!.length; i++) { + var child = systemTreeData.children![i]; + titleTreeWidgets.add(ElevatedButton( + child: Text( + child.name ?? '', + ), + // color: Theme.of(context).primaryColor == MyColors.white ? Colors.blueAccent : Theme.of(context).primaryColor, + // highlightColor: Theme.of(context).primaryColor, + // colorBrightness: Brightness.dark, + // splashColor: Colors.grey[700], + // shape:RoundedRectangleBorder(borderRadius: BorderRadius.circular(10.0)), + onPressed: () { + RouteHelpUtils.push( + context, + SystemItemDetailsPage( + title: systemTreeData.name, + tabList: systemTreeData.children, + position: i, + )); + })); + } + + LogUtils.d("第一个标题为:${systemTreeData.children![0].name}"); + } + + LogUtils.d("titleTreeWidgets的长度为:${titleTreeWidgets.length}"); + + return titleTreeWidgets; + } + + @override bool get wantKeepAlive => true; } + +class SystemModel extends BaseModel { + /// 标题数据 + SystemTreeEntity? systemTreeEntity; + + /// 被选中的一级标题,默认选中第一个 + int selectedPosition = 0; + + ///应该展示的二级目录标题数据 + SystemTreeData? secondTitleData; + + @override + Future init() { + return initTreeData(); + } + + ///初始化标题数据 + Future initTreeData() { + return HttpUtils.getInstance().get2(API.systemTree, + onSuccess: (data) { + //设置标题数据 + systemTreeEntity = data; + //设置二级标题数据 + if (systemTreeEntity?.data != null && + systemTreeEntity!.data!.length > 0) { + secondTitleData = systemTreeEntity!.data![selectedPosition]; + } + notifyListeners(); + }, isNeedCache: true).then((value) => value != null); + } +} -- Gitee From ae5daca2cff0a5e96567da982c0b34615498c417 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B0=B8=E8=89=AF?= Date: Thu, 17 Feb 2022 15:34:09 +0800 Subject: [PATCH 06/22] =?UTF-8?q?=E6=9B=B4=E6=96=B0(=E4=BF=AE=E6=94=B9buil?= =?UTF-8?q?dtools=E3=80=81gradle=E7=89=88=E6=9C=AC)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/build.gradle | 4 ++-- android/gradle/wrapper/gradle-wrapper.properties | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index fb7ffaf..4dc3182 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,5 +1,5 @@ buildscript { - ext.kotlin_version = '1.6.10' + ext.kotlin_version = '1.6.0' repositories { google() jcenter() @@ -7,7 +7,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:7.0.3' + classpath 'com.android.tools.build:gradle:3.6.4' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index b8793d3..2210ceb 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.4.1-all.zip -- Gitee From 1ff57035a06f80627ae1517395a037ea1137e740 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B0=B8=E8=89=AF?= Date: Thu, 17 Feb 2022 15:40:58 +0800 Subject: [PATCH 07/22] =?UTF-8?q?=E6=9B=B4=E6=96=B0(=E4=BF=AE=E6=94=B9buil?= =?UTF-8?q?d.gradle)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/app/build.gradle | 10 +++ android/app/src/debug/AndroidManifest.xml | 87 ++++++++++++++++++++- android/app/src/main/res/values/strings.xml | 1 + 3 files changed, 95 insertions(+), 3 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 763aad6..2af7036 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -70,6 +70,16 @@ android { // multiDexEnabled true } + sourceSets { + main { + if (isDebug == 'debug') { + manifest.srcFile 'src/debug/AndroidManifest.xml' + } else { + manifest.srcFile 'src/main/AndroidManifest.xml' + } + } + } + buildTypes { release { signingConfig signingConfigs.release diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml index 7651d8e..1abe9e8 100644 --- a/android/app/src/debug/AndroidManifest.xml +++ b/android/app/src/debug/AndroidManifest.xml @@ -1,7 +1,88 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index e0f749a..506dca0 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -1,4 +1,5 @@ 玩安卓 + 玩安卓测试版 \ No newline at end of file -- Gitee From 0c3c1e344024cc7b645f9fbeaab64083cc2d3365 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B0=B8=E8=89=AF?= Date: Thu, 17 Feb 2022 16:22:40 +0800 Subject: [PATCH 08/22] =?UTF-8?q?=E6=9B=B4=E6=96=B0(=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=86=85=E5=AE=B9=E5=A2=9E=E5=8A=A0=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=A4=A7=E5=B0=8F)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/app/build.gradle | 7 +++---- lib/me/service/me_service_impl.dart | 9 +++++++-- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 2af7036..159c81c 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -56,8 +56,7 @@ android { } defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId "com.smaboy.f_wanandroid" + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html) if(isDebug == 'debug'){ applicationId "com.smaboy.f_wanandroid.debug" }else{ @@ -67,7 +66,7 @@ android { targetSdkVersion 31 versionCode flutterVersionCode.toInteger() versionName flutterVersionName - // multiDexEnabled true + multiDexEnabled true } sourceSets { @@ -112,5 +111,5 @@ flutter { dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - // implementation group: 'androidx.multidex', name: 'multidex', version: '2.0.1' + implementation group: 'androidx.multidex', name: 'multidex', version: '2.0.1' } diff --git a/lib/me/service/me_service_impl.dart b/lib/me/service/me_service_impl.dart index ea50a36..501ad80 100644 --- a/lib/me/service/me_service_impl.dart +++ b/lib/me/service/me_service_impl.dart @@ -49,8 +49,13 @@ class MeServiceImpl extends MeService { int originBuildNo = int.tryParse(appCheckEntity?.data?.buildVersionNo ?? '') ?? 0; // 设置弹窗提示内容 - _updateContent = - "更新内容:\n${appCheckEntity?.data?.buildUpdateDescription ?? ''}\n\n版本: ${packageInfo.version}->${appCheckEntity?.data?.buildVersion}"; + String updateContent = + "更新内容:\n${appCheckEntity?.data?.buildUpdateDescription ?? ''}\n\n"; + String versionContent = + "版本: ${packageInfo.version} → ${appCheckEntity?.data?.buildVersion}\n"; + String fileSize = + "大小: ${((int.tryParse(appCheckEntity?.data?.buildFileSize ?? "") ?? 0) / (1024 * 1024)).toStringAsFixed(1)}M"; + _updateContent = "$updateContent$versionContent$fileSize"; // 更新逻辑(版本名称不同且远程版本编号大于本地版本编号) if (packageInfo.version != appCheckEntity?.data?.buildVersion && -- Gitee From 846b05c69eb964a3797d6924fb9ff1c21eca2c80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B0=B8=E8=89=AF?= <18550019225@163.com> Date: Thu, 17 Feb 2022 16:42:34 +0800 Subject: [PATCH 09/22] =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=8D=87=E7=BA=A7?= =?UTF-8?q?=E5=88=B01.0.7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- auto_build_push.sh | 8 +++----- pubspec.yaml | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/auto_build_push.sh b/auto_build_push.sh index 832108f..da6e3b5 100644 --- a/auto_build_push.sh +++ b/auto_build_push.sh @@ -18,11 +18,9 @@ filename="app-debug.apk" #更新日志 buildUpdateDescription=""" -1. 适配flutter空安全; -2. 优化网络框架; -3. 基类组件搭建; -4. 添加版本检测更新功能; -5. 优化代码; +1. 修改android打包策略; +2. 所有页面改造完毕; +3. 代码优化 """ helper() { echo "请输入参数" diff --git a/pubspec.yaml b/pubspec.yaml index 0290b2a..dc3819b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -18,7 +18,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # version统一版本名称和版本号,'+'前面的为版本名称,后面的为版本号 -version: 1.0.5+6 +version: 1.0.7+8 environment: sdk: ">=2.12.0 <3.0.0" -- Gitee From 830ede98f3a8d77928ed68859895e7c4e066ddc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B0=B8=E8=89=AF?= Date: Thu, 17 Feb 2022 17:07:42 +0800 Subject: [PATCH 10/22] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- auto_build_push.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/auto_build_push.sh b/auto_build_push.sh index da6e3b5..73e6561 100644 --- a/auto_build_push.sh +++ b/auto_build_push.sh @@ -18,9 +18,9 @@ filename="app-debug.apk" #更新日志 buildUpdateDescription=""" -1. 修改android打包策略; -2. 所有页面改造完毕; -3. 代码优化 +1. 修改android打包策略. +2. 所有页面改造完毕. +3. 代码优化. """ helper() { echo "请输入参数" -- Gitee From 4b284d6060fe86146970dd3aa8b9cd3b5fe6bb1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B0=B8=E8=89=AF?= Date: Thu, 17 Feb 2022 18:08:23 +0800 Subject: [PATCH 11/22] =?UTF-8?q?=E6=9B=B4=E6=96=B0(=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E4=BD=93=E7=B3=BB=E8=AF=A6=E6=83=85=E9=A1=B5=E4=B8=8D=E8=83=BD?= =?UTF-8?q?=E5=88=87=E6=8D=A2=E5=86=85=E5=AE=B9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/system/SystemItemDetailsPage.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/system/SystemItemDetailsPage.dart b/lib/system/SystemItemDetailsPage.dart index 6709b75..c02eb17 100644 --- a/lib/system/SystemItemDetailsPage.dart +++ b/lib/system/SystemItemDetailsPage.dart @@ -133,7 +133,7 @@ class _SystemItemDetailsPageState extends State ///获取当前tab对应的数据 SystemListByCidEntity? systemListByCidEntity = await HttpUtils.getInstance().get2( - API.getSystemListByCid(curPageNum, widget.tabList![curPosition].id ?? 0), isNeedCache: true); + API.getSystemListByCid(curPageNum, widget.tabList![curPosition].id ?? 0), isNeedCache: false); LogUtils.d("当前选中的position==$curPosition"); //设置数据 -- Gitee From ededa4f1452f6edc22a3da3fa2129fd4dd2366ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B0=B8=E8=89=AF?= <18550019225@163.com> Date: Thu, 17 Feb 2022 18:12:32 +0800 Subject: [PATCH 12/22] =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=8D=87=E7=BA=A7?= =?UTF-8?q?=E5=88=B01.0.8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- auto_build_push.sh | 5 ++--- pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/auto_build_push.sh b/auto_build_push.sh index 73e6561..a64adbe 100644 --- a/auto_build_push.sh +++ b/auto_build_push.sh @@ -18,9 +18,8 @@ filename="app-debug.apk" #更新日志 buildUpdateDescription=""" -1. 修改android打包策略. -2. 所有页面改造完毕. -3. 代码优化. +1. 修复体系详情页面tab页面内容一致问题. +2. 代码优化. """ helper() { echo "请输入参数" diff --git a/pubspec.yaml b/pubspec.yaml index dc3819b..782abfd 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -18,7 +18,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # version统一版本名称和版本号,'+'前面的为版本名称,后面的为版本号 -version: 1.0.7+8 +version: 1.0.8+9 environment: sdk: ">=2.12.0 <3.0.0" -- Gitee From 185bae2142cae71a19db4b0df7ee16a395ee7b22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B0=B8=E8=89=AF?= <18550019225@163.com> Date: Mon, 21 Feb 2022 17:05:00 +0800 Subject: [PATCH 13/22] =?UTF-8?q?=E6=9B=B4=E6=96=B0(=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E8=84=9A=E6=9C=AC)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- auto_build_push.sh | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/auto_build_push.sh b/auto_build_push.sh index a64adbe..0fbbd8c 100644 --- a/auto_build_push.sh +++ b/auto_build_push.sh @@ -21,6 +21,7 @@ buildUpdateDescription=""" 1. 修复体系详情页面tab页面内容一致问题. 2. 代码优化. """ + helper() { echo "请输入参数" echo "-d 构建debug版本" @@ -42,8 +43,11 @@ uploadFir() { echo "切换到输出目录$outputs" cd $outputs # 上传到APP管理平台 - result=$(curl -X POST --url https://www.pgyer.com/apiv2/app/upload -F "file=@$filename" -F "_api_key=$_api_key" -F "buildUpdateDescription=$buildUpdateDescription") - echo "上传结果,result: $result" + curl -X POST --url https://www.pgyer.com/apiv2/app/upload -F "file=@$filename" -F "_api_key=$_api_key" -F "buildUpdateDescription=$buildUpdateDescription" > result.json + echo "返回的json数据如下:" + cat result.json | jq . + echo "二维码下载地址如下:" + cat result.json | jq '.data.buildQRCodeURL' exit } @@ -93,8 +97,8 @@ done #执行顺序 clearTemp -echo "构建模式:$buildType" -echo "是否上传:$needUpload" +echo "构建模式:$buildType" +echo "是否上传:$needUpload" flutter build apk --$buildType if [ $? -eq 0 ]; then echo "构建成功" -- Gitee From 2eb3261d6c37c90cdb60a57caf62759deb6adf23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B0=B8=E8=89=AF?= Date: Mon, 28 Feb 2022 14:24:37 +0800 Subject: [PATCH 14/22] =?UTF-8?q?=E6=9B=B4=E6=96=B0(=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E8=BD=AE=E6=92=AD=E7=BB=84=E4=BB=B6=EF=BC=8C=E9=A6=96=E9=A1=B5?= =?UTF-8?q?=E5=B9=BF=E5=91=8A=E5=9B=BE=E5=AE=9E=E7=8E=B0=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E8=BD=AE=E6=92=AD=E5=8A=9F=E8=83=BD)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/common/widget/banner_view.dart | 168 +++++++++++++++++++++++++++++ lib/home/home_page.dart | 74 +++++++------ 2 files changed, 204 insertions(+), 38 deletions(-) create mode 100644 lib/common/widget/banner_view.dart diff --git a/lib/common/widget/banner_view.dart b/lib/common/widget/banner_view.dart new file mode 100644 index 0000000..06a5281 --- /dev/null +++ b/lib/common/widget/banner_view.dart @@ -0,0 +1,168 @@ +import 'dart:async'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutterapp/common/util/log_utils.dart'; +import 'package:smooth_page_indicator/smooth_page_indicator.dart'; + +/// 轮播组件 +class BannerView extends StatefulWidget { + /// 数据集合 + final List data; + + /// 外界传入页面组件 + final Widget Function(T t) child; + + /// 底部指示器的样式 + final WormEffect effect; + + /// 指示器在组件中的位置 + final AlignmentGeometry indicatorAlignment; + + /// 指示器的外边距 + final EdgeInsets indicatorMargin; + + /// 是否开启自动滑动 + final bool autoScroll; + + /// 自动滑动时间 + final Duration autoTime; + + /// 轮播组件 + const BannerView({ + Key? key, + required this.data, + required this.child, + this.effect = const WormEffect(), + this.indicatorAlignment = Alignment.bottomCenter, + this.autoScroll = true, + this.autoTime = const Duration(seconds: 3), + this.indicatorMargin = const EdgeInsets.all(0), + }) : super(key: key); + + @override + _BannerViewState createState() => _BannerViewState(); +} + +class _BannerViewState extends State> { + /// 页面控制器 + late PageController _pageController; + + /// 时间控制器 + Timer? _timer; + + /// 当前页面 + int _currentPage = 0; + + /// 实际需要的数据源 + List children = []; + + @override + void initState() { + super.initState(); + + _pageController = PageController(); + _pageController.addListener(() {}); + } + + @override + void didUpdateWidget(covariant BannerView oldWidget) { + super.didUpdateWidget(oldWidget); + + if (widget.data.length > 0) startScroll(); + } + + /// 开始滑动 + void startScroll() { + if (!widget.autoScroll) return; + if (_timer?.isActive ?? false) return; + if (widget.data.length <= 1) return; + _createTimer(); + } + + /// 停止滑动 + void stopScroll() { + if (!widget.autoScroll) return; + _cancelTimer(); + } + + /// 创建定时器 + void _createTimer() { + if (widget.autoScroll) { + _cancelTimer(); + _timer = Timer.periodic(widget.autoTime, (timer) { + //滑动到下一个页面 + _scrollNextPage(); + }); + } + } + + /// 取消定时器 + void _cancelTimer() { + _timer?.cancel(); + } + + /// 滑动到下一个页面 + void _scrollNextPage() { + _currentPage++; + int next = _currentPage % widget.data.length; + _pageController.animateToPage( + next, + duration: Duration(milliseconds: 600), + curve: Curves.ease, + ); + } + + @override + void dispose() { + super.dispose(); + _pageController.dispose(); + _timer?.cancel(); + } + + @override + Widget build(BuildContext context) { + return widget.data.length == 0 + ? Container() + : Container( + padding: EdgeInsets.symmetric(vertical: 5.0), + child: Listener( + onPointerDown: (tapDown) { + LogUtils.d('手指按下,停止滑动'); + //手指按下 + stopScroll(); + }, + onPointerUp: (tapUP) { + LogUtils.d('手指抬起,开始滑动'); + //手指抬起 + startScroll(); + }, + child: Stack( + alignment: widget.indicatorAlignment, + children: [ + //viewpage + PageView.builder( + itemCount: widget.data.length, + controller: _pageController, + itemBuilder: (BuildContext context, int index) { + return widget.child.call(widget.data[index]); + }, + ), + //viewpage指示器 + Padding( + padding: widget.indicatorMargin, + child: SmoothPageIndicator( + controller: _pageController, + count: widget.data.length, + axisDirection: Axis.horizontal, + effect: widget.effect, + ), + ), + ], + ), + ), + height: 180.0, + ); + } +} diff --git a/lib/home/home_page.dart b/lib/home/home_page.dart index 54b6b95..fdc867b 100644 --- a/lib/home/home_page.dart +++ b/lib/home/home_page.dart @@ -7,6 +7,7 @@ import 'package:flutterapp/common/base/base_provider.dart'; import 'package:flutterapp/common/constant/api.dart'; import 'package:flutterapp/common/util/router_helpe_utils.dart'; import 'package:flutterapp/common/page/webview_page.dart'; +import 'package:flutterapp/common/widget/banner_view.dart'; import 'package:flutterapp/common/widget/favorite_button_widget.dart'; import 'package:flutterapp/home/my_drawer.dart'; import 'package:flutterapp/home/entity/article_data_bean.dart'; @@ -14,6 +15,7 @@ import 'package:flutterapp/home/entity/home_article_top_entity.dart'; import 'package:flutterapp/http/http_utils.dart'; import 'package:provider/provider.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart'; +import 'package:smooth_page_indicator/smooth_page_indicator.dart'; import 'entity/home_article_list_entity.dart'; import 'entity/home_banner_entity.dart'; @@ -47,6 +49,7 @@ class HomePageState extends State with AutomaticKeepAliveClientMixin { return BasePage( title: widget.title, drawer: MyDrawer(), + backgroundColor: Colors.grey[300], child: Container( color: Colors.grey[100], child: SmartRefresher( @@ -66,7 +69,7 @@ class HomePageState extends State with AutomaticKeepAliveClientMixin { itemCount: model._articleList.length + 1, itemBuilder: (BuildContext context, int index) { return index == 0 - ? _BannerView() + ? _HomeBannerView() : getListViewItemWidget( model._articleList[index - 1]); }), @@ -365,51 +368,46 @@ class HomePageState extends State with AutomaticKeepAliveClientMixin { } /// 轮播图组件 -class _BannerView extends StatelessWidget { - const _BannerView({Key? key}) : super(key: key); +class _HomeBannerView extends StatelessWidget { + const _HomeBannerView({Key? key}) : super(key: key); @override Widget build(BuildContext context) { // 获取banner数据列表 List? data = context.watch()._homeBannerEntity?.data; - return Container( - padding: EdgeInsets.symmetric(vertical: 5.0), - child: Listener( - onPointerDown: (tapDown) { - //手指按下 - }, - onPointerUp: (tapUP) { - //手指抬起 - }, - child: PageView.builder( - itemCount: data?.length ?? 0, - itemBuilder: (BuildContext context, int index) { - return InkWell( - onTap: () { - RouteHelpUtils.push( - context, - WebViewPage( - url: data![index]?.url, - title: data[index]?.title, - des: data[index]?.desc, - )); - }, - child: Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular((10.0)), // 圆角度 - image: DecorationImage( - image: NetworkImage(data![index]?.imagePath ?? ''), - fit: BoxFit.fill, - ), + // pageview控制器 + return BannerView( + data: data ?? [], + indicatorMargin: EdgeInsets.only(bottom: 16), + effect: WormEffect( + dotWidth: 8, + dotHeight: 8, + ), + autoTime: Duration(seconds: 5), + child: (value) { + return InkWell( + onTap: () { + RouteHelpUtils.push( + context, + WebViewPage( + url: value?.url, + title: value?.title, + des: value?.desc, + )); + }, + child: Container( + margin: EdgeInsets.all(8), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular((10.0)), // 圆角度 + image: DecorationImage( + image: NetworkImage(value?.imagePath ?? ''), + fit: BoxFit.fill, ), ), - ); - }, - ), - ), - height: 180.0, - ); + ), + ); + }); } } -- Gitee From a3f3445373b07513e9240286085104cc2578b895 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B0=B8=E8=89=AF?= Date: Mon, 28 Feb 2022 14:25:00 +0800 Subject: [PATCH 15/22] =?UTF-8?q?=E6=9B=B4=E6=96=B0(=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E6=8C=87=E7=A4=BA=E5=99=A8=E6=8F=92=E4=BB=B6?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pubspec.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pubspec.yaml b/pubspec.yaml index 782abfd..b407585 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -83,6 +83,9 @@ dependencies: # 获取包信息插件 package_info: ^2.0.2 + # 页面指示器 + smooth_page_indicator: ^1.0.0+2 + dev_dependencies: -- Gitee From ecbb24216f3307516bdf54bfc5f3a89e3f0ba12e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B0=B8=E8=89=AF?= Date: Mon, 28 Feb 2022 14:35:03 +0800 Subject: [PATCH 16/22] =?UTF-8?q?=E9=A6=96=E9=A1=B5UI=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/home/home_page.dart | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/lib/home/home_page.dart b/lib/home/home_page.dart index fdc867b..7f6aa1b 100644 --- a/lib/home/home_page.dart +++ b/lib/home/home_page.dart @@ -8,6 +8,7 @@ import 'package:flutterapp/common/constant/api.dart'; import 'package:flutterapp/common/util/router_helpe_utils.dart'; import 'package:flutterapp/common/page/webview_page.dart'; import 'package:flutterapp/common/widget/banner_view.dart'; +import 'package:flutterapp/common/widget/easy_ink_well.dart'; import 'package:flutterapp/common/widget/favorite_button_widget.dart'; import 'package:flutterapp/home/my_drawer.dart'; import 'package:flutterapp/home/entity/article_data_bean.dart'; @@ -49,7 +50,7 @@ class HomePageState extends State with AutomaticKeepAliveClientMixin { return BasePage( title: widget.title, drawer: MyDrawer(), - backgroundColor: Colors.grey[300], + backgroundColor: Colors.grey, child: Container( color: Colors.grey[100], child: SmartRefresher( @@ -122,20 +123,12 @@ class HomePageState extends State with AutomaticKeepAliveClientMixin { } Widget getListViewItemWidget(ArticleDataBean homeArticleDataBean) { - return GestureDetector( + return EasyInkWell( + margin: EdgeInsets.symmetric(horizontal: 12, vertical: 4), + color: Colors.white, + radius: 8, child: Container( - padding: EdgeInsets.all(10.0), - margin: EdgeInsets.symmetric(vertical: 5.0, horizontal: 10.0), - decoration: BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(5.0)), - boxShadow: [ - //阴影 - BoxShadow( - color: Colors.grey[300]!, - offset: Offset(2.0, 2.0), - blurRadius: 2.0) - ], - color: Colors.white), + padding: EdgeInsets.all(4), child: Row( children: [ Center( @@ -379,7 +372,7 @@ class _HomeBannerView extends StatelessWidget { // pageview控制器 return BannerView( data: data ?? [], - indicatorMargin: EdgeInsets.only(bottom: 16), + indicatorMargin: EdgeInsets.only(bottom: 12), effect: WormEffect( dotWidth: 8, dotHeight: 8, @@ -397,7 +390,7 @@ class _HomeBannerView extends StatelessWidget { )); }, child: Container( - margin: EdgeInsets.all(8), + margin: EdgeInsets.symmetric(horizontal: 12, vertical: 4), decoration: BoxDecoration( borderRadius: BorderRadius.circular((10.0)), // 圆角度 image: DecorationImage( -- Gitee From ffc53d911dbcbad897d769faf1a799b5664c8f3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B0=B8=E8=89=AF?= Date: Mon, 28 Feb 2022 15:02:27 +0800 Subject: [PATCH 17/22] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/common/widget/banner_view.dart | 10 ++++++---- lib/home/home_page.dart | 4 ---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/lib/common/widget/banner_view.dart b/lib/common/widget/banner_view.dart index 06a5281..64aa687 100644 --- a/lib/common/widget/banner_view.dart +++ b/lib/common/widget/banner_view.dart @@ -1,6 +1,5 @@ import 'dart:async'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:flutterapp/common/util/log_utils.dart'; @@ -14,8 +13,8 @@ class BannerView extends StatefulWidget { /// 外界传入页面组件 final Widget Function(T t) child; - /// 底部指示器的样式 - final WormEffect effect; + /// 底部指示器的样式BasicIndicatorEffect + final dynamic effect; /// 指示器在组件中的位置 final AlignmentGeometry indicatorAlignment; @@ -34,7 +33,10 @@ class BannerView extends StatefulWidget { Key? key, required this.data, required this.child, - this.effect = const WormEffect(), + this.effect = const WormEffect( + dotWidth: 8, + dotHeight: 8, + ), this.indicatorAlignment = Alignment.bottomCenter, this.autoScroll = true, this.autoTime = const Duration(seconds: 3), diff --git a/lib/home/home_page.dart b/lib/home/home_page.dart index 7f6aa1b..b453f29 100644 --- a/lib/home/home_page.dart +++ b/lib/home/home_page.dart @@ -373,10 +373,6 @@ class _HomeBannerView extends StatelessWidget { return BannerView( data: data ?? [], indicatorMargin: EdgeInsets.only(bottom: 12), - effect: WormEffect( - dotWidth: 8, - dotHeight: 8, - ), autoTime: Duration(seconds: 5), child: (value) { return InkWell( -- Gitee From bfff0044b545a06ba90918b9bbd0034fce2f71ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B0=B8=E8=89=AF?= Date: Mon, 28 Feb 2022 17:40:08 +0800 Subject: [PATCH 18/22] =?UTF-8?q?ui=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/home/home_page.dart | 4 +-- lib/system/SystemItemDetailsPage.dart | 46 +++++++++------------------ 2 files changed, 17 insertions(+), 33 deletions(-) diff --git a/lib/home/home_page.dart b/lib/home/home_page.dart index b453f29..aa6b6ef 100644 --- a/lib/home/home_page.dart +++ b/lib/home/home_page.dart @@ -124,11 +124,11 @@ class HomePageState extends State with AutomaticKeepAliveClientMixin { Widget getListViewItemWidget(ArticleDataBean homeArticleDataBean) { return EasyInkWell( - margin: EdgeInsets.symmetric(horizontal: 12, vertical: 4), + margin: EdgeInsets.symmetric(horizontal: 8, vertical: 4), color: Colors.white, radius: 8, child: Container( - padding: EdgeInsets.all(4), + padding: EdgeInsets.all(8), child: Row( children: [ Center( diff --git a/lib/system/SystemItemDetailsPage.dart b/lib/system/SystemItemDetailsPage.dart index c02eb17..fbd475a 100644 --- a/lib/system/SystemItemDetailsPage.dart +++ b/lib/system/SystemItemDetailsPage.dart @@ -1,9 +1,11 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:flutterapp/common/base/base_page.dart'; import 'package:flutterapp/common/constant/API.dart'; import 'package:flutterapp/common/util/router_helpe_utils.dart'; import 'package:flutterapp/common/util/log_utils.dart'; import 'package:flutterapp/common/page/webview_page.dart'; +import 'package:flutterapp/common/widget/easy_ink_well.dart'; import 'package:flutterapp/common/widget/favorite_button_widget.dart'; import 'package:flutterapp/home/entity/article_data_bean.dart'; import 'package:flutterapp/http/http_utils.dart'; @@ -76,38 +78,27 @@ class _SystemItemDetailsPageState extends State @override Widget build(BuildContext context) { - return Scaffold( + return BasePage( appBar: AppBar( -// actions: [ -// IconButton(icon: Icon(Icons.search),onPressed: (){ -// Toast.show("搜索",context,duration: Toast.LENGTH_LONG,gravity: Toast.BOTTOM); -// },) -// ], centerTitle: true, title: Text(widget.title ?? ''), bottom: TabBar( controller: tabController, isScrollable: true, tabs: myTabs, - // 线条宽度 - // TabBarIndicatorSize.label 根据内容调整宽度 - // TabBarIndicatorSize.tab 根据(mainWidth/itemCount)调整宽度 indicatorSize: TabBarIndicatorSize.label, labelColor: Colors.white, labelStyle: new TextStyle(fontSize: 16.0), unselectedLabelColor: Colors.black, unselectedLabelStyle: new TextStyle(fontSize: 12.0), - // 线条边距 -// indicatorPadding: EdgeInsets.only(left: 6, right: 6), - // 点击item onTap: (int index) { - LogUtils.d("system-tabbar-ontap-index-$index"); curPosition = index; getListDataByCid(); }, ), ), - body: Container( + backgroundColor: Colors.grey, + child: Container( color: Colors.grey[100], child: PageView.builder( controller: pageController, @@ -131,16 +122,17 @@ class _SystemItemDetailsPageState extends State ///通过页码和cid获取指定的知识体系数据 void getListDataByCid() async { ///获取当前tab对应的数据 - SystemListByCidEntity? systemListByCidEntity = -await HttpUtils.getInstance().get2( - API.getSystemListByCid(curPageNum, widget.tabList![curPosition].id ?? 0), isNeedCache: false); + SystemListByCidEntity? systemListByCidEntity = await HttpUtils.getInstance() + .get2( + API.getSystemListByCid( + curPageNum, widget.tabList![curPosition].id ?? 0), + isNeedCache: false); LogUtils.d("当前选中的position==$curPosition"); //设置数据 setState(() { contentList = systemListByCidEntity?.data?.datas; }); - } ///获取内容组件 @@ -149,7 +141,10 @@ await HttpUtils.getInstance().get2( itemCount: contentList?.length ?? 0, addAutomaticKeepAlives: true, itemBuilder: (buildContext, index) { - return GestureDetector( + return EasyInkWell( + margin: EdgeInsets.symmetric(vertical: 4.0, horizontal: 8.0), + color: Colors.white, + radius: 8, onTap: () { RouteHelpUtils.push( context, @@ -160,18 +155,7 @@ await HttpUtils.getInstance().get2( )); }, child: Container( - padding: EdgeInsets.all(10.0), - margin: EdgeInsets.symmetric(vertical: 5.0, horizontal: 10.0), - decoration: BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(5.0)), - boxShadow: [ - //阴影 - BoxShadow( - color: Colors.grey[300]!, - offset: Offset(2.0, 2.0), - blurRadius: 2.0) - ], - color: Colors.white), + padding: EdgeInsets.all(8), child: Row( children: [ Center( -- Gitee From 1bd27211e30e18cb4d615629105f9d1a22c00138 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B0=B8=E8=89=AF?= Date: Tue, 1 Mar 2022 09:37:50 +0800 Subject: [PATCH 19/22] =?UTF-8?q?=E6=9B=B4=E6=96=B0-=E5=8E=BB=E9=99=A4?= =?UTF-8?q?=E6=97=A0=E7=94=A8=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/home/home_page.dart | 3 --- 1 file changed, 3 deletions(-) diff --git a/lib/home/home_page.dart b/lib/home/home_page.dart index aa6b6ef..7147719 100644 --- a/lib/home/home_page.dart +++ b/lib/home/home_page.dart @@ -1,5 +1,4 @@ import 'package:flutter/cupertino.dart'; -import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutterapp/common/base/base_mode.dart'; import 'package:flutterapp/common/base/base_page.dart'; @@ -16,8 +15,6 @@ import 'package:flutterapp/home/entity/home_article_top_entity.dart'; import 'package:flutterapp/http/http_utils.dart'; import 'package:provider/provider.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart'; -import 'package:smooth_page_indicator/smooth_page_indicator.dart'; - import 'entity/home_article_list_entity.dart'; import 'entity/home_banner_entity.dart'; -- Gitee From 7adcb6e0abd92d89b4b50dfc73b5dbc2bf9f2a63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B0=B8=E8=89=AF?= Date: Tue, 1 Mar 2022 16:02:55 +0800 Subject: [PATCH 20/22] =?UTF-8?q?=E6=9B=B4=E6=96=B0(=E7=BD=91=E7=BB=9C?= =?UTF-8?q?=E8=AF=B7=E6=B1=82=E4=BC=98=E5=8C=96)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/local.properties | 4 +- lib/common/widget/favorite_button_widget.dart | 17 ++-- lib/home/home_page.dart | 8 +- lib/home/my_drawer.dart | 9 +- lib/http/def_json_factory.dart | 8 ++ lib/http/http_utils.dart | 89 +------------------ lib/item/ItemPage.dart | 19 ++-- lib/item/service/item_service_impl.dart | 25 ++---- lib/me/me_page.dart | 6 +- lib/me/page/login_page.dart | 4 +- lib/me/page/my_favorite_page.dart | 2 +- lib/me/service/me_service_impl.dart | 2 +- lib/system/SystemItemDetailsPage.dart | 2 +- lib/system/SystemPage.dart | 2 +- pubspec.lock | 7 ++ 15 files changed, 59 insertions(+), 145 deletions(-) diff --git a/android/local.properties b/android/local.properties index 9ba4cdf..05875ad 100644 --- a/android/local.properties +++ b/android/local.properties @@ -1,5 +1,5 @@ sdk.dir=C:\\Users\\admin\\AppData\\Local\\Android\\Sdk flutter.sdk=D:\\Smaboy\\source\\flutter flutter.buildMode=debug -flutter.versionName=1.0.5 -flutter.versionCode=6 \ No newline at end of file +flutter.versionName=1.0.8 +flutter.versionCode=9 \ No newline at end of file diff --git a/lib/common/widget/favorite_button_widget.dart b/lib/common/widget/favorite_button_widget.dart index cc44fa4..3f27eac 100644 --- a/lib/common/widget/favorite_button_widget.dart +++ b/lib/common/widget/favorite_button_widget.dart @@ -51,8 +51,8 @@ class _FavoriteButtonWidgetState extends State { //点击收藏的事件 if (curIsFavorite ?? false) { //将此收藏移除 - HttpUtils.getInstance().post(API.getUnCollectOriginId(widget.id ?? 0), - onSuccess: (responses) { + HttpUtils.getInstance().post( + API.getUnCollectOriginId(widget.id ?? 0), onResult: (responses) { Map map = jsonDecode(responses.toString()); if (0 == map['errorCode']) { shortToast("取消收藏成功"); @@ -63,14 +63,13 @@ class _FavoriteButtonWidgetState extends State { } else { shortToast(map['errorMsg'] ?? "取消收藏失败"); } - }, onFailure: (msg) { - shortToast(msg); + }, onFailure: (error, stack) { + shortToast(error.toString()); }); } else { //添加收藏 - HttpUtils.getInstance() - .post(API.getCollectArticleById(widget.id ?? 0), - onSuccess: (responses) { + HttpUtils.getInstance().post( + API.getCollectArticleById(widget.id ?? 0), onResult: (responses) { Map map = jsonDecode(responses.toString()); if (0 == map['errorCode']) { shortToast("收藏成功"); @@ -83,8 +82,8 @@ class _FavoriteButtonWidgetState extends State { } else { shortToast(map['errorMsg'] ?? "收藏失败"); } - }, onFailure: (msg) { - shortToast(msg); + }, onFailure: (error, stack) { + shortToast(error.toString()); }); } }, diff --git a/lib/home/home_page.dart b/lib/home/home_page.dart index 7147719..f283bca 100644 --- a/lib/home/home_page.dart +++ b/lib/home/home_page.dart @@ -429,7 +429,7 @@ class HomeModel extends BaseModel { /// 从网络获取轮播图数据 Future initBannerData() { return HttpUtils.getInstance() - .get2(API.homeBanner, isNeedCache: true) + .get(API.homeBanner, isNeedCache: true) .then((value) { if (value != null) { //设置数据 @@ -448,14 +448,14 @@ class HomeModel extends BaseModel { ///获取置顶文章列表数据 HomeArticleTopEntity? homeArticleTopEntity = - await HttpUtils.getInstance().get2( + await HttpUtils.getInstance().get( API.homeArticleTop, isNeedCache: true, ); ///获取文章列表数据 HomeArticleListEntity? homeArticleListEntity = - await HttpUtils.getInstance().get2( + await HttpUtils.getInstance().get( API.getHomeArticleList(curPageNum), isNeedCache: true, ); @@ -479,7 +479,7 @@ class HomeModel extends BaseModel { void loadMoreData() { ///获取文章列表数据 curPageNum++; - HttpUtils.getInstance().get2( + HttpUtils.getInstance().get( API.getHomeArticleList(curPageNum), onSuccess: (homeArticleListEntity) { if (homeArticleListEntity.data?.datas == null || homeArticleListEntity.data!.datas!.isEmpty) { diff --git a/lib/home/my_drawer.dart b/lib/home/my_drawer.dart index 7ef3f6d..5d77e67 100644 --- a/lib/home/my_drawer.dart +++ b/lib/home/my_drawer.dart @@ -64,7 +64,8 @@ class _MyDrawerState extends State { isLogin = await SPUtils.getInstance().getIsLogin() ?? false; userName = await SPUtils.getInstance().getUserName() ?? ''; password = await SPUtils.getInstance().getPassword() ?? ''; - rememberPassword = await SPUtils.getInstance().getRememberPassword() ?? false; + rememberPassword = + await SPUtils.getInstance().getRememberPassword() ?? false; setState(() {}); } @@ -276,7 +277,7 @@ class _MyDrawerState extends State { /// 退出登录操作 void logout() { - HttpUtils.getInstance().get(API.logout, onSuccess: (responses) { + HttpUtils.getInstance().get(API.logout, onResult: (responses) { Map logoutBean = json.decode(responses.toString()); if (logoutBean['errorCode'] == 0) { //退出成功 @@ -296,8 +297,8 @@ class _MyDrawerState extends State { //退出失败 shortToast(logoutBean['errorMsg'] ?? "退出失败"); } - }, onFailure: (msg) { - shortToast(msg); + }, onFailure: (error, stack) { + shortToast(error.toString()); }); } diff --git a/lib/http/def_json_factory.dart b/lib/http/def_json_factory.dart index fe1d764..743a387 100644 --- a/lib/http/def_json_factory.dart +++ b/lib/http/def_json_factory.dart @@ -3,6 +3,8 @@ import 'package:flutterapp/common/util/log_utils.dart'; import 'package:flutterapp/home/entity/home_article_list_entity.dart'; import 'package:flutterapp/home/entity/home_article_top_entity.dart'; import 'package:flutterapp/home/entity/home_banner_entity.dart'; +import 'package:flutterapp/item/entity/item_list_entity.dart'; +import 'package:flutterapp/item/entity/item_tree_entity.dart'; import 'package:flutterapp/me/entity/collect_article_list_entity.dart'; import 'package:flutterapp/me/entity/login_entity.dart'; import 'package:flutterapp/me/entity/register_entity.dart'; @@ -48,6 +50,8 @@ class DefaultJsonFactory implements BaseJsonFactory { T fromJson(Map data) { Type type = typeOf(); switch (type) { + case dynamic: + return data as T; case HomeBannerEntity: return HomeBannerEntity.fromJson(data) as T; case LoginEntity: @@ -66,6 +70,10 @@ class DefaultJsonFactory implements BaseJsonFactory { return CollectArticleListEntity.fromJson(data) as T; case AppCheckEntity: return AppCheckEntity.fromJson(data) as T; + case ItemTreeEntity: + return ItemTreeEntity.fromJson(data) as T; + case ItemListEntity: + return ItemListEntity.fromJson(data) as T; default: throw '没有这样的类型:$type'; } diff --git a/lib/http/http_utils.dart b/lib/http/http_utils.dart index 5b10be1..67d5d97 100644 --- a/lib/http/http_utils.dart +++ b/lib/http/http_utils.dart @@ -84,93 +84,8 @@ class HttpUtils { } } - /// get 请求方法 - Future get(String path, - {Map? queryParameters, - Options? options, - CancelToken? cancelToken, - bool isNeedCache = false, - void Function(int, int)? onReceiveProgress, - void Function(Response)? onSuccess, - void Function(String)? onFailure}) async { - late Response response; - try { - // 添加缓存配置 MaxAge:设置缓存的时间,MaxStale: 设置过期时常 - // subKey: dio-http-cache 默认使用 url 作为缓存 key ,但当 url 不够用的时候,比如 post 请求分页数据的时候,就需要配合subKey使用。 - // forceRefresh默认为false,开启后先获取后台数据当后台数据获取不到或者网络出现问题,再去本地获取 - var optionTemp = buildCacheOptions(Duration(days: 7), - maxStale: Duration(days: 10), - subKey: "subPage", - options: options, - forceRefresh: true); - //开始请求 - response = await _dio.get(path, - queryParameters: queryParameters, - options: isNeedCache ? optionTemp : options, - cancelToken: cancelToken, - onReceiveProgress: onReceiveProgress); - - //将成功的响应抛出 - if (onSuccess != null) { - onSuccess(response); - } - } on DioError catch (e) { - //将失败的响应抛出 - if (onFailure != null) { - onFailure(handleError(e)); - } - - //打印请求报错信息 - LogUtils.e(e); - } - - return response; - } - - /// post 请求方法 - Future post(String path, - {dynamic data, - Map? queryParameters, - Options? options, - CancelToken? cancelToken, - bool isNeedCache = false, - void Function(int, int)? onSendProgress, - void Function(int, int)? onReceiveProgress, - void Function(Response)? onSuccess, - void Function(String)? onFailure}) async { - late Response response; - try { - // 添加缓存配置 MaxAge:设置缓存的时间,MaxStale: 设置过期时常 - var optionTemp = buildCacheOptions(Duration(days: 7), - maxStale: Duration(days: 10), subKey: "page=1", options: options); - //开始请求 - - response = await _dio.post(path, - data: data, - queryParameters: queryParameters, - options: isNeedCache ? optionTemp : options, - cancelToken: cancelToken, - onSendProgress: onSendProgress, - onReceiveProgress: onReceiveProgress); - - //将成功的响应抛出 - if (onSuccess != null) { - onSuccess(response); - } - } on DioError catch (e) { - //将失败的响应抛出 - if (onFailure != null) { - onFailure(handleError(e)); - } - - //打印请求报错信息 - LogUtils.e(e); - } - return response; - } - /// post 请求方法 - Future post2( + Future post( String path, { dynamic data, Map? queryParameters, @@ -201,7 +116,7 @@ class HttpUtils { } /// get 请求方法 - Future get2( + Future get( String path, { dynamic data, Map? queryParameters, diff --git a/lib/item/ItemPage.dart b/lib/item/ItemPage.dart index 41624fd..817d010 100644 --- a/lib/item/ItemPage.dart +++ b/lib/item/ItemPage.dart @@ -51,8 +51,6 @@ class _ItemPageState extends State ); } - - /// 项目页面标题组件子项集合 List getTitleItems(ItemModel model) { var tabs = []; @@ -210,13 +208,13 @@ class _ContentWidgetState extends State { void initData() async { curPageNum = 1; - ItemListEntity itemListByCid = await ItemServiceImpl.getInstance() + ItemListEntity? itemListByCid = await ItemServiceImpl.getInstance() .getItemListByCid(curPageNum, widget.id ?? 0); if (mounted) { setState(() { - if (itemListByCid.data != null && itemListByCid.data?.datas != null) { + if (itemListByCid?.data != null && itemListByCid?.data?.datas != null) { contentList.clear(); - contentList.addAll(itemListByCid.data!.datas!); + contentList.addAll(itemListByCid!.data!.datas!); } }); } @@ -225,13 +223,12 @@ class _ContentWidgetState extends State { Future loadMoreData() async { curPageNum++; LogUtils.d("加载更多-当前页码为:$curPageNum"); - ItemListEntity itemListByCid = await ItemServiceImpl.getInstance() + ItemListEntity? itemListByCid = await ItemServiceImpl.getInstance() .getItemListByCid(curPageNum, widget.id ?? 0); if (mounted) { setState(() { - if (itemListByCid.data != null && - itemListByCid.data!.datas != null && - itemListByCid.data!.datas!.length > 0) { + if (itemListByCid?.data!.datas != null && + itemListByCid!.data!.datas!.length > 0) { curLoadMoreStatue = LoadMoreStatue.STATUE_IDEL; contentList.addAll(itemListByCid.data!.datas!); } else { @@ -368,8 +365,8 @@ class ItemModel extends BaseModel { Future initData() { return ItemServiceImpl.getInstance().getItemTree().then((value) { - if (value.data != null && (value.data?.length ?? 0) > 0) { - this.data = value.data; + if (value?.data != null && (value?.data?.length ?? 0) > 0) { + this.data = value!.data; return true; } return false; diff --git a/lib/item/service/item_service_impl.dart b/lib/item/service/item_service_impl.dart index e7849b5..3ef81ac 100644 --- a/lib/item/service/item_service_impl.dart +++ b/lib/item/service/item_service_impl.dart @@ -1,6 +1,3 @@ -import 'dart:convert'; - -import 'package:dio/dio.dart'; import 'package:flutterapp/common/constant/api.dart'; import 'package:flutterapp/http/http_utils.dart'; import 'package:flutterapp/item/entity/item_list_entity.dart'; @@ -16,24 +13,14 @@ class ItemServiceImpl extends ItemService { } @override - Future getItemListByCid(int pageNum, int cid) async { - Response responses = await HttpUtils.getInstance().get( - API.getItemList(pageNum, cid), - onSuccess: (responses) {}, - onFailure: (msg) {}, - isNeedCache: true); - ItemListEntity itemListEntity = - ItemListEntity.fromJson(jsonDecode(responses.toString())); - return itemListEntity; + Future getItemListByCid(int pageNum, int cid) async { + return HttpUtils.getInstance() + .get(API.getItemList(pageNum, cid), isNeedCache: true); } @override - Future getItemTree() async { - Response responses = await HttpUtils.getInstance().get(API.itemTree, - onSuccess: (responses) {}, onFailure: (msg) {}, isNeedCache: true); - - ItemTreeEntity itemTreeEntity = - ItemTreeEntity.fromJson(jsonDecode(responses.toString())); - return itemTreeEntity; + Future getItemTree() { + return HttpUtils.getInstance() + .get(API.itemTree, isNeedCache: true); } } diff --git a/lib/me/me_page.dart b/lib/me/me_page.dart index 8ead7b8..dd7c9f3 100644 --- a/lib/me/me_page.dart +++ b/lib/me/me_page.dart @@ -261,7 +261,7 @@ class _MePageState extends State with AutomaticKeepAliveClientMixin { /// 退出登录操作 void logout() { - HttpUtils.getInstance().get(API.logout, onSuccess: (responses) { + HttpUtils.getInstance().get(API.logout, onResult: (responses) { Map logoutBean = json.decode(responses.toString()); if (logoutBean['errorCode'] == 0) { //退出成功 @@ -281,8 +281,8 @@ class _MePageState extends State with AutomaticKeepAliveClientMixin { //退出失败 shortToast(logoutBean['errorMsg'] ?? "退出失败"); } - }, onFailure: (msg) { - shortToast(msg); + }, onFailure: (error, stack) { + shortToast(error.toString()); }); } diff --git a/lib/me/page/login_page.dart b/lib/me/page/login_page.dart index 134582c..9a7b751 100644 --- a/lib/me/page/login_page.dart +++ b/lib/me/page/login_page.dart @@ -371,7 +371,7 @@ class LoginModel extends BaseModel { } //开始登录 showLoading('登录中...'); - HttpUtils.getInstance().post2( + HttpUtils.getInstance().post( API.login, queryParameters: { "username": userName, @@ -420,7 +420,7 @@ class LoginModel extends BaseModel { //开始注册 showLoading('注册中...'); HttpUtils.getInstance() - .post2(API.register, queryParameters: { + .post(API.register, queryParameters: { "username": userName, "password": password, "repassword": repassword, diff --git a/lib/me/page/my_favorite_page.dart b/lib/me/page/my_favorite_page.dart index c2ea6ce..bc5a523 100644 --- a/lib/me/page/my_favorite_page.dart +++ b/lib/me/page/my_favorite_page.dart @@ -83,7 +83,7 @@ class _MyFavoritePageState extends State { } void initData() { - HttpUtils.getInstance().get2( + HttpUtils.getInstance().get( API.getCollectArticleList(), onSuccess: (collectArticleListEntity) { if (collectArticleListEntity.data != null && collectArticleListEntity.data!.datas != null) { diff --git a/lib/me/service/me_service_impl.dart b/lib/me/service/me_service_impl.dart index 501ad80..d00060c 100644 --- a/lib/me/service/me_service_impl.dart +++ b/lib/me/service/me_service_impl.dart @@ -24,7 +24,7 @@ class MeServiceImpl extends MeService { @override Future appCheck() { - return HttpUtils.getInstance().post2( + return HttpUtils.getInstance().post( API.appCheck, options: Options() ..headers = { diff --git a/lib/system/SystemItemDetailsPage.dart b/lib/system/SystemItemDetailsPage.dart index fbd475a..fa2ac93 100644 --- a/lib/system/SystemItemDetailsPage.dart +++ b/lib/system/SystemItemDetailsPage.dart @@ -123,7 +123,7 @@ class _SystemItemDetailsPageState extends State void getListDataByCid() async { ///获取当前tab对应的数据 SystemListByCidEntity? systemListByCidEntity = await HttpUtils.getInstance() - .get2( + .get( API.getSystemListByCid( curPageNum, widget.tabList![curPosition].id ?? 0), isNeedCache: false); diff --git a/lib/system/SystemPage.dart b/lib/system/SystemPage.dart index 73b9537..8d800e9 100644 --- a/lib/system/SystemPage.dart +++ b/lib/system/SystemPage.dart @@ -182,7 +182,7 @@ class SystemModel extends BaseModel { ///初始化标题数据 Future initTreeData() { - return HttpUtils.getInstance().get2(API.systemTree, + return HttpUtils.getInstance().get(API.systemTree, onSuccess: (data) { //设置标题数据 systemTreeEntity = data; diff --git a/pubspec.lock b/pubspec.lock index 5ecfa88..e86c0c2 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -518,6 +518,13 @@ packages: description: flutter source: sdk version: "0.0.99" + smooth_page_indicator: + dependency: "direct main" + description: + name: smooth_page_indicator + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.0.0+2" source_gen: dependency: transitive description: -- Gitee From 66b6087c92499f905ce94bace83505c71dfb6907 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B0=B8=E8=89=AF?= Date: Tue, 1 Mar 2022 16:35:02 +0800 Subject: [PATCH 21/22] =?UTF-8?q?=E6=9B=B4=E6=96=B0webview(=E6=94=AF?= =?UTF-8?q?=E6=8C=81https=E5=92=8Chttp,=E5=85=B6=E4=BB=96=E7=9A=84?= =?UTF-8?q?=E6=8B=A6=E6=88=AA)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/common/page/webview_page.dart | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/common/page/webview_page.dart b/lib/common/page/webview_page.dart index cb2f57a..4157fde 100644 --- a/lib/common/page/webview_page.dart +++ b/lib/common/page/webview_page.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/painting.dart'; import 'package:flutterapp/common/base/base_page.dart'; import 'package:flutterapp/common/util/log_utils.dart'; +import 'package:url_launcher/url_launcher.dart'; import 'package:webview_flutter/webview_flutter.dart'; /// webview组件 @@ -67,6 +68,14 @@ class _WebViewPageState extends State { WebView( initialUrl: widget.url ?? '', javascriptMode: JavascriptMode.unrestricted, + navigationDelegate: (request) { + if (request.url.contains('http:') || + request.url.contains('https:')) { + return NavigationDecision.navigate; + } else { + return NavigationDecision.prevent; + } + }, onWebViewCreated: (webViewController) { _webViewController = webViewController; }, -- Gitee From 188bbe27d71d1640b5650b88ea2bcc3277743261 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B0=B8=E8=89=AF?= Date: Tue, 1 Mar 2022 16:40:23 +0800 Subject: [PATCH 22/22] =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=8D=87=E7=BA=A7?= =?UTF-8?q?=E5=88=B01.0.9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- auto_build_push.sh | 5 +++-- lib/me/me_page.dart | 1 + pubspec.yaml | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/auto_build_push.sh b/auto_build_push.sh index 0fbbd8c..99b7c09 100644 --- a/auto_build_push.sh +++ b/auto_build_push.sh @@ -18,8 +18,9 @@ filename="app-debug.apk" #更新日志 buildUpdateDescription=""" -1. 修复体系详情页面tab页面内容一致问题. -2. 代码优化. +1. 优化webview,处理部分无法打开问题. +2. 网络优化. +3. 列表页面UI优化. """ helper() { diff --git a/lib/me/me_page.dart b/lib/me/me_page.dart index dd7c9f3..36da0b6 100644 --- a/lib/me/me_page.dart +++ b/lib/me/me_page.dart @@ -146,6 +146,7 @@ class _MePageState extends State with AutomaticKeepAliveClientMixin { ]; }, body: SingleChildScrollView( + physics: BouncingScrollPhysics(), child: Column( mainAxisSize: MainAxisSize.max, children: [ diff --git a/pubspec.yaml b/pubspec.yaml index b407585..55d1730 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -18,7 +18,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # version统一版本名称和版本号,'+'前面的为版本名称,后面的为版本号 -version: 1.0.8+9 +version: 1.0.9+10 environment: sdk: ">=2.12.0 <3.0.0" -- Gitee