分类 Dart/Flutter 下的文章

我承认我偷懒了,两年前4.2寸墨水屏电子价签改造记录——持续更新 这篇文章当初放了大家鸽子。

作为弥补,我抽空选了这几天晚上带凌晨,把原先可用的代码里的主要内容(寄存器数据等)喂给了DS,然后开始VibeCoding疯狂Debug,总算出了一版能用的。
主要适用于BLOZI 的4.2inch 红白黑三色电子价签,曾经该公司尿崩的时候在淘宝/咸鱼有较大规模流出,当时不做完整一是确实没资料无法彻底整明白,二是整明白了发出来除了让奸商涨价没什么屌用。
这个时间点,货早就出完了,这个规格的价签估计也早就停产换代了,发出来供手上还有留存的垃圾佬娱乐。
仓库地址:epd4in2_dev — ESP8266 驱动 4.2 英寸 三色墨水屏(400×300)
演示图片

Linux内核遵循一切皆文件原则,Flutter开发遵从一切皆组件Widget的原则。

应用界面由组件与组件的嵌套堆叠构成,组件按照布局作用有布局组件(如CenterColumn)和一般组件(常见Text,MD风格组件:ScaffoldfloatingActionButton

布局组件

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'),
    );
  }
}