在 Flutter 中解压 Option<Either<T,T>>

Posted

技术标签:

【中文标题】在 Flutter 中解压 Option<Either<T,T>>【英文标题】:Getting Option<Either<T,T>> unpacked in Flutter 【发布时间】:2020-08-12 03:28:47 【问题描述】:

在我的集团州,我有这个:

Option<Either<T, Stream<T>>> optionFailureOrStream,

它可以是空的 (Option),也可以是 errorstream

在我的bloc 中,我使用optionOf 产生了这个,如下所示:

 yield state.copyWith(optionFailureOrStream: optionOf(failureOrStream));

现在在我的小部件中,我想知道它是否有值,如果它有值,我想将它们折叠以返回两个不同的屏幕:

 if (state.optionFailureOrStream.isSome()) 
    final optionFailureOrStream = state.optionFailureOrStream;

    optionFailureOrStream.map((a) => a.fold(
        (failure) => FailureWidget(failure: failure),
        (stream) => buildSaved(stream, context)));

但不知何故,我无法摆脱Option&lt;T&gt; 类型。它抱怨错误的类型。

The return type 'Option<Widget>' isn't a 'Widget', as required by the closure's context.dart(return_of_invalid_type_from_closure)

我认为有一种非常简单的方法可以做到这一点。我很难找到任何与 dart/flutter 相关的手册,如果您不熟悉这些概念,dartz 的源代码并不是很容易解释。

【问题讨论】:

【参考方案1】:
Widget func() 
  Option<Either<String, Stream<String>>>//I assume your failure is a string for example
      optionFailureOrStream; 
  return optionFailureOrStream.fold(
    () => Container(),//if none()
    (Either<String, Stream<String>> either)//if some(Either<String,Stream<String>>) 
    => either.fold(
      (String failure) => Container(),
      (Stream<String> stream) => Container(),
    ),
  );

注意:此代码仅用于演示(如果不清楚),如您所见,我什至没有初始化变量,但代码只是为了演示如何在不使用 if 语句的情况下从选项返回值

【讨论】:

以上是关于在 Flutter 中解压 Option<Either<T,T>>的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 获取 Object 属性名称

select option 中的注意点

js 怎么动态设置 option 的selected 选项

如何在 Flutter 中获取 Future<List> 项的某个数据索引?

Flutter环境搭配

Flutter json.decode 问题 <!doctype html> 错误