0

如何获取我的代码(使用 Freezed 的颤振)来使用“copyWith”冻结功能来更新状态?

冻结类:

import 'package:flutter/foundation.dart';
import 'package:freezed_annotation/freezed_annotation.dart';

part 'todo_list.freezed.dart';
part 'todo_list.g.dart';

@freezed 
class TodoList with _$TodoList {
  const TodoList._();
  factory TodoList({ required List<String> titles }) = _TodoList;
  factory TodoList.loading() = Loading;
  factory TodoList.error([String? message]) = ErrorDetails;

  factory TodoList.fromJson(Map<String, dynamic> json) => _$TodoListFromJson(json);

}

状态通知器

import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:gc_todo/presentation/state/todo_list.dart';
import 'dart:developer' as developer;

final todoListProvider = StateNotifierProvider((ref) => TodoListNotifier());

class TodoListNotifier extends StateNotifier<TodoList> {
  TodoListNotifier() : super( TodoList(titles: ["first", "second"]) );

  void addTodoList(String newTitle) {
    developer.log("addTodoList - $state");
    if (state is List<String>) (List<String> stateToUse) {
      stateToUse.copyWith();  // STILL DOES NOT RECOGNISE "copyWith"
    };
  }

}

在此处输入图像描述

4

1 回答 1

1

Freezed 对联合类型的每个变体使用包装器类型,在本例中为TodoList. 该类型的“列表”变体并不List<String>像您所假设的那样。

此外,copyWith仅适用于所有联合变体中定义的属性,在您的情况下没有。

您应该使用when该类型的所有变体“模式匹配”,或maybeWhen仅匹配子集。

这应该适用于您的情况:

class TodoListNotifier extends StateNotifier<TodoList> {
  TodoListNotifier() : super( TodoList(titles: ["first", "second"]) );

  void addTodoList(String newTitle) {
    developer.log("addTodoList - $state");
    state.maybeWhen(
        (items) => setState(TodoList(titles: [...items, newTitle]),
        orElse: () { /* TODO */ }
    );
  }

}
于 2021-10-31T10:08:03.463 回答