1. Appflowy 之 Bloc和freezed,理解Bloc和模式匹配

Android 中 app freezer 原理详解(一):R 版本 在之前的两篇博文《Android 中app内存回收优化(一)》和《Android 中app内存回收优化(二)》中详细剖析了 Android 中 app 内存优化的流程。这个机制的管理通过类管理,为什么叫这个名字,而不叫 AppCompact 等?freezer,一个针对应用进程长期处于 Cached 状态的优化。本文将继续分析 CachedAppOptimizer 类另一个功能 freezer。1. Freezer 简介。 阅读详情

Talk is cheap, Show me the code

Bloc是什么?

Bloc 全称Business Logic Component, 核心思想是将界面和业务逻辑分离,并通过单项数据流的方式来管理状态。

Flutter 提供了StatelessWidget 处理无状态的UI,StatefulWidget处理有状态的数据,这种分离很好的提供了对不同场景的支持,对于有状态的组件,Flutter开发常见的原生方式是在创建State,将UI剥离出状态,并将状态通过setState()函数重建Widget。本质上就是根据不同的状态生成不同的UI。

如果不做任何分层,仅仅使用Widget,会导致所有的操作,都会在State当中,包括数据的获取,状态的变更,状态依赖的处理。当项目复杂性开始上升,维护项目的成本就会指数级别的增长。

引用一张 Flutter Bloc官网的说明图

bloc_architecture_full.png

  • Bloc 是业务逻辑的组件。它负责处理界面和数据之间的交互,执行业务逻辑,并管理状态。
  • Event 是用户界面或其他部分发送给 Bloc 的消息。它可以表示用户的交互、网络请求、定时器触发等事件。
  • State 是表示应用程序状态的对象。Bloc 在执行业务逻辑时,会生成新的状态并将其发送给界面。界面根据接收到的状态来更新自身的呈现。

Bloc模式的优势在于解耦业务逻辑和界面逻辑,使代码更易于测试,维护和扩展。

  • 具体实现概括;在此不深究源代码上的实现,在Android开发技术栈中,RxJava和EventBus都可以类比实现,Bloc基于Stream,on操作很类似于使用RxJava实现EventBus, 原理类似,但管理方向不同,Bloc是一种状态管理范式。

模式匹配是什么?

模式匹配是一种用于检查数据结构的技术手段,比如当我们使用 Switch Case 结构时

void main() {
  String fruit = 'apple';

  switch (fruit) {
    case 'apple':
      print('It\'s an apple!');
      break;
    case 'banana':
      print('It\'s a banana!');
      break;
    default:
      print('Unknown fruit');
  }
}

或者Rust match

fn main() {
    let fruit = "apple";

    match fruit {
        "apple" => println!("It's an apple!"),
        "banana" => println!("It's a banana!"),
        _ => println!("Unknown fruit"),
    }
}

比较的匹配分支必须是不相等的,也就是不能 == 返回True,这种情况下,Enum 和 scale class就比较适合这样的消息定义。

sealed class CounterEvent {}

final class CounterIncrementPressed extends CounterEvent {}

class CounterBloc extends Bloc<CounterEvent, int> {
  CounterBloc() : super(0) {
    on<CounterIncrementPressed>((event, emit) {
      // handle incoming `CounterIncrementPressed` event
    });
  }
}

使用模式匹配管理状态,有很多优势:

  • 清晰的状态转换
  • 可读性和维护性,代码结构更加扁平。
  • 防止状态遗漏
  • 适应性更强,多状态组合匹配,复杂状态管理更容易

freezed 是什么?

https://github.com/rrousselGit/freezed/blob/master/resources/translations/zh_CN/README.md

简单的说,一个用于数据类 / 联合体 / 模式匹配 / 克隆的代码生成器。

我们可以通过使用Freezed自动生成所需要的数据结构

Dart 3 版本之后,switch支持模式匹配

node运行项目-Network: unavailable-没有ip地址 vscode运行vue项目后发现Network: unavailable 是什么情况呢?可能有一下三种情况:1.多个网卡原因:打开网络共享中心,把多余的网络禁用掉,只留一个2.在中配置host及public3.系统环境变量问题。 阅读详情

相关推荐

从零构建:毫米波雷达生命信号检测系统的Matlab仿真全流程解析

本文详细解析了毫米波雷达生命信号检测系统的Matlab仿真全流程,涵盖原理、信号处理链路设计及算法优化策略。通过FMCW雷达技术,实现非接触式呼吸心跳信号检测,结合Matlab代码示例展示距离FFT、相位提取与信号分离等关键步骤,为医疗监护和智能家居应用提供实用指南。

