{"id":13693849,"url":"https://github.com/songxiaoliang/visitor-flutter","last_synced_at":"2025-10-08T12:10:23.021Z","repository":{"id":202357193,"uuid":"162820931","full_name":"songxiaoliang/visitor-flutter","owner":"songxiaoliang","description":"flutter 视频类客户端","archived":false,"fork":false,"pushed_at":"2021-02-10T02:02:11.000Z","size":1662,"stargazers_count":723,"open_issues_count":2,"forks_count":142,"subscribers_count":24,"default_branch":"master","last_synced_at":"2025-03-28T17:06:57.273Z","etag":null,"topics":["flutter","flutter-app","flutter-material"],"latest_commit_sha":null,"homepage":"https://www.pgyer.com/poE0","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/songxiaoliang.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2018-12-22T15:13:54.000Z","updated_at":"2025-01-17T12:58:49.000Z","dependencies_parsed_at":null,"dependency_job_id":"67840f99-7470-4309-89c4-cc3a5bd2acb6","html_url":"https://github.com/songxiaoliang/visitor-flutter","commit_stats":null,"previous_names":["songxiaoliang/visitor-flutter"],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/songxiaoliang%2Fvisitor-flutter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/songxiaoliang%2Fvisitor-flutter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/songxiaoliang%2Fvisitor-flutter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/songxiaoliang%2Fvisitor-flutter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/songxiaoliang","download_url":"https://codeload.github.com/songxiaoliang/visitor-flutter/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247226213,"owners_count":20904465,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["flutter","flutter-app","flutter-material"],"created_at":"2024-08-02T17:01:19.084Z","updated_at":"2025-10-08T12:10:17.988Z","avatar_url":"https://github.com/songxiaoliang.png","language":"Dart","funding_links":[],"categories":["Dart"],"sub_categories":[],"readme":"# Vistor-Flutter 视频类 App\n\n## 博客链接：https://songlcy.blog.csdn.net/article/details/86621278\n\n##### 链接下载Apk安装\nhttps://www.pgyer.com/poE0\n\n【注】如果安装apk后，启动发生闪退现象，原因是由于手机 ARM 处理器兼容问题。一般会发生在新款三星、华为等第8代处理器手机，此时可以找到 app/build.gradle 文件，手动修改如下代码：\n```xml\n // \"arm64-v8a\"为8代处理器，一般为三星，华为新手机出现。\n ndk {\n   abiFilters \"armeabi-v7a\", \"armeabi\", \"arm64-v8a\"\n }\n```\n \n### 模块\n1.开发环境：\n```xml\n  Vs Code (1.30.2)\n  Android Studio 3.+\n```\n\n2.开发框架 ( Flutter sdk: \"\u003e=2.0.0-dev.68.0 \u003c3.0.0\" )：\n```xml\n  状态管理：Scoped_model\n  网络层：Dio\n  导航库：Fluro\n```\n\n3.主模块分为首页、精选、电影、我的，以下是功能列表：\n```xml\n  使用 scoped_model 状态管理，实现state统一管理。\n  使用 TabBar + TabBarView 实现单页面不同模块切换。\n  使用 staggered_grid_view、ListView 组件展示图文列表。\n  扩展列表组件，结合 NotificationManager 实现上拉加载更多数据，下拉刷新数据。\n  精选内容，分类展示，使用SliverAppBar，增加交互动效，提高用户体验。\n  自定义过滤菜单组件，结合 ScrollController 实现滑动交互效果。\n  代码模块化  实现，组件封装实现代码复用。\n```\n\n### 功能设计\n```xml\n  1. 使用 Fluro 管理全局路由，可自由配置 Scene 的转场动画，处理Android端的后退键事件\n  2. 使用 Flutter 基本语法进行布局，并封装了一系列通用的组件，比如 AnimationText、过滤菜单，加载状态组件，共享动画组件等，便于全局复用\n  3. 数据层使用Dio实现 Http / Https 网络加载，可轻松实现 http header、链接超时等常用配置。\n  4. 使用 CachedImage 组件，实现图片的加载缓存，优化渲染显示性能。\n  5. 引入 scoped_model 状态管理，Scoped 结合 ScopedModelDescendant ，设定全局 state 结构，管理相关的组件状态。\n  6. 使用 shared_preferences 实现小数据的本地化存储。\n  7. 使用第三方字体库，实现 FontFamily 的定制显示。\n  8. 设置 WillPopScope，实现首页点击返回键提示两次快按退出功能。\n  9. 首页非Index Tab 页面下，点击返回键，首先返回 Index Tab，再次点击提示两次退出。\n  ....\n```\n\n### 项目结构\n```xml\n lib\n ├── main.dart\n ├── common\n ├── components\n ├── cofig\n ├── constants\n ├── delegate\n ├── events\n ├── models\n │   ├── pood\n │   └── state_model\n ├── pages\n │   ├── detail\n │   └── home\n │   ├── index\n │   └── mine\n │   ├── movie\n │   └── popular\n │   ├── theme\n ├── route\n ├── utils\n └assets\n```\n\n### 依赖库\n\n部分图标采用了icons，查看具体的图标名称可到 ionics官方文档。依赖方式，cd 到项目根目录，执行：flutter get packages \n```xml\n  dio: ^1.0.13\n  fluro: ^1.4.0\n  timeago: ^2.0.10\n  scoped_model: ^1.0.1\n  event_bus: ^1.0.1\n  shimmer: ^0.0.6\n  connectivity: ^0.3.2\n  fluttertoast: ^2.2.7\n  shared_preferences: ^0.4.3\n  cached_network_image: ^0.5.1\n  flutter_swiper: ^1.1.4\n  flutter_spinkit: ^3.0.0\n  flutter_staggered_grid_view: ^0.2.6\n  flutter_webview_plugin: ^0.3.0+2\n  video_player:\n    git:\n      url: https://github.com/songxiaoliang/flutter_video_player.git\n```\n\n### 待完善功能\n```xml\n 1. 登录\n 2. 分享\n 3. 支付\n 4. 推送\n 5. 局部窗口播放\n```\n\n### 效果图 （oneplus 5 Android 设备）\n\n\u003cimg width=\"300\" height=\"500\" src='https://img-blog.csdnimg.cn/20190124101016565.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM3MTgxMjA=,size_16,color_FFFFFF,t_70'/\u003e\n\u003cimg width=\"300\" height=\"500\" src='https://img-blog.csdnimg.cn/20190124101058299.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM3MTgxMjA=,size_16,color_FFFFFF,t_70'/\u003e\n\u003cimg width=\"300\" height=\"500\" src='https://img-blog.csdnimg.cn/20190124101200245.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM3MTgxMjA=,size_16,color_FFFFFF,t_70'/\u003e\n\u003cimg width=\"300\" height=\"500\" src='https://img-blog.csdnimg.cn/20190124101258765.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM3MTgxMjA=,size_16,color_FFFFFF,t_70'/\u003e\n\u003cimg width=\"300\" height=\"500\" src='https://img-blog.csdnimg.cn/20190124101518712.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM3MTgxMjA=,size_16,color_FFFFFF,t_70'/\u003e\n\u003cimg width=\"300\" height=\"500\" src='https://img-blog.csdnimg.cn/201901241014493.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM3MTgxMjA=,size_16,color_FFFFFF,t_70'/\u003e\u003cimg width=\"500\" height=\"300\" src='https://img-blog.csdnimg.cn/20190124101345380.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM3MTgxMjA=,size_16,color_FFFFFF,t_70'/\u003e\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsongxiaoliang%2Fvisitor-flutter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsongxiaoliang%2Fvisitor-flutter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsongxiaoliang%2Fvisitor-flutter/lists"}