flutter的freezed

freezed的作用

用于自动生成不可变数据类和联合类型(sealed unions)的代码生成库。

引入

sql 复制代码
flutter pub add freezed_annotation
flutter pub add --dev build_runner
flutter pub add --dev freezed

# 如果需要 JSON 序列化
flutter pub add json_annotation
flutter pub add --dev json_serializable

引入build_runner后可以通过执行dart run build_runner build --delete-conflicting-outputs自动注解

如果遇到 invalid_annotation_target 警告,可以在 analysis_options.yaml 加:

makefile 复制代码
analyzer:  
errors:  
invalid_annotation_target: ignore

应用场景

  • DTO / Model 写法

    比如用户接口返回:

    json 复制代码
    {
      "id": "u001",
      "nickname": "Tom",
      "avatar_url": "https://xxx.com/a.png",
      "tags": ["vip", "new"]
    }

    推荐这样写:

    dart 复制代码
    import 'package:freezed_annotation/freezed_annotation.dart';
    
    part 'user_dto.freezed.dart';
    part 'user_dto.g.dart';
    
    @freezed
    abstract class UserDto with _$UserDto {
      const factory UserDto({
        required String id,
    
        @Default('') String nickname,
    
        @JsonKey(name: 'avatar_url')
        String? avatarUrl,
    
        @Default(<String>[])
        List<String> tags,
      }) = _UserDto;
    
      factory UserDto.fromJson(Map<String, Object?> json) =>
          _$UserDtoFromJson(json);
    }

    使用:

    ini 复制代码
    final user = UserDto.fromJson(json);
    
    final updated = user.copyWith(
      nickname: 'Jerry',
    );

    Freezed 会自动生成不可变字段、copyWithtoString==hashCode;如果定义了 fromJson,还会配合 json_serializable 生成序列化逻辑。

  • 页面状态初始化写法

  1. 例如类似搜索页这种有个初始页面状态的,可以这样管理

    dart 复制代码
    ///页面状态有这几样的,推荐这样管理
    ///initial:还没开始请求,或者等待用户输入  
    ///loading:正在加载  
    ///success:加载成功,有数据  
    ///failure:加载失败  
    ///empty:加载成功,但无数据
    ///用户详情页  
    ///订单详情页  
    ///房间详情页  
    ///商品详情页  
    ///搜索结果页  
    ///消息列表页  
    ///基金持仓页
    @freezed  
    sealed class UserPageState with _$UserPageState {  
    const factory UserPageState.initial() = UserPageInitial;  
    
    const factory UserPageState.loading() = UserPageLoading;  
    
    const factory UserPageState.empty() = UserPageEmpty;  
    
    const factory UserPageState.success({  
    required List<UserDto> users,  
    @Default(false) bool isRefreshing,  
    @Default(false) bool isLoadingMore,  
    @Default(false) bool hasMore,  
    }) = UserPageSuccess;  
    
    const factory UserPageState.failure({  
    required String message,  
    }) = UserPageFailure;  
    }
  2. 类似用户详情页状态,则直接用AsyncValue表示即可

    scss 复制代码
    /// provider
    final userDetailProvider = FutureProvider.family<UserDto, String>((ref, userId) async {
      final repository = ref.watch(userRepositoryProvider);
      return repository.fetchUserDetail(userId);
    });
    /// 页面
    Widget build(BuildContext context, WidgetRef ref) {  
    final userAsync = ref.watch(userDetailProvider(userId));  
    
    return switch (userAsync) {  
    AsyncLoading() => const Center(  
    child: CircularProgressIndicator(),  
    ),  
    
    AsyncError(:final error) => ErrorView(  
    message: error.toString(),  
    ),  
    
    AsyncData(:final value) => UserDetailView(  
    user: value,  
    ),  
    
    _ => const SizedBox.shrink(),  
    };  
    }
  • 默认值
less 复制代码
///不写nullable,写默认值  
@Default('') String title  
@Default(0) int count  
@Default(false) bool selected  
@Default(<ItemDto>[]) List<ItemDto> items
  • 嵌套json时需要用@JsonSerializable(explicitToJson: true)
scala 复制代码
@freezed
abstract class RoomDto with _$RoomDto {
  @JsonSerializable(explicitToJson: true)
  const factory RoomDto({
    required String id,
    required UserDto owner,
    @Default(<UserDto>[]) List<UserDto> members,
  }) = _RoomDto;

  factory RoomDto.fromJson(Map<String, Object?> json) =>
      _$RoomDtoFromJson(json);
}
相关推荐
「、皓子~1 天前
海狸IM 2.1 正式发布
flutter·微服务·golang·electron·开源软件·im·海狸im
里欧跑得慢1 天前
AI 驱动的 UI 国际化方案自动适配:从单一语言到多语言布局的智能转换
前端·css·flutter·web
恋猫de小郭1 天前
AI 时代,一个优化 Flutter 的重复代码工具 Deslop
android·前端·flutter
ljt27249606612 天前
Flutter笔记--envied
前端·笔记·flutter
加农炮手Jinx3 天前
Flutter for OpenHarmony 实战:flutter_animate 声明式动画让 UI 灵动如原生
flutter·ui·华为·harmonyos·鸿蒙
里欧跑得慢3 天前
Flutter 像素级还原:设计稿到代码的视觉无损转换技巧
前端·css·flutter·web
里欧跑得慢3 天前
Flutter 三方库 function_tree — 鸿蒙应用开发中的动态数学公式解析与计算神器,实现鸿蒙深度适配下的复杂函数逻辑运行时求值实战(适配鸿蒙 HarmonyOS Next ohos)
android·前端·安全·flutter·华为·harmonyos
明月_清风3 天前
🖥️ Electron 三进程 Host 实战:从架构设计到生产落地的完整指南
前端·electron·客户端
吃西瓜的年年3 天前
vue3原理思维导图
vue.js·笔记·flutter