{"id":20270969,"url":"https://github.com/swiftdo/flutter_best_practice","last_synced_at":"2025-04-11T04:21:44.018Z","repository":{"id":42997221,"uuid":"438077646","full_name":"swiftdo/flutter_best_practice","owner":"swiftdo","description":"flutter 最佳实践 riverpod，实现一个 RSS 阅读器","archived":false,"fork":false,"pushed_at":"2022-07-18T03:20:42.000Z","size":315,"stargazers_count":36,"open_issues_count":0,"forks_count":5,"subscribers_count":2,"default_branch":"master","last_synced_at":"2023-03-10T06:21:28.824Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://www.pgyer.com/eLAq","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/swiftdo.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}},"created_at":"2021-12-14T01:26:16.000Z","updated_at":"2023-01-10T23:44:47.000Z","dependencies_parsed_at":"2022-07-12T18:18:52.359Z","dependency_job_id":null,"html_url":"https://github.com/swiftdo/flutter_best_practice","commit_stats":null,"previous_names":[],"tags_count":null,"template":null,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/swiftdo%2Fflutter_best_practice","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/swiftdo%2Fflutter_best_practice/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/swiftdo%2Fflutter_best_practice/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/swiftdo%2Fflutter_best_practice/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/swiftdo","download_url":"https://codeload.github.com/swiftdo/flutter_best_practice/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224622222,"owners_count":17342353,"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":[],"created_at":"2024-11-14T12:35:21.749Z","updated_at":"2024-11-14T12:35:22.475Z","avatar_url":"https://github.com/swiftdo.png","language":"Dart","funding_links":[],"categories":[],"sub_categories":[],"readme":"# flutter_best_practice\n\n## 运行效果\n\n![](http://blog.oldbird.run/mweb/tutieshi_592x1280_49s.gif)\n\n👆🏻 图片如果没有加载出来，请点击: [http://blog.oldbird.run/mweb/tutieshi_592x1280_49s.gif](http://blog.oldbird.run/mweb/tutieshi_592x1280_49s.gif)\n\n## 下载地址\n\n1、iOS:\n\n蒲公英下载地址：[https://www.pgyer.com/eLAq](https://www.pgyer.com/eLAq)\n\n如果你不想运行代码，想体验线真机，请把你的 UDID 发给我，关注 **OldBirds公众号**，回复 \"Rss+你的 UDID\" 即可（顺便可入 Flutter 微信群）,\n\n\u003e 如何获取 UDID, 请点击[跳转这里](https://www.pgyer.com/tools/udid)\n\n\n2、Android:\n\n蒲公英下载地址：[https://www.pgyer.com/QdNY](https://www.pgyer.com/QdNY)\n\n![android](https://www.pgyer.com/app/qrcode/QdNY)\n\n## 规划\n\n* [x] rss 添加\n* [x] rss 文章列表\n* [x] rss 删除\n* [x] rss 文章详情\n* [x] rss 分类管理\n* [x] 持续集成，iOS 和 android 自动打包\n* [ ] 收藏\n* [ ] 历史\n* [ ] OPML 导入和导出\n* [ ] 应用分享\n* [ ] 应用评价\n\n## 数据解析 \n\nfreezed + json_serializable 大法好，参考文章[How to Parse JSON in Dart/Flutter with Code Generation using Freezed](https://codewithandrea.com/articles/parse-json-dart-codegen-freezed/)\n\njson \u003e dart freezed 代码生成网站：[https://app.quicktype.io](https://app.quicktype.io/)\n\n## 代码生成\n\n请用 2.8.0 以上的 flutter 版本，建议使用 [FVM 管理 flutter 环境](https://oldbird.run/flutter/t7-fvm.html)\n\n```shell\nfvm flutter pub run build_runner build --delete-conflicting-outputs\nfvm flutter pub run build_runner watch --delete-conflicting-outputs\n```\n\n## Rss 知识点\n\n认识 RSS\n\n* RSS 是什么\n* RSS 的数据类型\n* RSS 的导出和导入[OPML](https://cloud.tencent.com/developer/article/1580587)\n* RSS 和 ATOM 两种订阅方式的对比\n* RSS 解决了什么问题\n\nRSS 更高效地获取信息，不在多个应用间来回切换，另一方面拒绝算法给我们推荐的内容，只看主动订阅的内容\n\nRSS 可能是抵御算法推荐的最后一方净土\n\n\n## 自动打包\n\n支持持续集成，具体步骤可参考：\n\n* [Github Actions 免费构建 Flutter iOS 包](https://oldbird.run/flutter/github-actions-build-flutter-ios.html)\n* [Github Actions 免费构建 Flutter Android 包](https://oldbird.run/flutter/github-actions-build-flutter-android.html)\n\n\n## 单元测试\n\n1、将 test 或者 flutter_test 加入依赖；\n\n2、创建测试文件；\n\n3、创建一个要测试的类；\n\n4、为创建的类写一个测试；\n\n5、整合多个测试到一个 group；\n\n6、执行测试。\n\n关于单元测试的更多内容，可移步至 [单元测试](https://flutter.cn/docs/cookbook/testing/unit/introduction) 的文档。\n\n## 参考：\n\n* [如何使用RSS](https://www.ruanyifeng.com/blog/2006/01/rss.html)\n* [RSS 教程](https://www.runoob.com/rss/rss-tutorial.html)\n* [ATOM和RSS的区别](https://www.cnblogs.com/yjmyzz/archive/2009/02/19/1393972.html)\n* [RSS,ATOM,FEED是什么有什么区别](https://seonoco.com/blog/rss-atom-feed-different)\n* [订阅基础：RSS、ATOM、FEED、聚合、供稿、合烧与订阅](https://blog.csdn.net/hshl1214/article/details/50580073)\n* [高效获取信息，你需要这份 RSS 入门指南](https://sspai.com/post/56391)\n* [RSS：一个软件阅读全网内容，有了它真的可以为所欲为](https://zhuanlan.zhihu.com/p/356775404)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fswiftdo%2Fflutter_best_practice","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fswiftdo%2Fflutter_best_practice","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fswiftdo%2Fflutter_best_practice/lists"}