diff --git a/android/app/release/output.json b/android/app/release/output.json index 16e1b0c5..5dae1a91 100644 --- a/android/app/release/output.json +++ b/android/app/release/output.json @@ -1 +1 @@ -[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"0.0.5","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release"},"path":"app-release.apk","properties":{}}] \ No newline at end of file +[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0.6","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release"},"path":"app-release.apk","properties":{}}] \ No newline at end of file diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 80c74332..dc167e6f 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -10,10 +10,11 @@ + + + + + + + + + + + + + diff --git a/app-release.apk b/app-release.apk new file mode 100644 index 00000000..375d27e9 Binary files /dev/null and b/app-release.apk differ diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 263c2ab2..8eb0a6fe 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -222,6 +222,7 @@ 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, C38E5EAE601417DA9DF11753 /* [CP] Embed Pods Frameworks */, + 2432F011A7D713E4BFB3DC88 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -300,6 +301,24 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 2432F011A7D713E4BFB3DC88 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh", + "${PODS_CONFIGURATION_BUILD_DIR}/flutter_downloader/FlutterDownloaderDatabase.bundle", + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FlutterDownloaderDatabase.bundle", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 04305270..ba1a9822 100644 --- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -42,7 +42,7 @@ { bool _isLoading = true; @override - void initState() { + Future initState() { super.initState(); + var platformAandroid = + (Theme.of(context).platform == TargetPlatform.android); + DataUtils.checkVersion({'name': 'FlutterGo'}).then((bool) { + print("返回值back ${bool}"); + if (platformAandroid && bool) { + setState(() {}); + _UpdateURL(); + } + }).catchError((onError) { + print('获取失败:$onError'); + }); + DataUtils.checkLogin().then((hasLogin) { setState(() { _hasLogin = hasLogin; _isLoading = false; }); - }).catchError((onError){ + }).catchError((onError) { setState(() { _hasLogin = true; _isLoading = false; @@ -52,24 +68,34 @@ class _MyAppState extends State { }); } - showWelcomePage() { - if (_isLoading) { - return Container( - color: const Color(ThemeColor), - child: Center( - child: SpinKitPouringHourglass(color: Colors.white), - ), - ); + _UpdateURL() async { + const currUrl = + 'https://github.com/alibaba/flutter-go/raw/master/FlutterGo.apk'; + if (await canLaunch(currUrl)) { + await launch(currUrl); } else { - // 判断是否已经登录 - if (_hasLogin) { - return AppPage(); - } else { - return LoginPage(); - } + throw 'Could not launch $currUrl'; } } + showWelcomePage() { +// if (_isLoading) { +// return Container( +// color: const Color(ThemeColor), +// child: Center( +// child: SpinKitPouringHourglass(color: Colors.white), +// ), +// ); +// } else { +// // 判断是否已经登录 +// if (_hasLogin) { + return AppPage(); +// } else { +// return LoginPage(); +// } +// } + } + @override Widget build(BuildContext context) { return new MaterialApp( @@ -88,6 +114,7 @@ class _MyAppState extends State { ), ), home: new Scaffold(body: showWelcomePage()), + //去掉debug logo debugShowCheckedModeBanner: false, onGenerateRoute: Application.router.generator, navigatorObservers: [Analytics.observer], diff --git a/lib/model/user_info_cache.dart b/lib/model/user_info_cache.dart index e2045f92..8bfe018c 100644 --- a/lib/model/user_info_cache.dart +++ b/lib/model/user_info_cache.dart @@ -59,4 +59,6 @@ class UserInfoControlModel { Future deleteAll() async{ return await sql.deleteAll(); } + + } diff --git a/lib/model/version.dart b/lib/model/version.dart new file mode 100644 index 00000000..019873cf --- /dev/null +++ b/lib/model/version.dart @@ -0,0 +1,29 @@ +class Data { + String version; + String name; + + Data.fromJson(Map json) + : version = json['version'], + name = json['name']; + + @override + String toString() { + return 'name: $name ,version: $version'; + } +} + +class Version { + Data data; + int status; + bool success; + + Version.formJson(Map json) + : status = json['status'], + success = json['success'], + data = Data.fromJson(json['data']); + + @override + String toString() { + return 'status: $status ,success: $success,date: ${data.toString()}'; + } +} diff --git a/lib/utils/data_utils.dart b/lib/utils/data_utils.dart index 97858111..149c6e22 100644 --- a/lib/utils/data_utils.dart +++ b/lib/utils/data_utils.dart @@ -1,13 +1,16 @@ import 'dart:async' show Future; +import 'package:flutter_go/model/version.dart'; +import 'package:package_info/package_info.dart'; +import 'package:url_launcher/url_launcher.dart'; + import './net_utils.dart'; import '../model/user_info.dart'; import 'package:flutter_go/api/api.dart'; - -class DataUtils{ +class DataUtils { // 登陆获取用户信息 - static Future doLogin(Map params) async{ + static Future doLogin(Map params) async { var response = await NetUtils.post(Api.DO_LOGIN, params); UserInfo userInfo = UserInfo.fromJson(response['data']); return userInfo; @@ -15,16 +18,36 @@ class DataUtils{ // 验证登陆 - static Future checkLogin() async{ + static Future checkLogin() async { var response = await NetUtils.get(Api.CHECK_LOGIN); print('验证登陆:$response'); return response['success']; } // 退出登陆 - static Future logout() async{ + static Future logout() async { var response = await NetUtils.get(Api.LOGOUT); print('退出登陆 $response'); return response['success']; } -} \ No newline at end of file + + /** + * {"status":200,"data":{"version":"0.0.2","name":"FlutterGo"},"success":true} + */ + // 检查版本 + static Future checkVersion(Map params) async { + var response = await NetUtils.get(Api.VERSION, params); + Version version = Version.formJson(response); + var currVersion = version.data.version; + PackageInfo packageInfo = await PackageInfo.fromPlatform(); + var localVersion = packageInfo.version; + //相同=0、大于=1、小于=-1 +// localVersion = '0.0.2'; +// currVersion = '1.0.6'; + if (currVersion.compareTo(localVersion) == 1) { + return true; + } else { + return false; + } + } +} diff --git a/lib/views/first_page/first_page.dart b/lib/views/first_page/first_page.dart index be9de1e5..8c7f66ea 100644 --- a/lib/views/first_page/first_page.dart +++ b/lib/views/first_page/first_page.dart @@ -26,24 +26,24 @@ class FirstPageState extends State with AutomaticKeepAliveClientMixin bool get wantKeepAlive => true; - @override + @override void initState() { super.initState(); if (key == null) { - key = GlobalKey(); - // key = const Key('__RIKEY1__'); + key = GlobalKey(); + // key = const Key('__RIKEY1__'); //获取sharePre - _unKnow = _prefs.then((SharedPreferences prefs) { - return (prefs.getBool('disclaimer::Boolean') ?? false); - }); + _unKnow = _prefs.then((SharedPreferences prefs) { + return (prefs.getBool('disclaimer::Boolean') ?? false); + }); /// 判断是否需要弹出免责声明,已经勾选过不在显示,就不会主动弹 _unKnow.then((bool value) { - new Future.delayed(const Duration(seconds: 1),(){ - if (!value && key.currentState is DisclaimerMsgState && key.currentState.showAlertDialog is Function) { - key.currentState.showAlertDialog(context); - } - }); + new Future.delayed(const Duration(seconds: 1),(){ + if (!value && key.currentState is DisclaimerMsgState && key.currentState.showAlertDialog is Function) { + key.currentState.showAlertDialog(context); + } + }); }); } } @@ -93,15 +93,15 @@ class FirstPageState extends State with AutomaticKeepAliveClientMixin Column( children: [ Stack( - //alignment: const FractionalOffset(0.9, 0.1),//方法一 - children: [ - Pagination(), - Positioned(//方法二 - top: 10.0, - left: 0.0, - child: DisclaimerMsg(key:key,pWidget:this) - ), - ]), + //alignment: const FractionalOffset(0.9, 0.1),//方法一 + children: [ + Pagination(), + Positioned(//方法二 + top: 10.0, + left: 0.0, + child: DisclaimerMsg(key:key,pWidget:this) + ), + ]), SizedBox(height: 1, child:Container(color: Theme.of(context).primaryColor)), SizedBox(height: 10), ], @@ -127,7 +127,7 @@ class FirstPageState extends State with AutomaticKeepAliveClientMixin // SizedBox(height: 2, child:Container(color: Theme.of(context).primaryColor)), new Expanded( //child: new List(), - child: listComp.ListRefresh(getIndexListData,makeCard,headerView) + child: listComp.ListRefresh(getIndexListData,makeCard,headerView) ) ] diff --git a/lib/views/first_page/main_page.dart b/lib/views/first_page/main_page.dart index 43383a85..1b4f492d 100644 --- a/lib/views/first_page/main_page.dart +++ b/lib/views/first_page/main_page.dart @@ -12,10 +12,10 @@ class _Page { } final List<_Page> _allPages = <_Page>[ - _Page('项目1'), - _Page('项目2'), - _Page('项目3'), - _Page('项目4'), + _Page('项目1'), + _Page('项目2'), + _Page('项目3'), + _Page('项目4'), ]; class MainPage extends StatelessWidget { @@ -37,7 +37,7 @@ class MainPage extends StatelessWidget { centerTitle: true, title: TabLayout(), actions: [ - IconButton( + IconButton( icon: Icon(Icons.search), onPressed: () { pushPage(context, SearchPage(), pageName: "SearchPage"); @@ -67,7 +67,7 @@ class TabLayout extends StatelessWidget { indicatorSize: TabBarIndicatorSize.label, tabs: _allPages .map((_Page page) => - Tab(text: page.labelId)) + Tab(text: page.labelId)) .toList(), ); } @@ -100,7 +100,7 @@ class TabBarViewLayout extends StatelessWidget { print("TabBarViewLayout build......."); return TabBarView( children: _allPages.map((_Page page) { - return buildTabView(context, page); - }).toList()); + return buildTabView(context, page); + }).toList()); } } diff --git a/lib/views/home.dart b/lib/views/home.dart index c0f63681..1d24cc49 100644 --- a/lib/views/home.dart +++ b/lib/views/home.dart @@ -24,6 +24,7 @@ import 'package:flutter_go/resources/widget_name_to_icon.dart'; const int ThemeColor = 0xFFC91B3A; class AppPage extends StatefulWidget { + @override State createState() { return _MyHomePageState(); @@ -32,6 +33,7 @@ class AppPage extends StatefulWidget { class _MyHomePageState extends State with SingleTickerProviderStateMixin { + SpUtil sp; WidgetControlModel widgetControl = new WidgetControlModel(); SearchHistoryList searchHistoryList; @@ -40,10 +42,10 @@ class _MyHomePageState extends State List list = List(); int _currentIndex = 0; static List tabData = [ - {'text': '业界动态', 'icon': Icon(Icons.language)}, +// {'text': '业界动态', 'icon': Icon(Icons.language)}, {'text': 'WIDGET', 'icon': Icon(Icons.extension)}, {'text': '组件收藏', 'icon': Icon(Icons.favorite)}, - {'text': '关于手册', 'icon': Icon(Icons.import_contacts)} + {'text': '关于手册', 'icon': Icon(Icons.import_contacts)}, ]; List myTabs = []; @@ -62,7 +64,7 @@ class _MyHomePageState extends State } list // ..add(FirstPage()) - ..add(MainPage()) +// ..add(MainPage()) ..add(WidgetPage(Provider.db)) ..add(CollectionPage()) ..add(FourthPage()); @@ -98,7 +100,7 @@ class _MyHomePageState extends State } Widget buildSearchInput(BuildContext context) { - return new SearchInput((value) async { + return new SearchInput((value) async { if (value != '') { List list = await widgetControl.search(value); return list @@ -107,7 +109,7 @@ class _MyHomePageState extends State icon: WidgetName2Icon.icons[item.name] ?? null, text: 'widget', onTap: () { - onWidgetTap(item, context); + onWidgetTap(item, context); }, )) .toList(); @@ -117,18 +119,18 @@ class _MyHomePageState extends State }, (value) {}, () {}); } - renderAppBar(BuildContext context,Widget widget,int index) { - print('renderAppBar=====>>>>>>${index}'); - if(index == 0) { - return null; - } + renderAppBar(BuildContext context, Widget widget, int index) { +// print('renderAppBar=====>>>>>>${index}'); +// if (index == 0) { +// return null; +// } return AppBar(title: buildSearchInput(context)); } @override Widget build(BuildContext context) { return new Scaffold( - appBar: renderAppBar(context,widget,_currentIndex), + appBar: renderAppBar(context, widget, _currentIndex), body: list[_currentIndex], bottomNavigationBar: BottomNavigationBar( items: myTabs, diff --git a/pubspec.lock b/pubspec.lock index e6e3e04f..9f81d55e 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,105 +5,105 @@ packages: dependency: transitive description: name: args - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "1.5.1" async: dependency: transitive description: name: async - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted - version: "2.2.0" + version: "2.0.8" bloc: dependency: "direct main" description: name: bloc - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "0.12.0" boolean_selector: dependency: transitive description: name: boolean_selector - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "1.0.4" charcode: dependency: transitive description: name: charcode - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "1.1.2" city_pickers: dependency: "direct main" description: name: city_pickers - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "0.0.4" collection: dependency: transitive description: name: collection - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "1.14.11" cookie_jar: dependency: "direct main" description: name: cookie_jar - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "1.0.0" csslib: dependency: transitive description: name: csslib - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "0.16.0" cupertino_icons: dependency: "direct main" description: name: cupertino_icons - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "0.1.2" dio: dependency: "direct main" description: name: dio - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "2.1.3" event_bus: dependency: "direct main" description: name: event_bus - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "1.1.0" firebase_analytics: dependency: "direct main" description: name: firebase_analytics - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "1.2.0+1" firebase_core: dependency: "direct main" description: name: firebase_core - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "0.3.4" fluro: dependency: "direct main" description: name: fluro - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "1.4.0" flutter: @@ -115,21 +115,28 @@ packages: dependency: "direct main" description: name: flutter_bloc - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "0.11.1" + flutter_downloader: + dependency: "direct main" + description: + name: flutter_downloader + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.7" flutter_markdown: dependency: "direct main" description: name: flutter_markdown - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "0.2.0" flutter_spinkit: dependency: "direct main" description: name: flutter_spinkit - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "3.1.0" flutter_test: @@ -141,98 +148,119 @@ packages: dependency: "direct main" description: name: flutter_webview_plugin - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted - version: "0.3.4" + version: "0.3.5" html: dependency: "direct main" description: name: html - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "0.14.0+2" image_picker: dependency: "direct main" description: name: image_picker - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted - version: "0.6.0+2" + version: "0.6.0+3" intl: dependency: "direct main" description: name: intl - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "0.15.7" lpinyin: dependency: transitive description: name: lpinyin - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "1.0.7" markdown: dependency: transitive description: name: markdown - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "2.0.3" matcher: dependency: transitive description: name: matcher - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted - version: "0.12.5" + version: "0.12.3+1" meta: dependency: transitive description: name: meta - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "1.1.6" + open_file: + dependency: "direct main" + description: + name: open_file + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.1+2" + package_info: + dependency: "direct main" + description: + name: package_info + url: "https://pub.dartlang.org" + source: hosted + version: "0.4.0+3" path: dependency: transitive description: name: path - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "1.6.2" path_provider: dependency: "direct main" description: name: path_provider - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "1.1.0" pedantic: dependency: transitive description: name: pedantic - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted - version: "1.5.0" + version: "1.4.0" + permission_handler: + dependency: "direct main" + description: + name: permission_handler + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" quiver: dependency: transitive description: name: quiver - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted - version: "2.0.3" + version: "2.0.1" rxdart: dependency: transitive description: name: rxdart - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "0.21.0" shared_preferences: dependency: "direct main" description: name: shared_preferences - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "0.4.3" sky_engine: @@ -244,79 +272,79 @@ packages: dependency: transitive description: name: source_span - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted - version: "1.5.5" + version: "1.5.4" sqflite: dependency: "direct main" description: name: sqflite - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "1.1.5" stack_trace: dependency: transitive description: name: stack_trace - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "1.9.3" stream_channel: dependency: transitive description: name: stream_channel - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "1.6.8" string_scanner: dependency: transitive description: name: string_scanner - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "1.0.4" synchronized: dependency: transitive description: name: synchronized - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "2.1.0" term_glyph: dependency: transitive description: name: term_glyph - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "1.1.0" test_api: dependency: transitive description: name: test_api - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted - version: "0.2.5" + version: "0.2.2" typed_data: dependency: transitive description: name: typed_data - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "1.1.6" url_launcher: dependency: "direct main" description: name: url_launcher - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "5.0.2" vector_math: dependency: transitive description: name: vector_math - url: "https://pub.flutter-io.cn" + url: "https://pub.dartlang.org" source: hosted version: "2.0.8" sdks: - dart: ">=2.2.0 <3.0.0" + dart: ">=2.1.0 <3.0.0" flutter: ">=1.2.1 <2.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index d85a81e9..215175bc 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -7,7 +7,7 @@ description: flutter_go # Both the version and the builder number may be overridden in flutter # build by specifying --build-name and --build-number, respectively. # Read more about versioning at semver.org. -version: 1.0.0 +version: 1.0.6 environment: sdk: ">=2.0.0-dev.68.0 <3.0.0" @@ -28,7 +28,6 @@ dependencies: # 本地存储、收藏功能 shared_preferences: ^0.4.3 flutter_spinkit: "^3.1.0" - path_provider: ^1.0.0 dio: ^2.0.15 flutter_webview_plugin: ^0.3.4 cookie_jar: ^1.0.0 @@ -41,6 +40,11 @@ dependencies: flutter_bloc: ^0.11.1 bloc: ^0.12.0 html: ^0.14.0+2 + flutter_downloader: ^1.1.7 + path_provider: ^1.1.0 + permission_handler: ^3.0.0 + open_file: ^2.0.1+2 + package_info: ^0.4.0+3 dev_dependencies: flutter_test: