【问题标题】:Flutter Bloc Equatable state with one mutual property across all states classesFlutter Bloc Equatable 状态,在所有状态类中具有一个共同属性
【发布时间】:2023-03-23 00:30:01
【问题描述】:

我正在尝试找出定义我的 Search Bloc 状态以在所有状态类中保留 text 属性(搜索键)的最佳方法。

目前,它看起来像这样:

import 'package:equatable/equatable.dart';
import 'package:project/models/searchResults.dart';

class SearchState extends Equatable {
  SearchState([List props = const []]) : super(props);
}

class SearchStateEmpty extends SearchState {
  final String text;
  SearchStateEmpty({this.text});
  @override
  String toString() => 'SearchStateEmpty';
}

class SearchStateLoading extends SearchState {
  final String text;
  SearchStateLoading({this.text});
  @override
  String toString() => 'SearchStateLoading';
}

class SearchStateSuccess extends SearchState {
  final String text;
  final List<RestaurantSearchItem> items;

  SearchStateSuccess({this.text, this.items}) : super([text, items]);

  @override
  String toString() => 'SearchStateSuccess { items: ${items.length} }';
}

class SearchStateError extends SearchState {
  final String text;
  final String error;

  SearchStateError({this.text, this.error}) : super([text, error]);

  @override
  String toString() => 'SearchStateError';
}

有没有比在所有状态类中定义 text 属性更好的方法?

如果我不必每次事件没有它时都使用currentState 属性,这不会像现在那么糟糕。例如:

SearchStateEmpty(text: currentState.text);
...
SearchStateLoading(text: event.text);
...
SearchStateSuccess(text: currentState.text, items: results.items);

我一直在寻找 Flutter 文档中的示例,但我能找到的只是我应该使用不同的 bloc 或放弃 equatable(我想保留它,因为它非常好)。

任何带有示例的建议都将受到高度赞赏。谢谢。

【问题讨论】:

    标签: flutter dart bloc


    【解决方案1】:

    我这样做的方式有点像反模式。在一些帮助下,我能够找到一种更简洁的方式来在我的状态类中使用当前状态。

    代码现在看起来像这样:

    class SearchState extends Equatable {
      final String text;
      SearchState(this.text,
          [List<RestaurantSearchItem> items = const [], String error = ''])
          : super([text, items, error]);
    }
    
    class SearchStateEmpty extends SearchState {
      SearchStateEmpty({String text})
          : super(text); // Here I want to use text from SearchState
    
      SearchStateEmpty.fromState(SearchState state) : super(state.text);
    
      @override
      String toString() => 'SearchStateEmpty';
    }
    
    class SearchStateLoading extends SearchState {
      final String text;
    
      SearchStateLoading({this.text})
          : super(text); // Here I  want to set text that comes from event
    
      @override
      String toString() => 'SearchStateLoading';
    }
    
    class SearchStateError extends SearchState {
      final String error;
    
      SearchStateError({this.error, String text}) : super(text, [], error);
      // Text comes from SearchState, error comes from event
    
      SearchStateError.fromState(SearchState state, {this.error})
          : super(state.text, [], error);
    
      @override
      String toString() => 'SearchStateError';
    }
    
    class SearchStateSuccess extends SearchState {
      final List<RestaurantSearchItem> items;
    
      SearchStateSuccess({this.items, String text}) : super(text, items, null);
    
      SearchStateSuccess.fromState(SearchState state, {this.items})
          : super(state.text, items, null);
    
      @override
      String toString() => 'SearchStateSuccess { items: ${items.length} }';
    }
    

    【讨论】:

    • 你能解释一下你所在州的入口点是什么吗?我有相同的用例,但我需要的属性来自不同的块,我订阅了它,但不确定在初始状态调用后如何实例化它?
    • 这不是最好的模式。但是,您可以在需要在不同状态之间共享相同属性的情况下使用它,而无需每次更改状态时都设置它。
    猜你喜欢
    • 2021-01-07
    • 2022-09-26
    • 2020-03-10
    • 2020-05-06
    • 2021-03-19
    • 2021-04-14
    • 2020-07-09
    • 2021-03-04
    • 2020-04-12
    相关资源
    最近更新 更多