weixin_29303701的博客 355

使用Provider、Riverpod、flutter_bloc等实现的Flutter状态管理电影应用

这个开源项目展示了一个如何在Flutter中使用不同状态管理技术(如Provider、Riverpod和flutter_bloc)构建一款Netflix风格的电影应用。 ![Movie app 预览](media/app-screenshots.png) 该项目利用[TMDB API](https://www.themoviedb.org/documentation/api)获取当前播放的电影

gitblog_00067的博客 1203

基于 国产USRP B210 的通信+侦测+干扰三合一实验平台,解锁无线攻防全场景!

在当代复杂电磁环境与多样化通信需求并存的背景下,软件定义无线电(SDR)技术正展现出前所未有的系统灵活性与功能可重构性。由两台USRP-LW B210软件无线电设备模拟无线链路通信过程,能够模拟多种无线通信信号传输及图像传输场景,适用于通信协议验证、抗干扰测试及教学实验。,支持"通信-侦测-干扰-优化"的闭环实验流程,为无线通信领域的教学科研与工程应用提供了一套经济高效、功能完备的解决方案。系统可对通信链路信号进行快速、自动化侦测、识别、告警,并支持多种干扰信号生成、模式切换及效果评估功能。

luowave2012的博客 832

探索优雅的记事应用:NoteApp —— 基于Flutter的领域驱动清洁架构实践

探索优雅的记事应用:NoteApp —— 基于Flutter的领域驱动清洁架构实践 ???? 立即体验在线演示 在数字化的今天,高效管理个人笔记已成为许多人的日常需求。而NoteApp正是这样一款集合了现代技术栈,专为追求极致用户体验和代码质量的开发者设计的开源记事应用。本文将带你深入了解NoteApp,一个采用FlutterBloc、Freezed和Hive构建的典范,展示其如何优雅地实现领域驱动设...

gitblog_00096的博客 1431

【计算机组成原理】课程设计四:控制器设计(二)

本文主要是介绍了计算机组成原理课程设计四其二,即控制器设计(二),属于计算机课程设计专栏

superiony的博客 1428

渲染TA实战:冰面效果制作分享

这里画一张图:我们可以看到,如果深度图的范围没有进过缩放,那就是0-1,但是归一化的-viewDir的向量长度为1,如果-viewDir不和表面垂直(这是绝大多数的情况),那么viewDir.z的分量就是一个不定值,我们不好确定需要走多少步,viewDir才能和底面相交。然后我们需要冰面的Alpha图:因为冰是透明物体,所以相对于Albedo,我们更需要的是一张冰面裂纹的蒙版图,这张图需要记录冰面的裂纹走向和深浅、冰封的气泡、以及因为压力或气体等原因产生的类似雾的效果。

qq_41166022的博客 1025

Flutter | bloc 之 state 使用优化

让你的bloc用得更爽!

无夜之星辰的博客 1515

Pixel 6 Pro升级Android 13变砖急救指南:Fastboot全分区修复实战

本文提供Pixel 6 Pro升级Android 13变砖后的Fastboot全分区修复实战指南,详细解析变砖原因、必备工具准备、Fastboot模式解锁、全分区擦除操作及手动刷入官方ROM的完整流程,帮助用户高效解决设备变砖问题。

weixin_28693447的博客 485

开源协作办公工具(AppFlowy)

AppFlowy 是一个开源的协作办公工具,定位为“开源版 Notion”,旨在为用户提供一个隐私优先、可自定义且本地优先的笔记与协作平台。它支持跨平台使用,包括桌面端(Windows、macOS、Linux)和移动端(iOS、Android),核心特点是开源免费、数据本地存储、高度可定制以及支持离线使用。

weixin_43156294的博客 1518

华为OD机试真题 新系统2026-04-01 Python&JS 实现【勇攀数字高峰】

请你在给定的数字地形图中寻找登山路径,数字代表当前位置的海拔高度,要求从最低海拔出发,不断攀登,最终到达最高山峰。你需要寻找所有满足条件的登山路径。地图已经保证最低海拔和最高山峰都只有一个。

MISAYAONE的博客 845

SAP_MM/CO模块-超详细的CK11N/CK40N取值逻辑梳理(十几种业务场景,1.76W字)

本文主要讲述的是三个大的知识点,超详细,涉及到知识点比较多,并且串起来讲解,这也是我在网上搜不到相关资料才自己慢慢研究测试出来的,断断续续耗费了我一周多时间,相信只要你们认真看完,肯定会有所收获; 1、CK11N/CK40N成本发布功能中,系统前台的取数逻辑,涉及到多个采购信息记录、生产版本、货源清单、配额协议等对成本价发布的影响~~!! 2、CK11N与CK40N发布的成本价不一致的问题~~!! 3、如何处理外协加工物料的外协价与BOM组件成本取值不匹配的问题~~!!

风沙的博客 4072

Flutter/Dart第09天:Dart高级特性Pattern模式的概览和用法

Dart 3.0在语法层面共发布了3个高级特性,第一个特性Record记录我们在前面已经学习和探究。今天我们来学习第二个高级类型Pattern模式,由于内容较多,共分2篇文章进行介绍,本文首先介绍模式的概览和用法,包括匹配、解构、在变量申明、赋值、循环、表达式等应用场景……

老牛啊 525

智能温室:温室环境监测_(7).土壤监测技术包括pH值和电导率

土壤的pH值是指土壤溶液的酸碱度,它对植物的营养吸收和生长发育有着重要的影响。在智能温室中,土壤监测是非常重要的一个环节,因为土壤的pH值和电导率直接影响植物的生长和健康。本节将详细介绍如何利用传感器和数据处理技术来监测土壤的pH值和电导率,并提供具体的代码示例。在智能温室中,监测到的土壤pH值和电导率数据需要传输到中央控制系统进行进一步的处理和分析。通过以上步骤,您可以构建一个完整的智能温室土壤监测系统,实时监控土壤的pH值和电导率,确保植物在最佳的生长环境中。校准通常包括在已知电导率的标准溶液中进行。

zhubeibei168的博客 1408

分享 7 个有用的 Flutter 库,让你的开发生活更轻松

让你的 Flutter 开发更高效为什么要编写自定义功能,当你可以使用库呢?库是开发者最好的朋友和救命稻草。在我看来,一个好的项目应该充分利用一些最好的可用库。本文是有关 Flutter 中很棒的库系列文章的一部分,我总结了7个 Flutter 库,这些库将有助于您在开发过程中前进。1. freezed简介Freezed 是一个基于 Dart 语言的 Flutter 库,它可以帮助您快速生成不可变...

前端达人 6833

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

flutter_bloc使用解析---骚年,你还在手搭bloc吗

前言 首先,有很多的文章在说flutter bloc模式的应用,但是百分之八九十的文章都是在说,使用StreamController+StreamBuilder搭建bloc,提升性能的会加上InheritedWidget,这些文章看了很多,真正写使用bloc作者开发的flutter_bloc却少之又少。没办法,只能去bloc的github上去找使用方式,最后去bloc官网翻文档。 蛋痛,各位叼毛,就不能好好说说flutter_bloc的使用吗?非要各种抄bloc模式提出作者的那俩篇文章。现在,搞的杂家这个伸

小小涛的博客 3720

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【Flutter 工程】002-代码生成:Freezed ——类似 Java 的 lombok

Flutter 的 Freezed 是一个代码生成工具,用于帮助开发者在Flutter应用程序中创建不可变(immutable)的数据模型。它基于Dart语言的代码生成功能,通过生成大量的模板代码来简化和加速不可变数据类的创建过程。使用Freezed,您可以定义数据模型类,并自动生成大量的模板代码,包括等价性比较(equality)、哈希码(hashcode)以及复制(copy)等方法。这些模板代码通过元编程技术生成,大大减少了手动编写重复的样板代码的工作量。

訾博(ZiBo)的博客 3152

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

告别繁琐操作:AppFlowy拖拽交互让文件管理效率提升300%

AppFlowy 是 Notion 的一个开源替代品,基于Flutter和Rust构建而成,让您完全掌控数据和定制化需求。其直观的拖拽交互设计,彻底改变了传统文件管理方式,帮助用户以更高效、更灵活的方式组织和管理各类文件与信息。 ## 一、拖拽交互:重新定义文件管理效率 在数字化办公时代,文件管理的效率直接影响工作产出。AppFlowy 创新性地将拖拽交互融入文件管理的各个环节,从页面创建到内

gitblog_00941的博客 738

AppFlowy终极指南:如何打造完全掌控的开源知识管理系统

想要摆脱商业笔记软件的束缚,拥有一个完全由自己掌控的知识管理工具吗?AppFlowy作为Notion的开源替代品,正是你寻找的完美解决方案!这款基于Flutter和Rust构建的开源知识管理系统,让你完全掌控自己的数据和定制需求。 ## 🚀 什么是AppFlowy? AppFlowy是一个功能强大的开源知识管理平台,它结合了现代UI设计、实时协作能力和高度可定制性。与商业软件不同,AppFl

gitblog_00918的博客 780

Flutter项目该如何选择状态管理?

状态管理原则 我们在开发过程中,为了提高项目的可维护度和性能,也为了让页面UI跟数据(本地或服务端数据)有效分离的同时又能有效同步,都会让项目保持清晰的目录结构、同时启用状态管理库。而MV...

Android技术之家 1158

Flutter项目中数据统计报表开发的工程化实践与代码规范

在移动应用开发中,数据统计报表与BI功能往往承载着业务分析的核心需求。然而,这类模块开发过程中常伴随结构混乱、逻辑耦合等问题,尤其是在团队协作场景下,如何通过工程化手段和代码规范提升代码质量,成为每个技术负责人需要面对的挑战。本文以Flutter为技术栈,结合一个完整的数据统计报表项目为例,从实际开发流程出发,深入探讨如何通过规范化配置、可复用组件设计和自动化工具集成等方式,系统性提升团队代码质量。

wuchangjian的专栏 235

Flutter 插件 device_calendar_plus 开源鸿蒙适配实战:从权限弹窗失灵到循环日程跑通

device_calendar_plus 是一个读写系统日历的 Flutter 联合插件,但无鸿蒙实现。本文完整记录开源鸿蒙适配过程:联合插件架构设计、UIAbility 上下文与权限弹窗、CalendarKit 错误码透传、循环日程实例展开四个关键坑的定位与解决,全部代码已在真机验证,附适配仓库链接。

腾讯云创作之星、华为云云享专家,深耕电商全栈高并发系统实战,分享可商用商城项目源码。 884

Flutter学习day8--Navigator路由导航与页面传参

一个稍微像样的 App,都不可能只有一个页面。从列表页点进详情页、从设置页返回、从登录页登录后跳到首页——这些「页面之间怎么跳、数据怎么带过去带回来」的问题,在 Flutter 里全部由负责。这篇文章把 Flutter 的路由导航讲清楚:导航栈的原理、push/pop 的用法、正向与反向传参,以及几个新手最容易踩的坑。

qq_63223749的博客 690

Dart/Flutter `package:http`:从发请求到局部替换 HTTP Client

本文详解 Flutter 中 package:http 的核心概念,解析 Client、BaseClient、send() 拦截机制及 runWithClient 的原理。通过 _AuthingQrDiagnosticClient 示例,揭示如何通过重写 send() 拦截请求、包装响应流,并利用 Dart Zone 实现客户端临时替换。最终说明 Authing SDK 请求被拦截的原因:runWithClient 依托 Zone 上下文注入自定义客户端,实现全局请求拦截与日志记录,无需显式传参。

侯仕奇的博客 230

二.Flutter 速成第二课:核心概念与第一个自定义页面

本课面向有Android经验的开发者,用30分钟掌握Flutter核心概念:通过Dart语言速成(空安全、函数、异步)建立基础,理解“一切皆Widget”心智模型,掌握StatelessWidget与StatefulWidget的区别及setState机制。结合Android开发经验进行概念映射,实战将计数器改造为可增删的待办清单,实现页面导航与数据驱动界面更新,完成从布局到交互的完整闭环。

码点 183

Flutter学习day10--shared_preferences与离线优先

大多数 App 的第一版都长这样:页面数据全部来自网络,网一断,界面直接开天窗。用户不会去研究你的代码写得漂不漂亮,他们只记得"这个 App 断网就白屏"。这一篇我们解决两件事:怎么把数据存到手机本地(shared_preferences),以及怎么用"离线优先"模式让页面断网时依然有内容可看。这两点是 Flutter 客户端数据层的地基,也是网络请求(W4 前几篇)之后顺理成章的下一步。

qq_63223749的博客 260

Flutter 开始支持 Jetpack Compose Platform View

居然开始支持 Jetpack Compose 的了,看起来是 Flutter 在给默认补齐 AndroidX 的三个 ViewTree Owner,让 Compose 能找到生命周期、状态恢复和 ViewModel 的宿主。理论上后面应该会直接支持 Compose 放进 HC、TLHC、VD 和 HCPP 四个场景里里面。

恋猫de小郭的博客 325
上一篇: Android 开发中 常见的数据结构有哪些?
下一篇: Flutter开源项目Appflowy学习
PirateBrook
博客等级 码龄11年 90粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值