{"id":45247968,"url":"https://github.com/iotjin/jh_flutter_demo","last_synced_at":"2026-02-20T22:32:31.634Z","repository":{"id":41086145,"uuid":"246256625","full_name":"iotjin/jh_flutter_demo","owner":"iotjin","description":"flutter项目- 实现一些常用效果、封装通用组件和工具类","archived":false,"fork":false,"pushed_at":"2026-01-26T08:32:39.000Z","size":63251,"stargazers_count":1093,"open_issues_count":0,"forks_count":236,"subscribers_count":12,"default_branch":"master","last_synced_at":"2026-01-26T22:39:21.199Z","etag":null,"topics":["aes","alert","bar","dark-mode","dart","dialog","echarts","flutter","form","indexlist","ios","jh","listview","lottie","picker","pie","pop","toast","video-player","wechat"],"latest_commit_sha":null,"homepage":"https://iotjin.github.io/jh_flutter_demo/","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-2-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/iotjin.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2020-03-10T09:18:54.000Z","updated_at":"2026-01-26T08:32:44.000Z","dependencies_parsed_at":"2024-06-13T10:16:29.083Z","dependency_job_id":"0b9138a2-e2f6-46b6-b1f5-a0c8979acc5a","html_url":"https://github.com/iotjin/jh_flutter_demo","commit_stats":null,"previous_names":[],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/iotjin/jh_flutter_demo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iotjin%2Fjh_flutter_demo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iotjin%2Fjh_flutter_demo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iotjin%2Fjh_flutter_demo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iotjin%2Fjh_flutter_demo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/iotjin","download_url":"https://codeload.github.com/iotjin/jh_flutter_demo/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iotjin%2Fjh_flutter_demo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29667089,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-20T19:49:36.704Z","status":"ssl_error","status_checked_at":"2026-02-20T19:44:05.372Z","response_time":59,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aes","alert","bar","dark-mode","dart","dialog","echarts","flutter","form","indexlist","ios","jh","listview","lottie","picker","pie","pop","toast","video-player","wechat"],"created_at":"2026-02-20T22:32:30.843Z","updated_at":"2026-02-20T22:32:31.621Z","avatar_url":"https://github.com/iotjin.png","language":"Dart","funding_links":[],"categories":[],"sub_categories":[],"readme":"# jh_flutter_demo\n\n[![Flutter version](https://img.shields.io/badge/Flutter%20version-3.32.0-brightgreen)](https://flutter.dev)\n[![Dart version](https://img.shields.io/badge/Dart%20version-3.8.0-brightgreen)](https://dart.dev)\n[![License](https://img.shields.io/badge/license-BSD--2--Clause-green)](LICENSE)\n[![GitHub release (latest by date including pre-releases)](https://img.shields.io/github/v/release/iotjin/jh_flutter_demo?include_prereleases)](https://github.com/iotjin/jh_flutter_demo/releases/)\n\n\n## English | [简体中文](README.zh-CN.md)\n\nA new Flutter project - implement common UI effects, encapsulate components and utils. \u003cbr\u003e\n\u003cbr\u003e\n\npwd：123456\n\nThe code is updated irregularly.\n\u003cbr\u003e\n\u003cbr\u003e\n\n## Online preview\n\n  https://iotjin.github.io/jh_flutter_demo\n\n## Project environment\n\n* Flutter version 3.32.0\n* Dart version 3.8.0\n\n\n## Some UI effects implemented\n\n* Common framework construction, common base class implementation\n* Macro Definitions for Font, Color, Frame, String, etc.\n* Dio network request encapsulation\n* API interface management and data management\n* Modularized management of routes\n* Screen adaptation\n* Dark Mode adaptation\n* Theme switch\n* Internationalization (GetX)\n* Material3 adaptation\n* Components\n  * BaseAppBar、BaseTabBar、BaseRefreshView、BaseWebView\n  * Dialogs (center、bottom、toast、dialog、custom dialogs)\n  * Time、Date、single-column、multi-column and bottom single/multiple pickers\n  * Cascading picker (multi-dimensional array or tree structure, supports search)\n  * JhForm form input (single row、multi-row input style、select style、setting style、login style)\n  * JhTopTabBar(navigation bar page switching)\n  * Gradient color AppBar, multi-line title AppBar\n  * Imitation of WeChat's upper-right corner pop-up box\n  * Countdown button\n  * APP update dialog\n  * Picture/video picker based on WeChat UI (supports taking pictures and recording videos)\n  * Picture/Video Browser\n  * Taking photos, local image selection, nine-grid display, full-screen image viewing\n  * Highlighting specified text in text\n  * Empty data and network exceptions\n  * Skeleton screen\n  * Horizontal sliding menu (same effect as Pinduoduo homepage, Taobao My channel)\n  * Carousel image(full screen, zoom)\n  * Shake, zoom, translate animation\n  * wave animation\n  * lottie animation\n  * tag view\n  * collapse view\n* Utils\n  * AES encryption/decryption, MD5 encryption, base64 encoding/decoding\n  * Local data AES encrypted storage\n  * Real-time network monitoring\n  * Getting device information, screen information, and notch screen detection\n  * Loading image resources, color settings\n  * Status bar settings\n  * QR code scanning and generation\n  * Navigation route jumping\n  * Listening for page appearance or disappearance\n  * Time format conversion\n  * String processing\n  * Random numbers\n  * Exit the APP/jump to the app store\n  * Debounce / Throttle\n  * Jump tripartite map APP navigation\n* UI related\n  * ListView related (paging up/down refresh, grouping up/down refresh, group sticking)\n  * GridView related\n  * Chart related (dynamic loading of multiple charts, gradient line charts, mixed line and bar charts)\n  * Badges\n  * AppBar search and header search\n  * Animation (tag cloud)\n  * List slide button\n  * City selection list\n  * ListView/GridView drag and drop sorting\n  * Rich text\n  * log in / Register\n  * Version new features\n  * Checking for updates\n  * Imitation of WeChat UI (home page, address book, discovery, and personal center, etc.)\n  * AppBar image pull-down zoom and gradient effect (WeChat Sports Ranking List, personal homepage)\n  * WeChat friends circle and image browsing\n  * Cross-slide (personal center effect)\n\n\nNote:\n* Packaged components and utils in the `jh_common` folder\n* For more, please download the project to view\n\n\u003cbr\u003e\n\n\n## Precautions\n\n* There will be some freezes in debug mode, which is normal. A good experience requires a release package. iOS can execute the command `flutter build ios` to create a release version. Android can execute the command `flutter build apk` to create a release version.\n* iOS14 crashes when running on a real machine, which can be run on a real machine through `flutter run --release`\n\n## \u003ca id=\"Update record\"\u003e\u003c/a\u003e Update record\n\u003cdetails open id=\"Important update\"\u003e\n  \u003csummary\u003e\u003cstrong\u003eImportant update\u003c/strong\u003e\u003c/summary\u003e\n   \n```\n* v3.32.0  - Update pubspec library and flutter version（Flutter 3.32.0，Dart 3.8.0），Android 16 adaptation ，Java11 to Java17\n* v3.27.0  - Update pubspec library and flutter version（Flutter 3.27.0，Dart 3.6.0），Android 15 adaptation\n* v3.22.0  - Update pubspec library and flutter version（Flutter 3.22.0，Dart 3.4.0），Android 14 adaptation\n* v3.16.0  - Update pubspec library and flutter version（Flutter 3.16.0，Dart 3.2.0），iOS minimum build version changed to 12.0 , Material3 adaptation\n* v3.13.0  - Update pubspec library and flutter version（Flutter 3.13.0，Dart 3.1.0）\n* v3.10.0  - Update pubspec library and flutter version（Flutter 3.10.0，Dart 3.0.0）\n* v3.7.0  - Update pubspec library and flutter version（Flutter 3.7.0，Dart 2.19.0）\n* v3.3.0  - Update pubspec library and flutter version（Flutter 3.3.0，Dart 2.18.0），iOS minimum build version changed to 11.0\n* v3.0.0  - Update pubspec library and flutter version（Flutter 3.0.0，Dart 2.17.0）\n* v2.10.1 - Dark Mode adaptation\n* v2.10.0 - Update pubspec library and flutter version（Flutter 2.10.0，Dart 2.16.0）\n* v2.0.0  - Update Flutter SDK（ 2.0.3 ）and pubspec library\n* v1.0.0  - environment：Flutter version 1.22.3，Dart version 2.10.3\n```\n\u003c/details\u003e\n\n\n## Appreciate the support\n\n\n* If you think it's good, or my open source project is helpful to you, you can click \"Star\" in the upper right corner to support it. Your support is my motivation, thank you 🙂\n* You can also scan the QR code below, invite the author to have a cup of milk tea 🧋\n\n\u003cbr\u003e\n\n\u003cimg src=\"https://gitee.com/iotjh/res/raw/master/weapp/PayCode.jpg\" width=\"400\" height=\"400\"\u003e\n\n\u003cbr\u003e\n\n## Preview\n\nSome page effects are as follows:\n\n\n\u003cbr\u003e\n\u003cbr\u003e\n\u003cbr\u003e\n\n\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/Login.gif\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/wx/wx_home.jpg\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/wx/wx_contacts.jpg\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/wx/wx_discover.jpg\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/wx/wx_mine.jpg\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/Other/BaseAppBar.gif\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/Alert/JhToast.gif\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/Alert/BootomSheet.gif\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/Alert/JhDialog.gif\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/Alert/JhCascadePicker.gif\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/Alert/JhCascadeTreePicker1.gif\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/Alert/JhCascadeTreePicker2.gif\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/Alert/JhMultiPicker.gif\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/Alert/Alert_iOS.gif\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/Other/PhotoSelect.gif\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/Form/JhLoginTextField.jpg\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/Form/JhTextField.jpg\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/Form/JhFormInputCell.jpg\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/Form/JhFormSelectCell.jpg\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/Form/JhSetCell.jpg\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/topTabBar/JhTopTabBar.jpg\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/topTabBar/JhTopTabBar_redDot.jpg\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/search/navSearch_3.jpg\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/search/SearchTest4Page.gif\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/Other/TagCloudWidget.gif\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/Other/TagCloudWidget2.gif\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/eChart.gif\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/Alert/JhPopMenus1.jpg\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/Alert/JhPopMenus2.jpg\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/Alert/JhPopMenus3.jpg\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/Other/img_pull_down_big.gif\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/Other/img_pull_down_big2.gif\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/Other/img_pull_down_big.gif\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/wx/home/wx_motion_top.gif\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/wx/discover/wx_friendsCircle.gif\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/theme.gif\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/Other/JhAssetPicker.gif\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/Base/BaseRefreshView.gif\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/Base/BaseRefreshViewShimmer.gif\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/Base/BaseRefreshViewFixed.gif\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/Base/BaseRefreshViewFollow.gif\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/components/JhSlideMenuView.jpg\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/components/JhSwiperView.gif\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/topTabBar/PersonalCenterPage2.gif\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/topTabBar/PersonalCenterPage3.gif\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/topTabBar/PersonalCenterPage5.gif\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/Other/WavePage.gif\" width=\"208\" height=\"404\"\u003e\u003cimg src=\"https://gitee.com/iotjh/Picture/raw/master/FlutterDemoScreenShot/Other/LottiePage.gif\" width=\"208\" height=\"404\"\u003e\n\n\n\n\n\n\n\n\u003cbr\u003e\n\u003cbr\u003e\n\u003cbr\u003e\n\n## WeChat UI：\n\n| ![](./ScreenShot/wx/wx_home.jpg)    |  ![](./ScreenShot/wx/wx_contacts.jpg)    | ![](./ScreenShot/wx/wx_discover.jpg)   |  ![](./ScreenShot/wx/wx_mine.jpg)   |\n| :--------------------------------: | :---------------------------------: | :-------------------------------: | :-------------------------------:  |\n| ![](./ScreenShot/wx/home/wx_motion.jpg)            |  ![](./ScreenShot/wx/home/wx_motion_top.gif)        | ![](./ScreenShot/wx/home/wx_subscribeNum.jpg)    |  ![](./ScreenShot/wx/home/wx_subscribeNumList.jpg)       |\n|  ![](./ScreenShot/wx/home/wx_qqMessage.jpg)   |  ![](./ScreenShot/wx/contacts/wx_addFriend.jpg)    | ![](./ScreenShot/wx/contacts/wx_userInfo.jpg)          |  ![](./ScreenShot/wx/contacts/wx_newFriend.jpg)               | \n| ![](./ScreenShot/wx/contacts/wx_infoSet.jpg)       |  ![](./ScreenShot/wx/mine/wx_personInfo.jpg)         | ![](./ScreenShot/wx/mine/wx_pay.jpg)                        |  ![](./ScreenShot/wx/mine/wx_payManager.jpg)                  |\n| ![](./ScreenShot/wx/discover/wx_friendsCircle.gif)    |  ![](./)   | ![](./)  | ![](./)  |\n\n\u003cbr\u003e\n\n## \u003ca id=\"Licenses\"\u003e\u003c/a\u003e Licenses\n\u003cdetails open id=\"Licenses\"\u003e\n  \u003csummary\u003e\u003cstrong\u003eLicenses\u003c/strong\u003e\u003c/summary\u003e\n\n```\n\nBSD 2-Clause License\n\nCopyright (c) 2020, iotjin\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n```\n\n\u003c/details\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fiotjin%2Fjh_flutter_demo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fiotjin%2Fjh_flutter_demo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fiotjin%2Fjh_flutter_demo/lists"}