未知狐的小窝 - Dart/Flutter
type: channel
link: https://www.xfox.fun/category/dart/
items: VibeCoding 重构ESP8266开发板Epaper驱动
items: Flutter 移动端开发学习笔记——一切皆组件

VibeCoding 重构ESP8266开发板Epaper驱动
type: item
date: 2026-06-21T18:29:00+00:00
description: 我承认我偷懒了，两年前4.2寸墨水屏电子价签改造记录——持续更新 这篇文章当初放了大家鸽子。作为弥补，我抽空选了这几天晚上带凌晨，把原先可用的代码里的主要内容（寄存器数据等）喂给了DS，然后开始VibeCoding疯狂Debug，总算出了一版能用的。主要适用于BLOZI 的4.2inch 红白黑三色电子价签，曾经该公司尿崩的时候在淘宝/咸鱼有较大规模流出，当时不做完整一是确实没资料无法彻底整明白，二是整明白了发出来除了让奸商涨价没什么屌用。这个时间点，货早就出完了，这个规格的价签估计也早就停产换代了，发出来供手上还有留存的垃圾佬娱乐。仓库地址：epd4in2_dev — ESP8266 驱动 4.2 英寸 三色墨水屏（400×300）

Flutter 移动端开发学习笔记——一切皆组件
type: item
date: 2026-05-16T12:27:00+00:00
description: Linux内核遵循一切皆文件原则，Flutter开发遵从一切皆组件Widget的原则。应用界面由组件与组件的嵌套堆叠构成，组件按照布局作用有布局组件（如Center，Column）和一般组件（常见Text，MD风格组件：Scaffold，floatingActionButton）布局组件Flutter提供的布局组件命名及其作用与前端CSS样式/Python Tkinter中的布局样式组件类似。Center 是一个布局 widget。它接收一个子 widget，并将其放置在父 widget 的正中间。StatefulWidget和StatelessWidget按照状态区分则分为有状态组件 （集成自StatefulWidget）和无状态组件（继承自StatelessWidget ）有无状态，主要区别在于是否需要在应用运行期间动态改变数据并更新UI。无状态组件属于不可变组件，创建后所有的属性、UI 呈现均固定不变。它不依赖任何随时间变化的数据生命周期：简单，仅包含一个 build() 方法。性能：性能开销低，不需要管理状态和触发重绘。常见场景：静态文本（Text）、图标（Icon）、静态图片以及页面头部导航栏（AppBar）class MyStatelessWidget extends StatelessWidget { @override Widget build(BuildContext context) { return Text('这是一个无状态组件'); } }有状态组件特点：可变组件，在生命周期内可以持有、改变状态（State），并在状态改变时自动刷新、重新构建 UI。组成部分：包含两个类，一个继承自 StatefulWidget，另一个继承自 State。UI 的逻辑和布局写在 State 类的 build 方法中。状态管理：通过调用 setState() 方法通知 Flutter 框架数据已改变，从而触发 build 重新绘制界面。常见场景：复选框（Checkbox）、输入框（TextField）、计数器、网络请求加载中状态等需要根据用户交互或数据更新而变化的 UI。MyStatefulWidget extends StatefulWidget { @override _MyStatefulWidgetState createState() => _MyStatefulWidgetState(); } class _MyStatefulWidgetState extends State<MyStatefulWidget> { int _counter = 0; // 函数命名下以划线开头表示该函数是一个私有函数，否则默认为公共 void _incrementCounter() { setState(() { _counter++; // 改变计数器数值并触发UI更新 }); } @override //重写build方法 Widget build(BuildContext context) { //返回一个可以检测手势的小部件：GestureDetector return GestureDetector( //onTap属性指定接受点击事件时调用私有函数_incrementCounter() onTap: _incrementCounter, child: Text('点击次数: $_counter'), ); } }