最近我做了一个开源小项目:novel_reader
GitHub 地址:
github.com/cmdparkour/…
它是一个基于 Flutter 开发的本地小说阅读器,当前主要支持 TXT 导入阅读,已经做了这些能力:
- 本地 TXT 导入
- 书架管理
- 阅读进度自动保存
- 字号 / 行高 / 主题 / 亮度设置
- 章节解析
- 滚动 / 分页双阅读模式
- TTS 听书
这个项目不是想做成“大而全”的阅读平台,而是想先把一件小事做好:
做一个真正能用、离线优先、适合看本地小说的阅读器。
我为什么会做这个项目?
原因很简单:我想要一个更纯粹一点的阅读体验。
现在很多阅读产品要么功能太重,要么广告太多,要么离不开账号体系、云同步、在线书源。
但很多时候,我的需求其实很朴素:
- 手里有 TXT 文件
- 想导进去直接看
- 能记住进度
- 字体和背景能自己调
- 最好再支持翻页和听书 所以我就自己做了一个。 这个项目从一开始的目标就不是“做平台”,而是:
- 本地优先
- 离线优先
- 体验优先
这个项目现在能做什么?
- 支持本地 TXT 导入
目前项目聚焦在 TXT 格式。
打开应用后,可以直接导入本地小说文件,进入书架管理。 我没有把它做成“只记文件路径”的临时读取,而是做了更稳定一点的处理,尽量避免文件丢失或路径失效带来的问题。
- 书架管理 + 阅读进度保存
导入后的小说会展示在书架里。
点击进入阅读页,退出后会自动保存当前阅读位置,下次打开可以继续读。 这个功能看起来普通,但我觉得它是阅读器最基础、也最不能缺的一环。
- 阅读设置不是摆设 我不想只做一个“只能调字号”的设置页,所以现在已经支持这些内容:
- 字体大小
- 行高
- 背景颜色
- 文字颜色
- 屏幕亮度
- 主题模式
- 阅读模式切换 而且设置修改后会即时生效,方便边调边看。
- 支持滚动和分页两种阅读模式
有的人喜欢连续滚动,有的人更喜欢一页一页翻。
所以我把两种模式都做进去了。 这部分实现时我比较在意的是:
分页不能只是简单切字符串,而是要尽量根据当前排版参数去计算页面内容,不然阅读体验会很奇怪。 所以这个项目里,分页阅读并不是一个“视觉开关”,而是真正参与了内容切分逻辑。
- 我专门做了中文章节解析
这应该是我自己比较满意的一部分。
很多 TXT 阅读器的问题是:
只能把整本书当成一整块文本展示,读长篇小说时体验会很差。 所以我在项目里加了章节解析逻辑,去识别中文小说里常见的结构,比如:
- 第 X 卷
- 第 X 章
- 第 X 节
- 第 X 回 这样可以生成章节列表,后续也更方便做跳转、进度定位和目录阅读。 对中文网文场景来说,我觉得这一步很值。
- 还接了 TTS
除了“看”,我也想让它支持“听”。
所以现在项目里已经集成了 TTS,支持基本的朗读相关功能。
这部分还在继续打磨,但已经能作为阅读辅助能力使用了。 我自己做这个功能的初衷也很简单:
有时候不是不想看,而是眼睛累了。
这时候能切成听书模式,体验会舒服很多。
这个项目用了什么技术? 当前技术栈比较直接:
- Flutter
- Provider
- SharedPreferences
- FilePicker
- ScreenBrightness
- flutter_tts 项目结构也比较常规: lib/ ├── main.dart ├── models/ ├── providers/ ├── services/ └── pages/ 大致拆分思路是:
- models:数据模型
- providers:状态管理
- services:业务逻辑
- pages:页面层 我希望它不仅能“跑起来”,也能保持一个相对清晰的结构,后续继续扩展时不至于太乱。
这个项目目前还不完美 虽然已经能用,但它还远远没到“完成版”。 目前比较明确的限制有这些:
- 现在核心支持还是 TXT
- 大文件场景还有优化空间
- 搜索、书签、自定义字体这些能力还没完全补齐
- 更完整的翻页动画、更多格式支持也还在规划里 所以如果一定要给它一个定位,我觉得更准确的说法是:
这是一个已经具备产品雏形、但还在持续打磨中的开源阅读器项目。
我为什么选择把它开源?
一方面是因为我自己确实想做这个东西。
另一方面,我也觉得这种项目挺适合开源:
- 方向具体
- 场景明确
- 容易持续迭代
- 对 Flutter 学习者也有参考价值 如果有人刚好也想做:
- 本地工具
- 阅读器
- 中文文本处理
- Flutter 中小型应用 那这个项目也许能提供一点参考。
接下来还想继续做什么? 后面我想继续完善这些方向:
- 更多文件格式支持
- 更完整的书签 / 搜索能力
- 更好的大文本性能处理
- 更自然的翻页体验
- 更丰富的主题和字体配置 如果时间够,也会考虑继续往“更完整的本地阅读体验”方向推。
但整体上,我还是会尽量克制,不想把它做成一个越来越重的东西。
最后 这个项目的出发点其实很简单:
给喜欢本地阅读的人,一个更安静、更可控的选择。 如果你也对这个方向感兴趣,欢迎看看项目,也欢迎提 Issue/PR。
GitHub:github.com/cmdparkour/…
如果你觉得这个项目还不错,也欢迎顺手点个 Star。
如果你自己也做过类似的本地工具项目,也欢迎评论区交流。