diff --git a/assets/iconfont/icon_builder.dart b/assets/iconfont/icon_builder.dart index 885f584..8986d87 100644 --- a/assets/iconfont/icon_builder.dart +++ b/assets/iconfont/icon_builder.dart @@ -4,8 +4,9 @@ import 'package:path/path.dart' as path; main() async{ var fontName ='TolyIcon'; + var fileName ='toly_icon'; var resDir="assets/iconfont";//资源文件夹 - var outFile='lib/app/style/$fontName.dart';//输出文件地址 + var outFile='lib/app/res/$fileName.dart';//输出文件地址 var result = """import 'package:flutter/widgets.dart'; //Power By 张风捷特烈--- Generated file. Do not edit. diff --git a/lib/app/api/github/issues_api.dart b/lib/app/api/github/issues_api.dart index 5d0b25f..d52629c 100644 --- a/lib/app/api/github/issues_api.dart +++ b/lib/app/api/github/issues_api.dart @@ -1,43 +1,46 @@ -import 'package:flutter_unit/app/utils/http/http_util.dart'; -import 'package:flutter_unit/app/utils/http/rep_result.dart'; +import 'dart:convert'; + +import 'package:dio/dio.dart'; +import 'package:flutter_unit/model/github/IssueComment.dart'; import 'package:flutter_unit/model/github/issue.dart'; +import 'package:flutter_unit/model/github/repository.dart'; /// create by 张风捷特烈 on 2020/6/17 /// contact me by email 1981462002@qq.com /// 说明: + +const kBaseUrl= 'http://119.45.173.197:8080/api/v1'; + class IssuesApi { - static getIssues({ - String username="toly1994328", - String repository="FlutterUnit", - String sort = 'created', - String direction = 'desc', - int page = 0, - int pageSize = 10, - String state = 'all', - String labels = "all", - }) async { - var url = "/repos/$username/$repository/issues"; - var param = { - "state": state, - "sort": sort, - "direction": direction, - "labels": labels, - "page": page, - "per_page": pageSize, - }; - var res = await HttpUtil.getInstance().get(url, param: param); + static var dio = Dio( + BaseOptions( + baseUrl: kBaseUrl + ) + ); - if (res != null && res.status) { - var data = res.data as List; + static Future getRepoFlutterUnit() async{ + var rep = await dio.get('/repository/name/FlutterUnit'); + var repoStr = rep.data['repositoryData']; + return Repository.fromJson(json.decode(repoStr)); + } - if (data == null) { - return RepResult(null, false, -1); - } + static Future> getIssues() async { + var res = (await dio.get('/point')).data as List; + return res.map((e)=>Issue.fromJson(json.decode(e['pointData']))).toList(); + } - return RepResult(data.map(Issue.fromJson).toList(), true, 1); - } + static Future> getIssuesComment(int pointId) async { + var res = (await dio.get('/pointComment/$pointId')).data as List; + return res.map((e)=>IssueComment.fromJson(json.decode(e['pointCommentData']))).toList(); } } + +main() async{ + var rep = await IssuesApi.getRepoFlutterUnit(); + var i = await IssuesApi.getIssues(); + print(rep); + print(i); +} diff --git a/lib/app/res/cons.dart b/lib/app/res/cons.dart index 3cbb40c..93a13b8 100644 --- a/lib/app/res/cons.dart +++ b/lib/app/res/cons.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:flutter_unit/app/style/TolyIcon.dart'; +import 'package:flutter_unit/app/res/toly_icon.dart'; import 'package:flutter_unit/components/permanent/code/highlighter_style.dart'; class Cons { diff --git a/lib/app/res/constant/github_client_config.dart b/lib/app/res/constant/github_client_config.dart deleted file mode 100644 index 28145f6..0000000 --- a/lib/app/res/constant/github_client_config.dart +++ /dev/null @@ -1,8 +0,0 @@ -/// create by 张风捷特烈 on 2020/6/16 -/// contact me by email 1981462002@qq.com -/// 说明: - -class GithubClientConfig { - static const clientId = "7f2e92c1db43b9434585"; - static const clientSecret = "f492b1d894d9dc638391e7b874b613cf54238eb4"; -} \ No newline at end of file diff --git a/lib/app/style/NoScrollBehavior.dart b/lib/app/res/style/behavior/no_scroll_behavior.dart similarity index 100% rename from lib/app/style/NoScrollBehavior.dart rename to lib/app/res/style/behavior/no_scroll_behavior.dart diff --git a/lib/app/style/shape/coupon_shape_border.dart b/lib/app/res/style/shape/coupon_shape_border.dart similarity index 100% rename from lib/app/style/shape/coupon_shape_border.dart rename to lib/app/res/style/shape/coupon_shape_border.dart diff --git a/lib/app/style/shape/techno_shape.dart b/lib/app/res/style/shape/techno_shape.dart similarity index 100% rename from lib/app/style/shape/techno_shape.dart rename to lib/app/res/style/shape/techno_shape.dart diff --git a/lib/app/res/style/unit_color.dart b/lib/app/res/style/unit_color.dart new file mode 100644 index 0000000..bdb35a7 --- /dev/null +++ b/lib/app/res/style/unit_color.dart @@ -0,0 +1,71 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-04-19 +/// contact me by email 1981462002@qq.com +/// 说明: + +class UnitColor { + static const collectColorSupport = [ + Color(0xFFF2F2F2), + Colors.black, + Colors.red, + Colors.orange, + Colors.yellow, + Colors.green, + Colors.blue, + Colors.indigo, + Colors.purple, + + Colors.cyanAccent, + Color(0xffd1d08f), + Colors.pink, + Colors.amber, + Colors.lime, + Colors.teal, + Colors.cyan, + Color(0xff586CF2), + Colors.purpleAccent, + ]; + + static const int primaryIntValue = 0xFF24292E; + + static const MaterialColor primarySwatch = const MaterialColor( + primaryIntValue, + const { + 50: const Color(primaryIntValue), + 100: const Color(primaryIntValue), + 200: const Color(primaryIntValue), + 300: const Color(primaryIntValue), + 400: const Color(primaryIntValue), + 500: const Color(primaryIntValue), + 600: const Color(primaryIntValue), + 700: const Color(primaryIntValue), + 800: const Color(primaryIntValue), + 900: const Color(primaryIntValue), + }, + ); + + static const String primaryValueString = "#24292E"; + static const String primaryLightValueString = "#42464b"; + static const String primaryDarkValueString = "#121917"; + static const String miWhiteString = "#ececec"; + static const String actionBlueString = "#267aff"; + static const String webDraculaBackgroundColorString = "#282a36"; + + static const Color primaryValue = Color(0xFF24292E); + static const Color primaryLightValue = Color(0xFF42464b); + static const Color primaryDarkValue = Color(0xFF121917); + + static const Color cardWhite = Color(0xFFFFFFFF); + static const Color textWhite = Color(0xFFFFFFFF); + static const Color miWhite = Color(0xffececec); + static const Color white = Color(0xFFFFFFFF); + static const Color actionBlue = Color(0xff267aff); + static const Color subTextColor = Color(0xff959595); + static const Color subLightTextColor = Color(0xffc4c4c4); + + static const Color mainBackgroundColor = miWhite; + + static const Color mainTextColor = primaryDarkValue; + static const Color textColorWhite = white; +} diff --git a/lib/app/res/style/unit_text_style.dart b/lib/app/res/style/unit_text_style.dart new file mode 100644 index 0000000..3d6871e --- /dev/null +++ b/lib/app/res/style/unit_text_style.dart @@ -0,0 +1,165 @@ +import 'package:flutter/material.dart'; + +import 'unit_color.dart'; + +///文本样式 +class UnitTextStyle { + + static const lagerTextSize = 30.0; + static const bigTextSize = 23.0; + static const normalTextSize = 18.0; + static const middleTextWhiteSize = 16.0; + static const smallTextSize = 14.0; + static const minTextSize = 12.0; + + static const minText = TextStyle( + color: UnitColor.subLightTextColor, + fontSize: minTextSize, + ); + + static const smallTextWhite = TextStyle( + color: UnitColor.textColorWhite, + fontSize: smallTextSize, + ); + + static const smallText = TextStyle( + color: UnitColor.mainTextColor, + fontSize: smallTextSize, + ); + + static const smallTextBold = TextStyle( + color: UnitColor.mainTextColor, + fontSize: smallTextSize, + fontWeight: FontWeight.bold, + ); + + static const smallSubLightText = TextStyle( + color: UnitColor.subLightTextColor, + fontSize: smallTextSize, + ); + + static const smallActionLightText = TextStyle( + color: UnitColor.actionBlue, + fontSize: smallTextSize, + ); + + static const smallMiLightText = TextStyle( + color: UnitColor.miWhite, + fontSize: smallTextSize, + ); + + static const smallSubText = TextStyle( + color: UnitColor.subTextColor, + fontSize: smallTextSize, + ); + + static const middleText = TextStyle( + color: UnitColor.mainTextColor, + fontSize: middleTextWhiteSize, + ); + + static const middleTextWhite = TextStyle( + color: UnitColor.textColorWhite, + fontSize: middleTextWhiteSize, + ); + + static const middleSubText = TextStyle( + color: UnitColor.subTextColor, + fontSize: middleTextWhiteSize, + ); + + static const middleSubLightText = TextStyle( + color: UnitColor.subLightTextColor, + fontSize: middleTextWhiteSize, + ); + + static const middleTextBold = TextStyle( + color: UnitColor.mainTextColor, + fontSize: middleTextWhiteSize, + fontWeight: FontWeight.bold, + ); + + static const middleTextWhiteBold = TextStyle( + color: UnitColor.textColorWhite, + fontSize: middleTextWhiteSize, + fontWeight: FontWeight.bold, + ); + + static const middleSubTextBold = TextStyle( + color: UnitColor.subTextColor, + fontSize: middleTextWhiteSize, + fontWeight: FontWeight.bold, + ); + + static const normalText = TextStyle( + color: UnitColor.mainTextColor, + fontSize: normalTextSize, + ); + + static const normalTextBold = TextStyle( + color: UnitColor.mainTextColor, + fontSize: normalTextSize, + fontWeight: FontWeight.bold, + ); + + static const normalSubText = TextStyle( + color: UnitColor.subTextColor, + fontSize: normalTextSize, + ); + + static const normalTextWhite = TextStyle( + color: UnitColor.textColorWhite, + fontSize: normalTextSize, + ); + + static const normalTextMitWhiteBold = TextStyle( + color: UnitColor.miWhite, + fontSize: normalTextSize, + fontWeight: FontWeight.bold, + ); + + static const normalTextActionWhiteBold = TextStyle( + color: UnitColor.actionBlue, + fontSize: normalTextSize, + fontWeight: FontWeight.bold, + ); + + static const normalTextLight = TextStyle( + color: UnitColor.primaryLightValue, + fontSize: normalTextSize, + ); + + static const largeText = TextStyle( + color: UnitColor.mainTextColor, + fontSize: bigTextSize, + ); + + static const largeTextBold = TextStyle( + color: UnitColor.mainTextColor, + fontSize: bigTextSize, + fontWeight: FontWeight.bold, + ); + + static const largeTextWhite = TextStyle( + color: UnitColor.textColorWhite, + fontSize: bigTextSize, + ); + + static const largeTextWhiteBold = TextStyle( + color: UnitColor.textColorWhite, + fontSize: bigTextSize, + fontWeight: FontWeight.bold, + ); + + static const largeLargeTextWhite = TextStyle( + color: UnitColor.textColorWhite, + fontSize: lagerTextSize, + fontWeight: FontWeight.bold, + ); + + static const largeLargeText = TextStyle( + color: UnitColor.primaryValue, + fontSize: lagerTextSize, + fontWeight: FontWeight.bold, + ); +} \ No newline at end of file diff --git a/lib/app/style/TolyIcon.dart b/lib/app/res/toly_icon.dart similarity index 100% rename from lib/app/style/TolyIcon.dart rename to lib/app/res/toly_icon.dart diff --git a/lib/app/router.dart b/lib/app/router.dart index b5a391f..75f8628 100644 --- a/lib/app/router.dart +++ b/lib/app/router.dart @@ -5,7 +5,8 @@ import 'package:flutter_unit/views/pages/about/about_app_page.dart'; import 'package:flutter_unit/views/pages/about/version_info.dart'; import 'package:flutter_unit/views/pages/category/category_detail.dart'; import 'package:flutter_unit/views/pages/category/collect_page.dart'; -import 'package:flutter_unit/views/pages/issues/main.dart'; +import 'package:flutter_unit/views/pages/issues/issues_detail.dart'; +import 'package:flutter_unit/views/pages/issues/point_page.dart'; import 'package:flutter_unit/views/pages/login/login_page.dart'; import 'package:flutter_unit/views/pages/search/serach_page.dart'; import 'package:flutter_unit/views/pages/setting/code_style_setting.dart'; @@ -30,6 +31,8 @@ class UnitRouter { static const String nav = 'nav'; static const String widget_detail = 'WidgetDetail'; static const String collect = 'CollectPage'; + static const String point = 'IssuesPointPage'; + static const String point_detail = 'IssuesDetailPage'; static const String setting = 'SettingPage'; static const String font_setting = 'FountSettingPage'; @@ -95,6 +98,9 @@ class UnitRouter { case about_me: return Right2LeftRouter(child: AboutMePage()); + case point_detail: + return Right2LeftRouter(child: IssuesDetailPage()); + case category_show: return Right2LeftRouter( child: CategoryShow( diff --git a/lib/app/style/unit_color.dart b/lib/app/style/unit_color.dart deleted file mode 100644 index 69d009d..0000000 --- a/lib/app/style/unit_color.dart +++ /dev/null @@ -1,29 +0,0 @@ -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-04-19 -/// contact me by email 1981462002@qq.com -/// 说明: - -class UnitColor { - static const collectColorSupport = [ - Color(0xFFF2F2F2), - Colors.black, - Colors.red, - Colors.orange, - Colors.yellow, - Colors.green, - Colors.blue, - Colors.indigo, - Colors.purple, - - Colors.cyanAccent, - Color(0xffd1d08f), - Colors.pink, - Colors.amber, - Colors.lime, - Colors.teal, - Colors.cyan, - Color(0xff586CF2), - Colors.purpleAccent, - ]; -} diff --git a/lib/app/style/unit_text_style.dart b/lib/app/style/unit_text_style.dart deleted file mode 100644 index 596d070..0000000 --- a/lib/app/style/unit_text_style.dart +++ /dev/null @@ -1,17 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -/// create by 张风捷特烈 on 2020-04-19 -/// contact me by email 1981462002@qq.com -/// 说明: -// -//class UnitTextStyle { -// static TextStyle withSizeColor(double fontSize, Color color) => -// TextStyle(fontSize: 16, color: color); -// -// static TextStyle title() => -// withSizeColor(16,Colors.black); -// -// static TextStyle titleTheme(BuildContext context) => -// withSizeColor(16, Theme.of(context).primaryColor); -//} diff --git a/lib/app/utils/http/code.dart b/lib/app/utils/http/code.dart deleted file mode 100644 index e85d8a3..0000000 --- a/lib/app/utils/http/code.dart +++ /dev/null @@ -1,30 +0,0 @@ -//import 'package:gsy_github_app_flutter/common/event/http_error_event.dart'; -//import 'package:gsy_github_app_flutter/common/event/index.dart'; - -///错误编码 -class Code { - ///网络错误 - static const NETWORK_ERROR = -1; - - ///网络超时 - static const NETWORK_TIMEOUT = -2; - - ///网络返回数据格式化一次 - static const NETWORK_JSON_EXCEPTION = -3; - - ///Github APi Connection refused - static const GITHUB_API_REFUSED = -4; - - static const SUCCESS = 200; - - static errorHandleFunction(code, message, noTip) { - if (noTip) { - return message; - } - if(message != null && message is String && (message.contains("Connection refused") || message.contains("Connection reset"))) { - code = GITHUB_API_REFUSED; - } -// eventBus.fire(new HttpErrorEvent(code, message)); - return message; - } -} diff --git a/lib/app/utils/http/http_util.dart b/lib/app/utils/http/http_util.dart deleted file mode 100644 index 9a17d2b..0000000 --- a/lib/app/utils/http/http_util.dart +++ /dev/null @@ -1,133 +0,0 @@ -import 'dart:collection'; - -import 'package:dio/dio.dart'; -import 'rep_result.dart'; - -import 'code.dart'; -import 'interceptors/log_interceptor.dart'; -import 'interceptors/response_interceptor.dart'; -import 'interceptors/token_interceptor.dart'; - -const String _kBaseUrl = "https://api.github.com"; -const int _kReceiveTimeout = 15000; -const int _kSendTimeout = 15000; -const int _kConnectTimeout = 15000; -const String _kTokenKey = 'Authorization'; -const String _kTokenPrefix = 'Bearer '; - -///http请求 -class HttpUtil { - static const CONTENT_TYPE_JSON = "application/json"; - static const CONTENT_TYPE_FORM = "application/x-www-form-urlencoded"; - - static HttpUtil _instance = HttpUtil._internal(); - - Dio _dio; - - void setToken(String token) { - _tokenInterceptors.token = token; - } - - void clearToken(String token) { - setToken(null); - } - - ///通用全局单例,第一次使用时初始化 - HttpUtil._internal({String token}) { - if (null == _dio) { - _dio = Dio(BaseOptions( - baseUrl: _kBaseUrl, - connectTimeout: _kReceiveTimeout, - receiveTimeout: _kConnectTimeout, - sendTimeout: _kSendTimeout, - )); - - _dio.interceptors.add(LogsInterceptors()); - _dio.interceptors.add(ResponseInterceptors()); - _dio.interceptors.add(_tokenInterceptors); - } - } - - static HttpUtil getInstance() { - return _instance; - } - - void rebase(String baseUrl) { - _dio.options.baseUrl = baseUrl; - } - - final TokenInterceptor _tokenInterceptors = TokenInterceptor(); - - Future get(String url, - {Map header, Map param}) async { - Response response; - try { - response = await _dio.get(url, queryParameters: param); - } on DioError catch (e) { - return resultError(e); - } - if (response.data is DioError) { - return resultError(response.data); - } - return response.data; - } - - Future post(String url, - {Map param, data, Options options,}) async { - Response response; - try { - response = await _dio.post( - url, data: data, queryParameters: param, options: options); - } on DioError catch (e) { - return resultError(e); - } - if (response.data is DioError) { - return resultError(response.data); - } - return response.data; - } - - Future put(String url, {Map param, data}) async { - Response response; - try { - response = await _dio.put(url, data: data, queryParameters: param); - } on DioError catch (e) { - return resultError(e); - } - if (response.data is DioError) { - return resultError(response.data); - } - return response.data; - } - - Future delete(String url, - {Map param, data}) async { - Response response; - try { - response = await _dio.delete(url, data: data, queryParameters: param); - } on DioError catch (e) { - return resultError(e); - } - if (response.data is DioError) { - return resultError(response.data); - } - return response.data; - } - - resultError(DioError e) { - Response errorResponse; - if (e.response != null) { - errorResponse = e.response; - } else { - errorResponse = Response(statusCode: 666); - } - if (e.type == DioErrorType.CONNECT_TIMEOUT || - e.type == DioErrorType.RECEIVE_TIMEOUT) { - errorResponse.statusCode = Code.NETWORK_TIMEOUT; - } - return RepResult( - Code.errorHandleFunction(errorResponse.statusCode, e.message, false), - false, - errorResponse.statusCode); - } -} \ No newline at end of file diff --git a/lib/app/utils/http/interceptors/error_interceptor.dart b/lib/app/utils/http/interceptors/error_interceptor.dart deleted file mode 100644 index eaa28e5..0000000 --- a/lib/app/utils/http/interceptors/error_interceptor.dart +++ /dev/null @@ -1,32 +0,0 @@ -import 'package:connectivity/connectivity.dart'; -import 'package:dio/dio.dart'; - -import '../code.dart'; -import '../rep_result.dart'; - -/// create by 张风捷特烈 on 2020/4/28 -/// contact me by email 1981462002@qq.com -/// 说明: - -///是否需要弹提示 -const NOT_TIP_KEY = "noTip"; - - -class ErrorInterceptors extends InterceptorsWrapper { - final Dio _dio; - - ErrorInterceptors(this._dio); - - @override - onRequest(RequestOptions options) async { - //没有网络 - var connectivityResult = await (new Connectivity().checkConnectivity()); - if (connectivityResult == ConnectivityResult.none) { - return _dio.resolve(new RepResult( - Code.errorHandleFunction(Code.NETWORK_ERROR, "", false), - false, - Code.NETWORK_ERROR)); - } - return options; - } -} diff --git a/lib/app/utils/http/interceptors/header_interceptor.dart b/lib/app/utils/http/interceptors/header_interceptor.dart deleted file mode 100644 index dd78477..0000000 --- a/lib/app/utils/http/interceptors/header_interceptor.dart +++ /dev/null @@ -1,16 +0,0 @@ -import 'package:dio/dio.dart'; - -/// create by 张风捷特烈 on 2020/4/28 -/// contact me by email 1981462002@qq.com -/// 说明: -/// -class HeaderInterceptors extends InterceptorsWrapper { - @override - onRequest(RequestOptions options) async { - ///超时 - options.connectTimeout = 30000; - options.receiveTimeout = 30000; - - return options; - } -} diff --git a/lib/app/utils/http/interceptors/log_interceptor.dart b/lib/app/utils/http/interceptors/log_interceptor.dart deleted file mode 100644 index 058e8c5..0000000 --- a/lib/app/utils/http/interceptors/log_interceptor.dart +++ /dev/null @@ -1,112 +0,0 @@ -import 'dart:convert'; -import 'package:dio/dio.dart'; - -/// create by 张风捷特烈 on 2020/4/28 -/// contact me by email 1981462002@qq.com -/// 说明: -/// -class LogsInterceptors extends InterceptorsWrapper { - static bool debug = true; - - static List sHttpResponses = new List(); - static List sResponsesHttpUrl = new List(); - - static List> sHttpRequest = - new List>(); - static List sRequestHttpUrl = new List(); - - static List> sHttpError = - new List>(); - static List sHttpErrorUrl = new List(); - - @override - onRequest(RequestOptions options) async { - if (debug) { - print("请求url:${options.path}"); - print('请求头: ' + options.headers.toString()); - if (options.data != null) { - print('请求参数: ' + options.data.toString()); - } - } - try { - addLogic(sRequestHttpUrl, options.path ?? ""); - var data; - if (options.data is Map) { - data = options.data; - } else { - data = Map(); - } - var map = { - "header:": {...options.headers}, - }; - if (options.method == "POST") { - map["data"] = data; - } - addLogic(sHttpRequest, map); - } catch (e) { - print(e); - } - return options; - } - - @override - onResponse(Response response) async { - if (debug) { - if (response != null) { - print('返回参数: ' + response.toString()); - } - } - if (response.data is Map || response.data is List) { - try { - var data = Map(); - data["data"] = response.data; - addLogic(sResponsesHttpUrl, response?.request?.uri?.toString() ?? ""); - addLogic(sHttpResponses, data); - } catch (e) { - print(e); - } - } else if (response.data is String) { - try { - var data = Map(); - data["data"] = response.data; - addLogic(sResponsesHttpUrl, response?.request?.uri.toString() ?? ""); - addLogic(sHttpResponses, data); - } catch (e) { - print(e); - } - } else if (response.data != null) { - try { - String data = response.data.toJson(); - addLogic(sResponsesHttpUrl, response?.request?.uri.toString() ?? ""); - addLogic(sHttpResponses, json.decode(data)); - } catch (e) { - print(e); - } - } - return response; // continue - } - - @override - onError(DioError err) async { - if (debug) { - print('请求异常: ' + err.toString()); - print('请求异常信息: ' + (err.response?.toString() ?? "")); - } - try { - addLogic(sHttpErrorUrl, err.request.path ?? "null"); - var errors = Map(); - errors["error"] = err.message; - addLogic(sHttpError, errors); - } catch (e) { - print(e); - } - return err; // continue; - } - - static addLogic(List list, data) { - if (list.length > 20) { - list.removeAt(0); - } - list.add(data); - } -} diff --git a/lib/app/utils/http/interceptors/response_interceptor.dart b/lib/app/utils/http/interceptors/response_interceptor.dart deleted file mode 100644 index a29b482..0000000 --- a/lib/app/utils/http/interceptors/response_interceptor.dart +++ /dev/null @@ -1,27 +0,0 @@ -import 'package:dio/dio.dart'; -import '../code.dart'; -import '../rep_result.dart'; - -/// create by 张风捷特烈 on 2020/4/28 -/// contact me by email 1981462002@qq.com -/// 说明: -/// -class ResponseInterceptors extends InterceptorsWrapper { - @override - onResponse(Response response) async { - RequestOptions option = response.request; - var value; - try { - var header = response.headers[Headers.contentTypeHeader]; - if ((header != null && header.toString().contains("text"))) { - value = new RepResult(response.data, true, Code.SUCCESS); - } else if (response.statusCode >= 200 && response.statusCode < 300) { - value = new RepResult(response.data, true, Code.SUCCESS,); - } - } catch (e) { - print(e.toString() + option.path); - value = new RepResult(response.data, false, response.statusCode,msg: e.toString()); - } - return value; - } -} diff --git a/lib/app/utils/http/interceptors/token_interceptor.dart b/lib/app/utils/http/interceptors/token_interceptor.dart deleted file mode 100644 index 8a1fb12..0000000 --- a/lib/app/utils/http/interceptors/token_interceptor.dart +++ /dev/null @@ -1,64 +0,0 @@ -import 'package:dio/dio.dart'; - -/// create by 张风捷特烈 on 2020/4/28 -/// contact me by email 1981462002@qq.com -/// 说明: - - -const String _kTokenKey = 'Authorization'; -const String _kTokenPrefix = 'token '; - -class TokenInterceptor extends InterceptorsWrapper { - String _token; - - set token(String value) { - _token = value; - } - - @override - onRequest(RequestOptions options) async { - //_token非空,拦截请求,添加token - if(_token!=null&&_token.isNotEmpty){ - options.headers[_kTokenKey] = '$_kTokenPrefix$_token'; - } - return options; - } - - @override - onResponse(Response response) async { -// try { -// var responseJson = response.data; -// if (response.statusCode == 201 && responseJson["token"] != null) { -// _token = 'token ' + responseJson["token"]; -// await LocalStorage.save(Config.TOKEN_KEY, _token); -// } -// } catch (e) { -// print(e); -// } - return response; - } - - ///清除授权 - clearAuthorization() { -// this._token = null; -// LocalStorage.remove(Config.TOKEN_KEY); -// releaseClient(); - } - - ///获取授权token - getAuthorization() async { -// String token = await LocalStorage.get(Config.TOKEN_KEY); -// if (token == null) { -// String basic = await LocalStorage.get(Config.USER_BASIC_CODE); -// if (basic == null) { -// //提示输入账号密码 -// } else { -// //通过 basic 去获取token,获取到设置,返回token -// return "Basic $basic"; -// } -// } else { -// this._token = token; -// return token; -// } - } -} diff --git a/lib/app/utils/http/rep_result.dart b/lib/app/utils/http/rep_result.dart deleted file mode 100644 index eae6094..0000000 --- a/lib/app/utils/http/rep_result.dart +++ /dev/null @@ -1,28 +0,0 @@ - -class RepResult { - var data; - bool status; - int code; - String msg; - - RepResult(this.data, this.status, this.code, {this.msg=""}); - - @override - String toString() { - return 'RepResult{data: $data, result: $status, code: $code, msg: $msg}'; - } -} - -//class RepResult { -// T data; -// bool status; -// int code; -// -// RepResult(this.data, this.status, this.code); -// -// @override -// String toString() { -// return 'RepResult{data: $data, status: $status, code:$code}'; -// } -// -//} \ No newline at end of file diff --git a/lib/blocs/category/category_bloc.dart b/lib/blocs/category/category_bloc.dart index bc20dd1..1e2b23c 100644 --- a/lib/blocs/category/category_bloc.dart +++ b/lib/blocs/category/category_bloc.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/app/style/unit_color.dart'; +import 'package:flutter_unit/app/res/style/unit_color.dart'; import 'package:flutter_unit/app/utils/color_utils.dart'; import 'package:flutter_unit/repositories/itf/category_repository.dart'; import 'package:flutter_unit/storage/po/category_po.dart'; diff --git a/lib/blocs/point/point_bloc.dart b/lib/blocs/point/point_bloc.dart new file mode 100644 index 0000000..cb84201 --- /dev/null +++ b/lib/blocs/point/point_bloc.dart @@ -0,0 +1,36 @@ + +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_unit/app/api/github/issues_api.dart'; +import 'package:flutter_unit/blocs/point/point_state.dart'; + + +import 'point_event.dart'; + + +/// create by 张风捷特烈 on 2020-03-03 +/// contact me by email 1981462002@qq.com +/// 说明: + +class PointBloc extends Bloc { + + @override + PointState get initialState => PointLoading(); + + @override + Stream mapEventToState(PointEvent event) async* { + if (event is EventLoadPoint) { + yield* _mapLoadWidgetToState(); + } + } + + Stream _mapLoadWidgetToState() async* { + yield PointLoading(); + try { + final issues = await IssuesApi.getIssues(); + yield PointLoaded(issues); + } catch (err) { + print(err); + yield PointLoadFailure(err); + } + } +} diff --git a/lib/blocs/point/point_event.dart b/lib/blocs/point/point_event.dart new file mode 100644 index 0000000..5c686d5 --- /dev/null +++ b/lib/blocs/point/point_event.dart @@ -0,0 +1,16 @@ +import 'package:equatable/equatable.dart'; + +/// create by 张风捷特烈 on 2020/9/3 +/// contact me by email 1981462002@qq.com +/// 说明: + +abstract class PointEvent extends Equatable { + +} + +class EventLoadPoint extends PointEvent{ + + @override + List get props => []; + +} \ No newline at end of file diff --git a/lib/blocs/point/point_state.dart b/lib/blocs/point/point_state.dart new file mode 100644 index 0000000..c3da3d2 --- /dev/null +++ b/lib/blocs/point/point_state.dart @@ -0,0 +1,36 @@ +import 'package:equatable/equatable.dart'; +import 'package:flutter_unit/model/github/issue.dart'; + +/// create by 张风捷特烈 on 2020/9/3 +/// contact me by email 1981462002@qq.com +/// 说明: + +abstract class PointState extends Equatable{ + +} + +class PointLoading extends PointState{ + @override + List get props => []; +} + +class PointLoaded extends PointState{ + + final List issues; + + PointLoaded(this.issues); + + @override + List get props => [issues]; +} + + +class PointLoadFailure extends PointState{ + + final String error; + + PointLoadFailure(this.error); + + @override + List get props => [error]; +} \ No newline at end of file diff --git a/lib/blocs/point_comment/point_comment_bloc.dart b/lib/blocs/point_comment/point_comment_bloc.dart new file mode 100644 index 0000000..1f9e545 --- /dev/null +++ b/lib/blocs/point_comment/point_comment_bloc.dart @@ -0,0 +1,38 @@ + +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_unit/app/api/github/issues_api.dart'; +import 'package:flutter_unit/blocs/point/point_state.dart'; + + +import 'point_comment_event.dart'; +import 'point_comment_state.dart'; + + +/// create by 张风捷特烈 on 2020-03-03 +/// contact me by email 1981462002@qq.com +/// 说明: + +class PointCommentBloc extends Bloc { + + @override + PointCommentState get initialState => PointCommentInitial(); + + @override + Stream mapEventToState(PointCommentEvent event) async* { + if (event is EventLoadPointComment) { + yield* _mapLoadWidgetToState(event); + } + } + + Stream _mapLoadWidgetToState(EventLoadPointComment event) async* { + yield PointCommentLoading(event.point); + try { + final comments = await IssuesApi.getIssuesComment(event.point.number); + comments.sort((a,b)=>a.createdAt.compareTo(b.createdAt)); + yield PointCommentLoaded(event.point,comments); + } catch (err) { + print(err); + yield PointCommentLoadFailure(err); + } + } +} diff --git a/lib/blocs/point_comment/point_comment_event.dart b/lib/blocs/point_comment/point_comment_event.dart new file mode 100644 index 0000000..3dfc044 --- /dev/null +++ b/lib/blocs/point_comment/point_comment_event.dart @@ -0,0 +1,19 @@ + + +import 'package:equatable/equatable.dart'; +import 'package:flutter_unit/model/github/issue.dart'; + +/// create by 张风捷特烈 on 2020/9/3 +/// contact me by email 1981462002@qq.com +/// 说明: + +abstract class PointCommentEvent extends Equatable {} + +class EventLoadPointComment extends PointCommentEvent { + final Issue point; + + EventLoadPointComment(this.point); + + @override + List get props => [point]; +} diff --git a/lib/blocs/point_comment/point_comment_state.dart b/lib/blocs/point_comment/point_comment_state.dart new file mode 100644 index 0000000..68452b0 --- /dev/null +++ b/lib/blocs/point_comment/point_comment_state.dart @@ -0,0 +1,54 @@ +import 'package:equatable/equatable.dart'; +import 'package:flutter_unit/model/github/IssueComment.dart'; +import 'package:flutter_unit/model/github/issue.dart'; + +/// create by 张风捷特烈 on 2020/9/3 +/// contact me by email 1981462002@qq.com +/// 说明: + +abstract class PointCommentState extends Equatable{ + +} + +class PointCommentInitial extends PointCommentState{ + + + @override + List get props => []; +} + +class PointCommentLoading extends PointCommentState{ + final Issue issue; + + PointCommentLoading(this.issue); + + @override + List get props => [issue]; +} + +class PointCommentLoaded extends PointCommentState{ + + final Issue issue; + final List comments; + + PointCommentLoaded(this.issue,this.comments); + + @override + List get props => [issue,comments]; + + @override + String toString() { + return 'PointCommentLoaded{issue: $issue, comments: $comments}'; + } +} + + +class PointCommentLoadFailure extends PointCommentState{ + + final String error; + + PointCommentLoadFailure(this.error); + + @override + List get props => [error]; +} \ No newline at end of file diff --git a/lib/components/permanent/color_wrapper.dart b/lib/components/permanent/color_wrapper.dart new file mode 100644 index 0000000..5805b7a --- /dev/null +++ b/lib/components/permanent/color_wrapper.dart @@ -0,0 +1,30 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/3 +/// contact me by email 1981462002@qq.com +/// 说明: + +class WrapColor extends StatelessWidget { + final Widget child; + final Color color; + final double radius; + final EdgeInsetsGeometry padding; + + WrapColor( + {this.child, + this.color = Colors.blue, + this.radius = 5, + this.padding = + const EdgeInsets.only(left: 4, right: 4, top: 0, bottom: 0)}); + + @override + Widget build(BuildContext context) { + return Container( + child: child, + padding: padding, + decoration: BoxDecoration( + color: color, + borderRadius: BorderRadius.all(Radius.circular(radius))), + ); + } +} \ No newline at end of file diff --git a/lib/components/permanent/markdown/markdown_widget.dart b/lib/components/permanent/markdown/markdown_widget.dart new file mode 100644 index 0000000..0b1fee7 --- /dev/null +++ b/lib/components/permanent/markdown/markdown_widget.dart @@ -0,0 +1,187 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_markdown/flutter_markdown.dart'; +import 'package:flutter_unit/app/res/style/unit_text_style.dart'; +import 'package:flutter_unit/app/res/style/unit_color.dart'; +import 'package:flutter_unit/components/permanent/markdown/syntax_high_lighter.dart'; + + +class MarkdownWidget extends StatelessWidget { + static const int kWhite = 0; + static const int kDarkLight = 1; + static const int kDarkTheme = 2; + + final String markdownData; + final int style; + + MarkdownWidget({this.markdownData = "", this.style = kWhite}); + + _getCommonSheet(BuildContext context, Color codeBackground) { + MarkdownStyleSheet markdownStyleSheet = MarkdownStyleSheet.fromTheme(Theme.of(context)); + return markdownStyleSheet.copyWith( + codeblockDecoration: new BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(4.0)), + color: codeBackground, + border: new Border.all( + color: UnitColor.subTextColor, width: 0.3))) + .copyWith( + blockquoteDecoration: new BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(4.0)), + color: UnitColor.subTextColor, + border: new Border.all( + color: UnitColor.subTextColor, width: 0.3)), + blockquote: UnitTextStyle.smallTextWhite); + } + + _getStyleSheetDark(BuildContext context) { + return _getCommonSheet(context, Color.fromRGBO(40, 44, 52, 1.00)).copyWith( + p: UnitTextStyle.smallTextWhite, + h1: UnitTextStyle.largeLargeTextWhite, + h2: UnitTextStyle.largeTextWhiteBold, + h3: UnitTextStyle.normalTextMitWhiteBold, + h4: UnitTextStyle.middleTextWhite, + h5: UnitTextStyle.smallTextWhite, + h6: UnitTextStyle.smallTextWhite, + em: const TextStyle(fontStyle: FontStyle.italic), + strong: UnitTextStyle.middleTextWhiteBold, + code: UnitTextStyle.smallSubText, + ); + } + + _getStyleSheetWhite(BuildContext context) { + return _getCommonSheet(context, Color.fromRGBO(40, 44, 52, 1.00)).copyWith( + p: UnitTextStyle.smallText, + h1: UnitTextStyle.largeLargeText, + h2: UnitTextStyle.largeTextBold, + h3: UnitTextStyle.normalTextBold, + h4: UnitTextStyle.middleText, + h5: UnitTextStyle.smallText, + h6: UnitTextStyle.smallText, + strong: UnitTextStyle.middleTextBold, + code: UnitTextStyle.smallSubText, + ); + } + + _getStyleSheetTheme(BuildContext context) { + return _getCommonSheet(context, Color.fromRGBO(40, 44, 52, 1.00)).copyWith( + p: UnitTextStyle.smallTextWhite, + h1: UnitTextStyle.largeLargeTextWhite, + h2: UnitTextStyle.largeTextWhiteBold, + h3: UnitTextStyle.normalTextMitWhiteBold, + h4: UnitTextStyle.middleTextWhite, + h5: UnitTextStyle.smallTextWhite, + h6: UnitTextStyle.smallTextWhite, + em: const TextStyle(fontStyle: FontStyle.italic), + strong: UnitTextStyle.middleTextWhiteBold, + code: UnitTextStyle.smallSubText, + ); + } + + _getBackgroundColor(context) { + Color background = UnitColor.white; + switch (style) { + case kDarkLight: + background = UnitColor.primaryLightValue; + break; + case kDarkTheme: + background = Theme.of(context).primaryColor; + break; + } + return background; + } + + _getStyle(BuildContext context) { + var styleSheet = _getStyleSheetWhite(context); + switch (style) { + case kDarkLight: + styleSheet = _getStyleSheetDark(context); + break; + case kDarkTheme: + styleSheet = _getStyleSheetTheme(context); + break; + } + return styleSheet; + } + + _getMarkDownData(String markdownData) { + ///优化图片显示 + RegExp exp = new RegExp(r'!\[.*\]\((.+)\)'); + RegExp expImg = new RegExp("|\/>)"); + RegExp expSrc = new RegExp("src=[\'\"]?([^\'\"]*)[\'\"]?"); + + String mdDataCode = markdownData; + try { + Iterable tags = exp.allMatches(markdownData); + if (tags != null && tags.length > 0) { + for (Match m in tags) { + String imageMatch = m.group(0); + if (imageMatch != null && !imageMatch.contains(".svg")) { + String match = imageMatch.replaceAll("\)", "?raw=true)"); + if (!match.contains(".svg") && match.contains("http")) { + ///增加点击 + String src = match + .replaceAll(new RegExp(r'!\[.*\]\('), "") + .replaceAll(")", ""); + String actionMatch = "[$match]($src)"; + match = actionMatch; + } else { + match = ""; + } + mdDataCode = mdDataCode.replaceAll(m.group(0), match); + } + } + } + + ///优化img标签的src资源 + tags = expImg.allMatches(markdownData); + if (tags != null && tags.length > 0) { + for (Match m in tags) { + String imageTag = m.group(0); + String match = imageTag; + if (imageTag != null) { + Iterable srcTags = expSrc.allMatches(imageTag); + for (Match srcMatch in srcTags) { + String srcString = srcMatch.group(0); + if (srcString != null && srcString.contains("http")) { + String newSrc = srcString.substring( + srcString.indexOf("http"), srcString.length - 1) + + "?raw=true"; + match = "[![]($newSrc)]($newSrc)"; + } + } + } + mdDataCode = mdDataCode.replaceAll(imageTag, match); + } + } + } catch (e) { + print(e.toString()); + } + return mdDataCode; + } + + @override + Widget build(BuildContext context) { + return Container( + color: _getBackgroundColor(context), + padding: EdgeInsets.all(5.0), + child: SingleChildScrollView( + child: new MarkdownBody( + styleSheet: _getStyle(context), + syntaxHighlighter: new GSYHighlighter(), + data: _getMarkDownData(markdownData), + onTapLink: (String source) { +// CommonUtils.launchUrl(context, source); + }, + ), + ), + ); + } +} + +class GSYHighlighter extends SyntaxHighlighter { + @override + TextSpan format(String source) { + String showSource = source.replaceAll("<", "<"); + showSource = showSource.replaceAll(">", ">"); + return new DartSyntaxHighlighter().format(showSource); + } +} diff --git a/lib/components/permanent/markdown/syntax_high_lighter.dart b/lib/components/permanent/markdown/syntax_high_lighter.dart new file mode 100644 index 0000000..0f3ad41 --- /dev/null +++ b/lib/components/permanent/markdown/syntax_high_lighter.dart @@ -0,0 +1,408 @@ +import 'package:string_scanner/string_scanner.dart'; +import 'package:flutter/material.dart'; + +class SyntaxHighlighterStyle { + SyntaxHighlighterStyle( + {this.baseStyle, + this.numberStyle, + this.commentStyle, + this.keywordStyle, + this.stringStyle, + this.punctuationStyle, + this.classStyle, + this.constantStyle}); + +//123 + static SyntaxHighlighterStyle defaultStyle() { + return new SyntaxHighlighterStyle( + baseStyle: new TextStyle(color: Color.fromRGBO(212, 212, 212, 1.0)), + numberStyle: new TextStyle(color: Colors.blue[800]), + commentStyle: new TextStyle(color: Color.fromRGBO(124, 126, 120, 1.0)), + keywordStyle: new TextStyle(color: Color.fromRGBO(228, 125, 246, 1.0)), + stringStyle: new TextStyle(color: Color.fromRGBO(150, 190, 118, 1.0)), + punctuationStyle: + new TextStyle(color: Color.fromRGBO(212, 212, 212, 1.0)), + classStyle: new TextStyle(color: Color.fromRGBO(150, 190, 118, 1.0)), + constantStyle: new TextStyle(color: Colors.brown[500])); + } + + final TextStyle baseStyle; + final TextStyle numberStyle; + final TextStyle commentStyle; + final TextStyle keywordStyle; + final TextStyle stringStyle; + final TextStyle punctuationStyle; + final TextStyle classStyle; + final TextStyle constantStyle; +} + +abstract class SyntaxCostomHighlighter { + TextSpan format(String src); +} + +class DartSyntaxHighlighter extends SyntaxCostomHighlighter { + DartSyntaxHighlighter([this._style]) { + _spans = <_HighlightSpan>[]; + + if (_style == null) _style = SyntaxHighlighterStyle.defaultStyle(); + } + + SyntaxHighlighterStyle _style; + + static const List _kKeywords = const [ + 'abstract', + 'as', + 'assert', + 'async', + 'await', + 'break', + 'case', + 'catch', + 'class', + 'const', + 'continue', + 'default', + 'deferred', + 'do', + 'dynamic', + 'else', + 'enum', + 'export', + 'external', + 'extends', + 'factory', + 'false', + 'final', + 'finally', + 'for', + 'get', + 'if', + 'implements', + 'import', + 'in', + 'is', + 'library', + 'new', + 'null', + 'operator', + 'part', + 'rethrow', + 'return', + 'set', + 'static', + 'super', + 'switch', + 'sync', + 'this', + 'throw', + 'true', + 'try', + 'typedef', + 'var', + 'void', + 'while', + 'with', + 'yield', + 'print', + 'function', + 'public', + 'protected', + 'private', + 'namespace', + 'using', + 'extends', + 'let', + 'export', + 'default', + 'import', + 'from', + 'PureCommponent', + 'constructor', + 'render', + '\$sudo', + 'console', + 'instanceof' + ]; + + static const List _kBuiltInTypes = const [ + 'int', + 'double', + 'num', + 'bool' + ]; + + String _src; + StringScanner _scanner; + + List<_HighlightSpan> _spans; + + TextSpan format(String src) { + _src = src; + _scanner = new StringScanner(_src); + + if (_generateSpans()) { + // Successfully parsed the code + List formattedText = []; + int currentPosition = 0; + + for (_HighlightSpan span in _spans) { + if (currentPosition != span.start) + formattedText.add( + new TextSpan(text: _src.substring(currentPosition, span.start))); + + formattedText.add(new TextSpan( + style: span.textStyle(_style), text: span.textForSpan(_src))); + + currentPosition = span.end; + } + + if (currentPosition != _src.length) + formattedText.add( + new TextSpan(text: _src.substring(currentPosition, _src.length))); + + return new TextSpan(style: _style.baseStyle, children: formattedText); + } else { + // Parsing failed, return with only basic formatting + return new TextSpan(style: _style.baseStyle, text: src); + } + } + + bool _generateSpans() { + int lastLoopPosition = _scanner.position; + + try { + while (!_scanner.isDone) { + // Skip White space + _scanner.scan(new RegExp(r"\s+")); + + // Block comments + if (_scanner.scan(new RegExp(r"/\*(.|\n)*\*/"))) { + _spans.add(new _HighlightSpan(_HighlightType.comment, + _scanner.lastMatch.start, _scanner.lastMatch.end)); + continue; + } + + // Line comments + if (_scanner.scan("//")) { + int startComment = _scanner.lastMatch.start; + + bool eof = false; + int endComment; + if (_scanner.scan(new RegExp(r".*\n"))) { + endComment = _scanner.lastMatch.end - 1; + } else { + eof = true; + endComment = _src.length; + } + + _spans.add(new _HighlightSpan( + _HighlightType.comment, startComment, endComment)); + + if (eof) break; + + continue; + } + + if (_scanner.scan("#")) { + int startComment = _scanner.lastMatch.start; + + bool eof = false; + int endComment; + + if (_scanner.scan(new RegExp(r".*\n"))) { + endComment = _scanner.lastMatch.end - 1; + } else { + eof = true; + endComment = _src.length; + } + + _spans.add(new _HighlightSpan( + _HighlightType.comment, startComment, endComment)); + + if (eof) break; + + continue; + } + // Raw r"String" + if (_scanner.scan(new RegExp(r'r".*"'))) { + _spans.add(new _HighlightSpan(_HighlightType.string, + _scanner.lastMatch.start, _scanner.lastMatch.end)); + continue; + } + + // Raw r'String' + if (_scanner.scan(new RegExp(r"r'.*'"))) { + _spans.add(new _HighlightSpan(_HighlightType.string, + _scanner.lastMatch.start, _scanner.lastMatch.end)); + continue; + } + + // Multiline """String""" + if (_scanner.scan(new RegExp(r'"""(?:[^"\\]|\\(.|\n))*"""'))) { + _spans.add(new _HighlightSpan(_HighlightType.string, + _scanner.lastMatch.start, _scanner.lastMatch.end)); + continue; + } + + // Multiline '''String''' + if (_scanner.scan(new RegExp(r"'''(?:[^'\\]|\\(.|\n))*'''"))) { + _spans.add(new _HighlightSpan(_HighlightType.string, + _scanner.lastMatch.start, _scanner.lastMatch.end)); + continue; + } + + // "String" + if (_scanner.scan(new RegExp(r'"(?:[^"\\]|\\.)*"'))) { + _spans.add(new _HighlightSpan(_HighlightType.string, + _scanner.lastMatch.start, _scanner.lastMatch.end)); + continue; + } + + // 'String' + if (_scanner.scan(new RegExp(r"'(?:[^'\\]|\\.)*'"))) { + _spans.add(new _HighlightSpan(_HighlightType.string, + _scanner.lastMatch.start, _scanner.lastMatch.end)); + continue; + } + + // Double + if (_scanner.scan(new RegExp(r"\d+\.\d+"))) { + _spans.add(new _HighlightSpan(_HighlightType.number, + _scanner.lastMatch.start, _scanner.lastMatch.end)); + continue; + } + + // Integer + if (_scanner.scan(new RegExp(r"\d+"))) { + _spans.add(new _HighlightSpan(_HighlightType.number, + _scanner.lastMatch.start, _scanner.lastMatch.end)); + continue; + } + + // Punctuation + if (_scanner.scan(new RegExp(r"[\[\]{}().!=<>&\|\?\+\-\*/%\^~;:,]"))) { + _spans.add(new _HighlightSpan(_HighlightType.punctuation, + _scanner.lastMatch.start, _scanner.lastMatch.end)); + continue; + } + + //中文 + if (_scanner.scan(new RegExp(r"[\u4e00-\u9fa5]"))) { + _spans.add(new _HighlightSpan(_HighlightType.punctuation, + _scanner.lastMatch.start, _scanner.lastMatch.end)); + continue; + } + + // Metadata + if (_scanner.scan(new RegExp(r"@\w+"))) { + _spans.add(new _HighlightSpan(_HighlightType.keyword, + _scanner.lastMatch.start, _scanner.lastMatch.end)); + continue; + } + + // Words + if (_scanner.scan(new RegExp(r"\w+"))) { + _HighlightType type; + + String word = _scanner.lastMatch[0]; + if (word.startsWith("_")) word = word.substring(1); + + if (_kKeywords.contains(word)) + type = _HighlightType.keyword; + else if (_kBuiltInTypes.contains(word)) + type = _HighlightType.keyword; + else if (_firstLetterIsUpperCase(word)) + type = _HighlightType.klass; + else if (word.length >= 2 && + word.startsWith("k") && + _firstLetterIsUpperCase(word.substring(1))) + type = _HighlightType.constant; + + if (type != null) { + _spans.add(new _HighlightSpan( + type, _scanner.lastMatch.start, _scanner.lastMatch.end)); + } + } + + // Check if this loop did anything + if (lastLoopPosition == _scanner.position) { + // Failed to parse this file, abort gracefully + if (_spans.length > 0) { + _spans.add(new _HighlightSpan(_HighlightType.punctuation, + lastLoopPosition, _scanner.string.length - 1)); + _simplify(); + return true; + } + return false; + } + + lastLoopPosition = _scanner.position; + } + } catch (e) { + print(e.toString()); + } + + _simplify(); + return true; + } + + void _simplify() { + for (int i = _spans.length - 2; i >= 0; i -= 1) { + if (_spans[i].type == _spans[i + 1].type && + _spans[i].end == _spans[i + 1].start) { + _spans[i] = new _HighlightSpan( + _spans[i].type, _spans[i].start, _spans[i + 1].end); + _spans.removeAt(i + 1); + } + } + } + + bool _firstLetterIsUpperCase(String str) { + if (str.length > 0) { + String first = str.substring(0, 1); + return first == first.toUpperCase(); + } + return false; + } +} + +enum _HighlightType { + number, + comment, + keyword, + string, + punctuation, + klass, + constant +} + +class _HighlightSpan { + _HighlightSpan(this.type, this.start, this.end); + + final _HighlightType type; + final int start; + final int end; + + String textForSpan(String src) { + return src.substring(start, end); + } + + TextStyle textStyle(SyntaxHighlighterStyle style) { + if (type == _HighlightType.number) + return style.numberStyle; + else if (type == _HighlightType.comment) + return style.commentStyle; + else if (type == _HighlightType.keyword) + return style.keywordStyle; + else if (type == _HighlightType.string) + return style.stringStyle; + else if (type == _HighlightType.punctuation) + return style.punctuationStyle; + else if (type == _HighlightType.klass) + return style.classStyle; + else if (type == _HighlightType.constant) + return style.constantStyle; + else + return style.baseStyle; + } +} diff --git a/lib/components/project/widget_node_panel.dart b/lib/components/project/widget_node_panel.dart index e27af74..62b2bc0 100644 --- a/lib/components/project/widget_node_panel.dart +++ b/lib/components/project/widget_node_panel.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:flutter_unit/app/style/TolyIcon.dart'; +import 'package:flutter_unit/app/res/toly_icon.dart'; import 'package:flutter_unit/components/permanent/circle.dart'; import 'package:flutter_unit/components/permanent/code/code_widget.dart'; diff --git a/lib/model/github/IssueComment.dart b/lib/model/github/IssueComment.dart new file mode 100644 index 0000000..3d0849c --- /dev/null +++ b/lib/model/github/IssueComment.dart @@ -0,0 +1,36 @@ +import 'package:flutter_unit/model/github/github_user.dart'; + +part 'g/IssueComment.g.dart'; + + +class IssueComment{ + int id; + GithubUser user; + + DateTime createdAt; + + DateTime updatedAt; + + String authorAssociation; + String body; + + String bodyHtml; + String type; + String htmlUrl; + + IssueComment( + this.id, + this.user, + this.createdAt, + this.updatedAt, + this.authorAssociation, + this.body, + this.bodyHtml, + this.type, + this.htmlUrl, + ); + + factory IssueComment.fromJson(Map json) => _$IssueEventFromJson(json); + + Map toJson() => _$IssueEventToJson(this); +} diff --git a/lib/model/github/g/IssueComment.g.dart b/lib/model/github/g/IssueComment.g.dart new file mode 100644 index 0000000..5b505c9 --- /dev/null +++ b/lib/model/github/g/IssueComment.g.dart @@ -0,0 +1,40 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of '../IssueComment.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +IssueComment _$IssueEventFromJson(Map json) { + return IssueComment( + json['id'] as int, + json['user'] == null + ? null + : GithubUser.fromJson(json['user'] as Map), + json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + json['updated_at'] == null + ? null + : DateTime.parse(json['updated_at'] as String), + json['author_association'] as String, + json['body'] as String, + json['body_html'] as String, + json['event'] as String, + json['html_url'] as String, + ); +} + +Map _$IssueEventToJson(IssueComment instance) => + { + 'id': instance.id, + 'user': instance.user, + 'created_at': instance.createdAt?.toIso8601String(), + 'updated_at': instance.updatedAt?.toIso8601String(), + 'author_association': instance.authorAssociation, + 'body': instance.body, + 'body_html': instance.bodyHtml, + 'event': instance.type, + 'html_url': instance.htmlUrl, + }; diff --git a/lib/views/app/bloc_wrapper.dart b/lib/views/app/bloc_wrapper.dart index 7ecb725..a397143 100644 --- a/lib/views/app/bloc_wrapper.dart +++ b/lib/views/app/bloc_wrapper.dart @@ -2,6 +2,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_unit/app/enums.dart'; import 'package:flutter_unit/blocs/bloc_exp.dart'; +import 'package:flutter_unit/blocs/point/point_bloc.dart'; +import 'package:flutter_unit/blocs/point_comment/point_comment_bloc.dart'; import 'package:flutter_unit/repositories/impl/catagory_db_repository.dart'; import 'package:flutter_unit/repositories/impl/widget_db_repository.dart'; import 'package:flutter_unit/storage/app_storage.dart'; @@ -29,9 +31,11 @@ class BlocWrapper extends StatelessWidget { create: (_) => GlobalBloc(storage)..add(EventInitApp())), BlocProvider( - create: (_) => HomeBloc(repository: repository)..add(EventTabTap(WidgetFamily.statelessWidget))), + create: (_) => HomeBloc(repository: repository) + ..add(EventTabTap(WidgetFamily.statelessWidget))), - BlocProvider(create: (_) => DetailBloc(repository: repository)), + BlocProvider( + create: (_) => DetailBloc(repository: repository)), BlocProvider( create: (_) => @@ -43,6 +47,8 @@ class BlocWrapper extends StatelessWidget { BlocProvider( create: (_) => SearchBloc(repository: repository)), + BlocProvider(create: (_) => PointBloc()), + BlocProvider(create: (_) => PointCommentBloc()), ], child: child); } } diff --git a/lib/views/items/collect_widget_list_item.dart b/lib/views/items/collect_widget_list_item.dart index 53518f7..07810e1 100644 --- a/lib/views/items/collect_widget_list_item.dart +++ b/lib/views/items/collect_widget_list_item.dart @@ -2,7 +2,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_star/flutter_star.dart'; import 'package:flutter_unit/app/res/cons.dart'; -import 'package:flutter_unit/app/style/shape/techno_shape.dart'; +import 'package:flutter_unit/app/res/style/shape/techno_shape.dart'; import 'package:flutter_unit/components/permanent/circle_image.dart'; import 'package:flutter_unit/components/permanent/circle_text.dart'; import 'package:flutter_unit/components/permanent/feedback_widget.dart'; diff --git a/lib/views/items/coupon_widget_list_item.dart b/lib/views/items/coupon_widget_list_item.dart index 44b174b..6eb07aa 100644 --- a/lib/views/items/coupon_widget_list_item.dart +++ b/lib/views/items/coupon_widget_list_item.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_star/flutter_star.dart'; import 'package:flutter_unit/app/res/cons.dart'; -import 'package:flutter_unit/app/style/shape/coupon_shape_border.dart'; +import 'package:flutter_unit/app/res/style/shape/coupon_shape_border.dart'; import 'package:flutter_unit/blocs/collect/collect_bloc.dart'; import 'package:flutter_unit/blocs/collect/collect_state.dart'; import 'package:flutter_unit/components/permanent/circle_image.dart'; diff --git a/lib/views/items/techno_widget_list_item.dart b/lib/views/items/techno_widget_list_item.dart index 3d77090..f183eb9 100644 --- a/lib/views/items/techno_widget_list_item.dart +++ b/lib/views/items/techno_widget_list_item.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_star/flutter_star.dart'; import 'package:flutter_unit/app/res/cons.dart'; -import 'package:flutter_unit/app/style/shape/techno_shape.dart'; +import 'package:flutter_unit/app/res/style/shape/techno_shape.dart'; import 'package:flutter_unit/blocs/collect/collect_bloc.dart'; import 'package:flutter_unit/blocs/collect/collect_state.dart'; import 'package:flutter_unit/components/permanent/circle_image.dart'; diff --git a/lib/views/pages/about/about_app_page.dart b/lib/views/pages/about/about_app_page.dart index 82e09aa..594f35e 100644 --- a/lib/views/pages/about/about_app_page.dart +++ b/lib/views/pages/about/about_app_page.dart @@ -4,7 +4,7 @@ import 'package:flutter/cupertino.dart'; /// 说明: import 'package:flutter/material.dart'; -import 'package:flutter_unit/app/style/TolyIcon.dart'; +import 'package:flutter_unit/app/res/toly_icon.dart'; import 'package:flutter_unit/components/permanent/circle.dart'; import 'package:flutter_unit/components/permanent/circle_image.dart'; import 'package:flutter_unit/components/permanent/feedback_widget.dart'; diff --git a/lib/views/pages/about/about_me_page.dart b/lib/views/pages/about/about_me_page.dart index efbbcee..c0aa8fb 100644 --- a/lib/views/pages/about/about_me_page.dart +++ b/lib/views/pages/about/about_me_page.dart @@ -3,7 +3,7 @@ /// 说明: import 'package:flutter/material.dart'; -import 'package:flutter_unit/app/style/TolyIcon.dart'; +import 'package:flutter_unit/app/res/toly_icon.dart'; import 'package:flutter_unit/components/permanent/circle_image.dart'; import 'package:flutter_unit/components/permanent/feedback_widget.dart'; import 'package:url_launcher/url_launcher.dart'; diff --git a/lib/views/pages/about/version_info.dart b/lib/views/pages/about/version_info.dart index dd26085..2629e6a 100644 --- a/lib/views/pages/about/version_info.dart +++ b/lib/views/pages/about/version_info.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_unit/app/res/cons.dart'; import 'package:flutter_unit/app/router.dart'; -import 'package:flutter_unit/app/style/NoScrollBehavior.dart'; +import 'package:flutter_unit/app/res/style/behavior/no_scroll_behavior.dart'; import 'package:flutter_unit/components/permanent/circle_image.dart'; import 'package:flutter_unit/components/permanent/feedback_widget.dart'; import 'package:url_launcher/url_launcher.dart'; diff --git a/lib/views/pages/category/edit_category_panel.dart b/lib/views/pages/category/edit_category_panel.dart index 35812d3..28d7192 100644 --- a/lib/views/pages/category/edit_category_panel.dart +++ b/lib/views/pages/category/edit_category_panel.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/app/style/unit_color.dart'; +import 'package:flutter_unit/app/res/style/unit_color.dart'; import 'package:flutter_unit/app/utils/color_utils.dart'; import 'package:flutter_unit/blocs/category/category_bloc.dart'; import 'package:flutter_unit/blocs/category/category_event.dart'; diff --git a/lib/views/pages/detail/widget_detail_page.dart b/lib/views/pages/detail/widget_detail_page.dart index b2c2fdc..e074ee3 100644 --- a/lib/views/pages/detail/widget_detail_page.dart +++ b/lib/views/pages/detail/widget_detail_page.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_star/flutter_star.dart'; import 'package:flutter_unit/app/res/cons.dart'; -import 'package:flutter_unit/app/style/TolyIcon.dart'; +import 'package:flutter_unit/app/res/toly_icon.dart'; import 'package:flutter_unit/app/utils/Toast.dart'; import 'package:flutter_unit/blocs/bloc_exp.dart'; import 'package:flutter_unit/components/permanent/feedback_widget.dart'; diff --git a/lib/views/pages/home/home_drawer.dart b/lib/views/pages/home/home_drawer.dart index 605a4a1..44fec7e 100644 --- a/lib/views/pages/home/home_drawer.dart +++ b/lib/views/pages/home/home_drawer.dart @@ -1,6 +1,9 @@ import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_unit/app/router.dart'; -import 'package:flutter_unit/app/style/TolyIcon.dart'; +import 'package:flutter_unit/app/res/toly_icon.dart'; +import 'package:flutter_unit/blocs/point/point_bloc.dart'; +import 'package:flutter_unit/blocs/point/point_event.dart'; import 'package:flutter_unit/components/flutter/no_div_expansion_tile.dart'; import 'package:flutter_unit/views/common/unit_drawer_header.dart'; @@ -50,12 +53,14 @@ class HomeDrawer extends StatelessWidget { _buildItem(context, TolyIcon.icon_tag, '属性集录', UnitRouter.attr), _buildItem(context, Icons.palette, '绘画集录', UnitRouter.paint), _buildItem(context, Icons.widgets, '布局集录', UnitRouter.layout), - _buildItem(context, TolyIcon.icon_bug, '要点集录', UnitRouter.bug), + _buildItem(context, TolyIcon.icon_bug, '要点集录', UnitRouter.issues_point,onTap: (){ + BlocProvider.of(context).add(EventLoadPoint()); + }), ], ); Widget _buildItem( - BuildContext context, IconData icon, String title, String linkTo) => + BuildContext context, IconData icon, String title, String linkTo,{VoidCallback onTap}) => ListTile( leading: Icon( icon, @@ -67,6 +72,7 @@ class HomeDrawer extends StatelessWidget { onTap: () { if (linkTo != null && linkTo.isNotEmpty) { Navigator.of(context).pushNamed(linkTo); + if(onTap!=null) onTap(); } }, ); diff --git a/lib/views/pages/issues/issue_item.dart b/lib/views/pages/issues/issue_item.dart new file mode 100644 index 0000000..f482b36 --- /dev/null +++ b/lib/views/pages/issues/issue_item.dart @@ -0,0 +1,92 @@ +import 'dart:ui'; + +import 'package:flutter/material.dart'; +import 'package:flutter_unit/app/res/toly_icon.dart'; +import 'package:flutter_unit/app/utils/convert_man.dart'; +import 'package:flutter_unit/components/permanent/circle_image.dart'; +import 'package:flutter_unit/components/permanent/color_wrapper.dart'; +import 'package:flutter_unit/model/github/issue.dart'; + +/// create by 张风捷特烈 on 2020/9/3 +/// contact me by email 1981462002@qq.com +/// 说明: + +class IssueItem extends StatelessWidget { + final Issue issue; + + IssueItem({this.issue}); + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.symmetric(horizontal: 10, vertical: 5), + decoration: BoxDecoration( + border: Border( + bottom: BorderSide( + color: Theme.of(context).dividerColor, + width: 1 / window.devicePixelRatio))), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildTop(), + Padding( + padding: const EdgeInsets.only(top: 5.0, bottom: 5.0, left: 10), + child: Text( + issue.title, + style: TextStyle(fontSize: 15, color: Colors.grey, shadows: [ + Shadow(color: Colors.white, offset: Offset(1, .5)) + ]), + ), + ), + Row( + children: [ + Spacer(), + WrapColor( + color: Colors.greenAccent, + child: Text( + issue.commentNum.toString(), + style: TextStyle(color: Colors.white), + )), + SizedBox( + width: 5, + ), + Icon( + TolyIcon.icon_common, + size: 20, + ), + ], + ) + ], + ), + ); + } + + Widget _buildTop() { + return Row( + children: [ + CircleImage( + image: NetworkImage(issue.user.avatar_url), + size: 40, + borderSize: 2, + ), + SizedBox( + width: 10, + ), + WrapColor( + child: Text( + "#${issue.number}", + style: TextStyle(color: Colors.white), + )), + SizedBox( + width: 10, + ), + Text( + issue.user.login, + style: TextStyle(fontWeight: FontWeight.bold), + ), + Spacer(), + Text(ConvertMan.time2string(issue.createdAt)), + ], + ); + } +} \ No newline at end of file diff --git a/lib/views/pages/issues/issues_detail.dart b/lib/views/pages/issues/issues_detail.dart new file mode 100644 index 0000000..a8ddec2 --- /dev/null +++ b/lib/views/pages/issues/issues_detail.dart @@ -0,0 +1,155 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_unit/app/utils/convert_man.dart'; +import 'package:flutter_unit/blocs/point_comment/point_comment_bloc.dart'; +import 'package:flutter_unit/blocs/point_comment/point_comment_state.dart'; +import 'package:flutter_unit/components/permanent/circle_image.dart'; +import 'package:flutter_unit/components/permanent/color_wrapper.dart'; +import 'package:flutter_unit/components/permanent/markdown/markdown_widget.dart'; +import 'package:flutter_unit/components/permanent/panel.dart'; +import 'package:flutter_unit/model/github/IssueComment.dart'; +import 'package:flutter_unit/model/github/issue.dart'; + +/// create by 张风捷特烈 on 2020/9/3 +/// contact me by email 1981462002@qq.com +/// 说明: + +class IssuesDetailPage extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: Text('Flutter Point'),), + body: BlocBuilder( + builder: _buildContent), + ); + } + + Widget _buildContent(BuildContext context, PointCommentState state) { + if (state is PointCommentLoading) { + return IssueTitle(issue: state.issue); + } + + if (state is PointCommentLoaded) { + return CustomScrollView( + slivers: [ + SliverToBoxAdapter(child: IssueTitle(issue: state.issue)), + SliverList( + delegate: SliverChildBuilderDelegate( + (ctx, int index) => IssueCommentWidget(comment:state.comments[index]), + childCount: state.comments.length)) + ], + ); + } + + return Container(); + } +} + +class IssueTitle extends StatelessWidget { + final Issue issue; + + IssueTitle({Key key, this.issue}) : super(key: key); + + String get issueDesHtml => issue.bodyHtml != null + ? issue.bodyHtml + : (issue.body != null) ? issue.body : ""; + + @override + Widget build(BuildContext context) { + return SingleChildScrollView( + child: Column( + children: [ + Stack( + children: [ + Container( + padding: EdgeInsets.symmetric(horizontal: 8), + child: Panel(child: Text('${issue.title}',style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),)), + ), + Positioned( + right: 10, + bottom: 10, + child: WrapColor( + child: Text('#${issue.number}',style: TextStyle(color: Colors.white),), + )), + ], + ), + Divider(), + + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: WrapColor( + color: Colors.blue.withAlpha(22), + child: ListTile( + dense: true, + leading: CircleImage(size:40,borderSize:1,image: NetworkImage(issue.user.avatar_url),), + title: Text(issue.user.login), + subtitle:Row( + children: [ + Text('创建于:${ConvertMan.time2string(issue.createdAt)}'), + Spacer(), + WrapColor( + color: Colors.green, + child: Text('更新于:${ConvertMan.time2string(issue.updatedAt)}',style: TextStyle(color: Colors.white),)), + + ], + ) , + ), + ), + ), + + Padding( + padding: const EdgeInsets.all(8.0), + child: MarkdownWidget( + markdownData: issueDesHtml, style: MarkdownWidget.kWhite), + ), + Divider(thickness: 2,) + ], + ), + ); + } +} + +class IssueCommentWidget extends StatelessWidget { + final IssueComment comment; + + IssueCommentWidget({Key key, this.comment}) : super(key: key); + + String get issueDesHtml => comment.bodyHtml != null + ? comment.bodyHtml + : (comment.body != null) ? comment.body : ""; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: WrapColor( + color: Colors.blue.withAlpha(22), + child: ListTile( + dense: true, + leading: CircleImage(size:40,borderSize:1,image: NetworkImage(comment.user.avatar_url),), + title: Text(comment.user.login), + subtitle:Row( + children: [ + Text('创建于:${ConvertMan.time2string(comment.createdAt)}'), + Spacer(), + WrapColor( + color: Colors.green, + child: Text('更新于:${ConvertMan.time2string(comment.updatedAt)}',style: TextStyle(color: Colors.white),)), + + ], + ) , + ), + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: MarkdownWidget( + markdownData: issueDesHtml, style: MarkdownWidget.kWhite), + ), + Divider(thickness: 2,) + ], + ); + } +} diff --git a/lib/views/pages/issues/main.dart b/lib/views/pages/issues/main.dart deleted file mode 100644 index 472f2e8..0000000 --- a/lib/views/pages/issues/main.dart +++ /dev/null @@ -1,451 +0,0 @@ -import 'dart:convert'; -import 'dart:ui'; - -import 'package:flutter/cupertino.dart'; - -/// create by 张风捷特烈 on 2020/6/17 -/// contact me by email 1981462002@qq.com -/// 说明: - -import 'package:flutter/material.dart'; -import 'package:flutter_unit/app/api/github/issues_api.dart'; -import 'package:flutter_unit/app/style/TolyIcon.dart'; -import 'package:flutter_unit/app/utils/convert_man.dart'; -import 'package:flutter_unit/app/utils/http/rep_result.dart'; -import 'package:flutter_unit/components/permanent/circle_image.dart'; -import 'package:flutter_unit/model/github/issue.dart'; -import 'package:flutter_unit/model/github/repository.dart'; - -class IssuesPointPage extends StatelessWidget { - @override - Widget build(BuildContext context) { - return Scaffold(body: IssuesPointContent()); - } -} - -class RepoWidget extends StatelessWidget { - final Repository repository; - - RepoWidget({this.repository}); - - @override - Widget build(BuildContext context) { - return Container( - margin: EdgeInsets.only(top: 56 + 24.0, bottom: 5), - padding: EdgeInsets.all(10), - decoration: BoxDecoration( - boxShadow: [ - BoxShadow(color: Colors.grey, offset: Offset(0, .5), blurRadius: 3) - ], - color: Colors.white, - borderRadius: BorderRadius.only( - bottomLeft: Radius.circular(10), - bottomRight: Radius.circular(10), - )), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Row( - children: [ - Text( - repository.fullName, - style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16), - ), - SizedBox(width: 10,), - WrapColor( - child: Text( - repository.license.spdxId, - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.white, - fontSize: 12), - ), - ), - Spacer(), - Text( - "创建:" + - ConvertMan.time2string(repository.createdAt, just: true), - style: TextStyle(color: Colors.grey), - ), - ], - ), - Padding( - padding: const EdgeInsets.symmetric(vertical: 8.0), - child: Text( - repository.description, - style: TextStyle(color: Colors.grey), - ), - ), - Divider(), - Wrap( - children: [], - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Wrap( - alignment: WrapAlignment.center, - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - Icon(Icons.star_border), - Text(repository.stargazersCount.toString()), - ]), - Padding( - padding: const EdgeInsets.symmetric(vertical: 8.0), - child: Text( - "|", - style: TextStyle(fontSize: 20, color: Colors.blue), - ), - ), - Wrap( - alignment: WrapAlignment.center, - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - Icon(TolyIcon.icon_show), - SizedBox( - width: 5, - ), - Text(repository.subscribersCount.toString()), - ]), - Padding( - padding: const EdgeInsets.symmetric(vertical: 8.0), - child: Text( - "|", - style: TextStyle(fontSize: 20, color: Colors.blue), - ), - ), - Wrap( - alignment: WrapAlignment.center, - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - Icon(TolyIcon.icon_fork), - Text(repository.forksCount.toString()), - ]), - Padding( - padding: const EdgeInsets.symmetric(vertical: 8.0), - child: Text( - "|", - style: TextStyle(fontSize: 20, color: Colors.blue), - ), - ), - Wrap( - alignment: WrapAlignment.center, - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - Icon(TolyIcon.icon_issues), - SizedBox( - width: 5, - ), - Text(repository.openIssuesCount.toString()), - ]), - ], - ) - ], - ), - ); - } -} - -class IssuesPointContent extends StatefulWidget { - @override - _IssuesPointContentState createState() => _IssuesPointContentState(); -} - -class _IssuesPointContentState extends State { - List _issues; - - @override - void initState() { - super.initState(); - _loadIssues(); - } - - @override - Widget build(BuildContext context) { - Widget content; - - if (_issues == null) { - content = SliverPadding( - padding: EdgeInsets.only(top: 40), - sliver: SliverToBoxAdapter( - child: Container(), -// child: SpinKitWave( -// color: Colors.blue, -// ) - ), - ); - } else { - content = SliverList( - delegate: SliverChildBuilderDelegate( - (_, int index) => IssueItem(issue: _issues[index]), - childCount: _issues.length), - ); - } - return Container( - child: RefreshIndicator( - onRefresh: _loadIssues, - child: CustomScrollView(slivers: [_buildSliverAppBar(), content] -// ListView.separated( -// shrinkWrap: true, -// separatorBuilder: (ctx, index) => Divider( -// height: 1, -// ), -// itemBuilder: (ctx, index) => IssueItem( -// issue: _issues[index], -// ), -// itemCount: _issues.length, -// ), - ), - ), - ); - } - - Widget _buildSliverAppBar() { - var repos = Repository.empty(); - - var jsonStr = """ - { - "id": 248628088, - "node_id": "MDEwOlJlcG9zaXRvcnkyNDg2MjgwODg=", - "name": "FlutterUnit", - "full_name": "toly1994328/FlutterUnit", - "private": false, - "owner": { - "login": "toly1994328", - "id": 26687012, - "node_id": "MDQ6VXNlcjI2Njg3MDEy", - "avatar_url": "https://avatars3.githubusercontent.com/u/26687012?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/toly1994328", - "html_url": "https://github.com/toly1994328", - "followers_url": "https://api.github.com/users/toly1994328/followers", - "following_url": "https://api.github.com/users/toly1994328/following{/other_user}", - "gists_url": "https://api.github.com/users/toly1994328/gists{/gist_id}", - "starred_url": "https://api.github.com/users/toly1994328/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/toly1994328/subscriptions", - "organizations_url": "https://api.github.com/users/toly1994328/orgs", - "repos_url": "https://api.github.com/users/toly1994328/repos", - "events_url": "https://api.github.com/users/toly1994328/events{/privacy}", - "received_events_url": "https://api.github.com/users/toly1994328/received_events", - "type": "User", - "site_admin": false - }, - "html_url": "https://github.com/toly1994328/FlutterUnit", - "description": "【Flutter 集录指南 App】The unity of flutter, The unity of coder.", - "fork": false, - "url": "https://api.github.com/repos/toly1994328/FlutterUnit", - "forks_url": "https://api.github.com/repos/toly1994328/FlutterUnit/forks", - "keys_url": "https://api.github.com/repos/toly1994328/FlutterUnit/keys{/key_id}", - "collaborators_url": "https://api.github.com/repos/toly1994328/FlutterUnit/collaborators{/collaborator}", - "teams_url": "https://api.github.com/repos/toly1994328/FlutterUnit/teams", - "hooks_url": "https://api.github.com/repos/toly1994328/FlutterUnit/hooks", - "issue_events_url": "https://api.github.com/repos/toly1994328/FlutterUnit/issues/events{/number}", - "events_url": "https://api.github.com/repos/toly1994328/FlutterUnit/events", - "assignees_url": "https://api.github.com/repos/toly1994328/FlutterUnit/assignees{/user}", - "branches_url": "https://api.github.com/repos/toly1994328/FlutterUnit/branches{/branch}", - "tags_url": "https://api.github.com/repos/toly1994328/FlutterUnit/tags", - "blobs_url": "https://api.github.com/repos/toly1994328/FlutterUnit/git/blobs{/sha}", - "git_tags_url": "https://api.github.com/repos/toly1994328/FlutterUnit/git/tags{/sha}", - "git_refs_url": "https://api.github.com/repos/toly1994328/FlutterUnit/git/refs{/sha}", - "trees_url": "https://api.github.com/repos/toly1994328/FlutterUnit/git/trees{/sha}", - "statuses_url": "https://api.github.com/repos/toly1994328/FlutterUnit/statuses/{sha}", - "languages_url": "https://api.github.com/repos/toly1994328/FlutterUnit/languages", - "stargazers_url": "https://api.github.com/repos/toly1994328/FlutterUnit/stargazers", - "contributors_url": "https://api.github.com/repos/toly1994328/FlutterUnit/contributors", - "subscribers_url": "https://api.github.com/repos/toly1994328/FlutterUnit/subscribers", - "subscription_url": "https://api.github.com/repos/toly1994328/FlutterUnit/subscription", - "commits_url": "https://api.github.com/repos/toly1994328/FlutterUnit/commits{/sha}", - "git_commits_url": "https://api.github.com/repos/toly1994328/FlutterUnit/git/commits{/sha}", - "comments_url": "https://api.github.com/repos/toly1994328/FlutterUnit/comments{/number}", - "issue_comment_url": "https://api.github.com/repos/toly1994328/FlutterUnit/issues/comments{/number}", - "contents_url": "https://api.github.com/repos/toly1994328/FlutterUnit/contents/{+path}", - "compare_url": "https://api.github.com/repos/toly1994328/FlutterUnit/compare/{base}...{head}", - "merges_url": "https://api.github.com/repos/toly1994328/FlutterUnit/merges", - "archive_url": "https://api.github.com/repos/toly1994328/FlutterUnit/{archive_format}{/ref}", - "downloads_url": "https://api.github.com/repos/toly1994328/FlutterUnit/downloads", - "issues_url": "https://api.github.com/repos/toly1994328/FlutterUnit/issues{/number}", - "pulls_url": "https://api.github.com/repos/toly1994328/FlutterUnit/pulls{/number}", - "milestones_url": "https://api.github.com/repos/toly1994328/FlutterUnit/milestones{/number}", - "notifications_url": "https://api.github.com/repos/toly1994328/FlutterUnit/notifications{?since,all,participating}", - "labels_url": "https://api.github.com/repos/toly1994328/FlutterUnit/labels{/name}", - "releases_url": "https://api.github.com/repos/toly1994328/FlutterUnit/releases{/id}", - "deployments_url": "https://api.github.com/repos/toly1994328/FlutterUnit/deployments", - "created_at": "2020-03-19T23:47:07Z", - "updated_at": "2020-06-16T19:39:41Z", - "pushed_at": "2020-06-16T05:15:27Z", - "git_url": "git://github.com/toly1994328/FlutterUnit.git", - "ssh_url": "git@github.com:toly1994328/FlutterUnit.git", - "clone_url": "https://github.com/toly1994328/FlutterUnit.git", - "svn_url": "https://github.com/toly1994328/FlutterUnit", - "homepage": "", - "size": 34927, - "stargazers_count": 1690, - "watchers_count": 1690, - "language": "Dart", - "has_issues": true, - "has_projects": true, - "has_downloads": true, - "has_wiki": true, - "has_pages": false, - "forks_count": 225, - "mirror_url": null, - "archived": false, - "disabled": false, - "open_issues_count": 26, - "license": { - "key": "mit", - "name": "MIT License", - "spdx_id": "MIT", - "url": "https://api.github.com/licenses/mit", - "node_id": "MDc6TGljZW5zZTEz" - }, - "forks": 225, - "open_issues": 26, - "watchers": 1690, - "default_branch": "master", - "temp_clone_token": null, - "network_count": 225, - "subscribers_count": 41 -} - """; - - repos.stargazersCount = 1000; - return SliverAppBar( - expandedHeight: 210.0, -// leading: _buildLeading(), - title: Text('Flutter要点集录'), -// actions: _buildActions(), - elevation: 5, - pinned: true, - backgroundColor: Colors.blue, - flexibleSpace: FlexibleSpaceBar( - //伸展处布局 - titlePadding: EdgeInsets.only(left: 55, bottom: 15), //标题边距 - collapseMode: CollapseMode.parallax, //视差效果 - background: RepoWidget( - repository: Repository.fromJson(json.decode(jsonStr)), - ), - ), - ); - } - - Future _loadIssues() async { - RepResult result = await IssuesApi.getIssues( - username: "toly1994328", - repository: "FlutterUnit", - labels: "point", - direction: "asc"); - print(result); - setState(() { - if (result != null) { - _issues = result.data; - } - }); - } -} - -class IssueItem extends StatelessWidget { - final Issue issue; - - IssueItem({this.issue}); - - @override - Widget build(BuildContext context) { - return Container( - padding: EdgeInsets.symmetric(horizontal: 10, vertical: 5), - decoration: BoxDecoration( - border: Border( - bottom: BorderSide( - color: Theme.of(context).dividerColor, - width: 1 / window.devicePixelRatio))), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - _buildTop(), - Padding( - padding: const EdgeInsets.only(top: 5.0, bottom: 5.0, left: 10), - child: Text( - issue.title, - style: TextStyle(fontSize: 15, color: Colors.grey, shadows: [ - Shadow(color: Colors.white, offset: Offset(1, .5)) - ]), - ), - ), - Row( - children: [ - Spacer(), - WrapColor( - color: Colors.greenAccent, - child: Text( - issue.commentNum.toString(), - style: TextStyle(color: Colors.white), - )), - SizedBox( - width: 5, - ), - Icon( - TolyIcon.icon_common, - size: 20, - ), - ], - ) - ], - ), - ); - } - - Widget _buildTop() { - return Row( - children: [ - CircleImage( - image: NetworkImage(issue.user.avatar_url), - size: 40, - borderSize: 2, - ), - SizedBox( - width: 10, - ), - WrapColor( - child: Text( - "#${issue.number}", - style: TextStyle(color: Colors.white), - )), - SizedBox( - width: 10, - ), - Text( - issue.user.login, - style: TextStyle(fontWeight: FontWeight.bold), - ), - Spacer(), - Text(ConvertMan.time2string(issue.createdAt)), - ], - ); - } -} - -class WrapColor extends StatelessWidget { - final Widget child; - final Color color; - final double radius; - final EdgeInsetsGeometry padding; - - WrapColor( - {this.child, - this.color = Colors.blue, - this.radius = 5, - this.padding = - const EdgeInsets.only(left: 4, right: 4, top: 0, bottom: 0)}); - - @override - Widget build(BuildContext context) { - return Container( - child: child, - padding: padding, - decoration: BoxDecoration( - color: color, - borderRadius: BorderRadius.all(Radius.circular(radius))), - ); - } -} diff --git a/lib/views/pages/issues/point_page.dart b/lib/views/pages/issues/point_page.dart new file mode 100644 index 0000000..7954832 --- /dev/null +++ b/lib/views/pages/issues/point_page.dart @@ -0,0 +1,156 @@ +import 'dart:convert'; +import 'dart:ui'; + +import 'package:flutter/cupertino.dart'; + +/// create by 张风捷特烈 on 2020/6/17 +/// contact me by email 1981462002@qq.com +/// 说明: + +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_spinkit/flutter_spinkit.dart'; +import 'package:flutter_unit/app/api/github/issues_api.dart'; +import 'package:flutter_unit/app/router.dart'; +import 'package:flutter_unit/app/res/toly_icon.dart'; +import 'package:flutter_unit/app/utils/convert_man.dart'; +import 'package:flutter_unit/blocs/point/point_bloc.dart'; +import 'package:flutter_unit/blocs/point/point_event.dart'; +import 'package:flutter_unit/blocs/point/point_state.dart'; +import 'package:flutter_unit/blocs/point_comment/point_comment_bloc.dart'; +import 'package:flutter_unit/blocs/point_comment/point_comment_event.dart'; +import 'package:flutter_unit/components/permanent/circle_image.dart'; +import 'package:flutter_unit/components/permanent/color_wrapper.dart'; +import 'package:flutter_unit/model/github/issue.dart'; +import 'package:flutter_unit/model/github/repository.dart'; + +import 'issue_item.dart'; +import 'repo_widget.dart'; + +class IssuesPointPage extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold(body: IssuesPointContent()); + } +} + +class IssuesPointContent extends StatefulWidget { + @override + _IssuesPointContentState createState() => _IssuesPointContentState(); +} + +class _IssuesPointContentState extends State { + Repository _repository; + + @override + void initState() { + super.initState(); + _loadRepo(); + } + + + @override + Widget build(BuildContext context) { + return BlocBuilder( + builder: (_, state) => Container( + child: RefreshIndicator( + onRefresh: _loadIssues, + child: CustomScrollView(slivers: [ + _buildSliverAppBar(), + buildContentByState(state) + ]), + ), + )); + } + + Widget buildContentByState(PointState state) { + if (state is PointLoading) { + return SliverPadding( + padding: EdgeInsets.only(top: 150), + sliver: SliverToBoxAdapter( + child: Center( + child: SpinKitCircle( + color: Colors.blue, + ), + )), + ); + } + + if (state is PointLoaded) { + var issues = state.issues; + return SliverList( + delegate: SliverChildBuilderDelegate( + (ctx, int index) => GestureDetector( + onTap: (){ + BlocProvider.of(ctx).add(EventLoadPointComment(issues[index])); + Navigator.pushNamed(ctx, UnitRouter.point_detail); + }, + child: IssueItem(issue: issues[index])), + childCount: issues.length)); + } + + if (state is PointLoadFailure) { + return SliverPadding( + padding: EdgeInsets.only(top: 40), + sliver: SliverToBoxAdapter( + child: Center( + child: Text(state.error), + )), + ); + } + + return SliverPadding( + padding: EdgeInsets.zero, + ); + } + + Widget _buildSliverAppBar() { + return SliverAppBar( + expandedHeight: 210.0, +// leading: _buildLeading(), + title: Text('Flutter要点集录'), +// actions: _buildActions(), + elevation: 5, + pinned: true, + actions: [ + IconButton( + icon: Icon( + Icons.help_outline, + color: Colors.white, + ), + onPressed: () { + Navigator.of(context).pushNamed(UnitRouter.bug); + }) + ], + backgroundColor: Colors.blue, + flexibleSpace: FlexibleSpaceBar( + //伸展处布局 + titlePadding: EdgeInsets.only(left: 55, bottom: 15), //标题边距 + collapseMode: CollapseMode.parallax, //视差效果 + background: _repository == null + ? Center( + child: SpinKitFadingCube( + color: Colors.white, + ), + ) + : RepoWidget( + repository: _repository, + ), + ), + ); + } + + Future _loadIssues() async { + BlocProvider.of(context).add(EventLoadPoint()); + await Future.delayed(Duration(milliseconds: 200)); + } + + void _loadRepo() async { + var result = await IssuesApi.getRepoFlutterUnit(); + setState(() { + if (result != null) { + _repository = result; + } + }); + } +} diff --git a/lib/views/pages/issues/repo_widget.dart b/lib/views/pages/issues/repo_widget.dart new file mode 100644 index 0000000..e561788 --- /dev/null +++ b/lib/views/pages/issues/repo_widget.dart @@ -0,0 +1,134 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_unit/app/res/toly_icon.dart'; +import 'package:flutter_unit/app/utils/convert_man.dart'; +import 'package:flutter_unit/components/permanent/color_wrapper.dart'; +import 'package:flutter_unit/model/github/repository.dart'; + +/// create by 张风捷特烈 on 2020/9/3 +/// contact me by email 1981462002@qq.com +/// 说明: + + +class RepoWidget extends StatelessWidget { + final Repository repository; + + RepoWidget({this.repository}); + + @override + Widget build(BuildContext context) { + return Container( + margin: EdgeInsets.only(top: 56 + 24.0, bottom: 5), + padding: EdgeInsets.all(10), + decoration: BoxDecoration( + boxShadow: [ + BoxShadow(color: Colors.grey, offset: Offset(0, .5), blurRadius: 3) + ], + color: Colors.white, + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(10), + bottomRight: Radius.circular(10), + )), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + children: [ + Text( + repository.fullName, + style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16), + ), + SizedBox(width: 10,), + WrapColor( + child: Text( + repository.license.spdxId, + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.white, + fontSize: 12), + ), + ), + Spacer(), + Text( + "创建:" + + ConvertMan.time2string(repository.createdAt, just: true), + style: TextStyle(color: Colors.grey), + ), + ], + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: Text( + repository.description, + style: TextStyle(color: Colors.grey), + ), + ), + Divider(), + Wrap( + children: [], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Wrap( + alignment: WrapAlignment.center, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Icon(Icons.star_border), + Text(repository.stargazersCount.toString()), + ]), + Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: Text( + "|", + style: TextStyle(fontSize: 20, color: Colors.blue), + ), + ), + Wrap( + alignment: WrapAlignment.center, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Icon(TolyIcon.icon_show), + SizedBox( + width: 5, + ), + Text(repository.subscribersCount.toString()), + ]), + Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: Text( + "|", + style: TextStyle(fontSize: 20, color: Colors.blue), + ), + ), + Wrap( + alignment: WrapAlignment.center, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Icon(TolyIcon.icon_fork), + Text(repository.forksCount.toString()), + ]), + Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: Text( + "|", + style: TextStyle(fontSize: 20, color: Colors.blue), + ), + ), + Wrap( + alignment: WrapAlignment.center, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Icon(TolyIcon.icon_issues), + SizedBox( + width: 5, + ), + Text(repository.openIssuesCount.toString()), + ]), + ], + ) + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/views/pages/login/login_form.dart b/lib/views/pages/login/login_form.dart index 05015a8..b9eb0b8 100644 --- a/lib/views/pages/login/login_form.dart +++ b/lib/views/pages/login/login_form.dart @@ -1,7 +1,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_unit/app/style/TolyIcon.dart'; +import 'package:flutter_unit/app/res/toly_icon.dart'; import 'package:flutter_unit/components/permanent/feedback_widget.dart'; diff --git a/lib/views/pages/login/login_page.dart b/lib/views/pages/login/login_page.dart index 70f9f2d..ecba003 100644 --- a/lib/views/pages/login/login_page.dart +++ b/lib/views/pages/login/login_page.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/app/style/TolyIcon.dart'; +import 'package:flutter_unit/app/res/toly_icon.dart'; //import 'package:santclient/app/global/SantIcon.dart'; //import 'package:santclient/app/router/router.dart'; //import 'package:santclient/bloc/authentic/bloc.dart'; diff --git a/lib/views/pages/search/serach_page.dart b/lib/views/pages/search/serach_page.dart index 8e66a09..709e310 100644 --- a/lib/views/pages/search/serach_page.dart +++ b/lib/views/pages/search/serach_page.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_unit/app/router.dart'; -import 'package:flutter_unit/app/style/TolyIcon.dart'; +import 'package:flutter_unit/app/res/toly_icon.dart'; import 'package:flutter_unit/blocs/collect/collect_bloc.dart'; import 'package:flutter_unit/blocs/collect/collect_event.dart'; import 'package:flutter_unit/blocs/detail/detail_bloc.dart'; diff --git a/lib/views/pages/setting/setting_page.dart b/lib/views/pages/setting/setting_page.dart index 703b4db..987b48a 100644 --- a/lib/views/pages/setting/setting_page.dart +++ b/lib/views/pages/setting/setting_page.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_unit/app/res/cons.dart'; import 'package:flutter_unit/app/router.dart'; -import 'package:flutter_unit/app/style/TolyIcon.dart'; +import 'package:flutter_unit/app/res/toly_icon.dart'; import 'package:flutter_unit/blocs/global/global_bloc.dart'; import 'package:flutter_unit/blocs/global/global_event.dart'; import 'package:flutter_unit/blocs/global/global_state.dart'; diff --git a/lib/views/widgets/StatelessWidget/Icon/node2_diy.dart b/lib/views/widgets/StatelessWidget/Icon/node2_diy.dart index 8651fea..cd0cb24 100644 --- a/lib/views/widgets/StatelessWidget/Icon/node2_diy.dart +++ b/lib/views/widgets/StatelessWidget/Icon/node2_diy.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import '../../../../app/style/TolyIcon.dart'; +import '../../../../app/res/toly_icon.dart'; /// create by 张风捷特烈 on 2020/4/27 /// contact me by email 1981462002@qq.com diff --git a/linux/flutter/ephemeral/.plugin_symlinks/path_provider_linux b/linux/flutter/ephemeral/.plugin_symlinks/path_provider_linux new file mode 120000 index 0000000..b7cb6bd --- /dev/null +++ b/linux/flutter/ephemeral/.plugin_symlinks/path_provider_linux @@ -0,0 +1 @@ +/Users/a1/.pub-cache/hosted/pub.flutter-io.cn/path_provider_linux-0.0.1+2/ \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock index e96e21f..9779307 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,6 +1,13 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + args: + dependency: transitive + description: + name: args + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.6.0" async: dependency: transitive description: @@ -118,6 +125,20 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "3.2.0" + flutter_markdown: + dependency: "direct main" + description: + name: flutter_markdown + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.4.4" + flutter_spinkit: + dependency: "direct main" + description: + name: flutter_spinkit + url: "https://pub.flutter-io.cn" + source: hosted + version: "4.1.2+1" flutter_star: dependency: "direct main" description: @@ -149,6 +170,13 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "0.16.1" + markdown: + dependency: transitive + description: + name: markdown + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.1.8" matcher: dependency: transitive description: @@ -401,4 +429,4 @@ packages: version: "0.1.0" sdks: dart: ">=2.9.0-14.0.dev <3.0.0" - flutter: ">=1.12.13+hotfix.5 <2.0.0" + flutter: ">=1.17.0 <2.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index 9bbceb7..e89510b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -33,7 +33,8 @@ dependencies: intl: ^0.16.1 path_provider: ^1.6.11 connectivity: ^0.4.8+6 #网络状态 -# flutter_spinkit: ^4.1.2+1 #loading + flutter_spinkit: ^4.1.2+1 #loading + flutter_markdown: ^0.4.4 #markdown dio: ^3.0.9 #dio dev_dependencies: flutter_test: