如何使用颤振块设置本地状态

时间:2021-07-26 14:13:36

标签: flutter bloc flutter-bloc

我有一个 Flutter 应用,它使用 Bloc 模式进行状态管理。

我在存储状态的页面中有一个局部变量。

PageA:

// Outside build function 
List<String> _names = []; // local variable to show the changes visually
.
.
.
// Inside build function
return Scaffold(
 body: BlocConsumer<PageABloc, PageAState>(
        builder: (context, state) {
          if (state is PageASuccessState) { 
            _names = state.names;                              // here is problem
            return _body();
          } else if (state is PageALoadingState ||
              state is PageAInitState) {
            return Center(child: CircularProgressIndicator());
          } else
            return Center(child: Text("Something went wrong"));
        },
        listener: (context, state) {},
      ),
);

用户点击state.names中的保存按钮时,我只需要更新_body()的状态,但要显示视觉效果对用户的更改,我使用的是 _names 局部变量。

如何将state.names的初始值加载到_names

我尝试的代码不起作用,因为它会在每一帧上将任何更改重置为 _names(local)。

我试过类似的东西,

if (state is PageASuccessState) { 
            final List<String> _n = state.names;
            _names.addAll(_n);
            return _body(_width);
   } 

但这只是将 state.names 重复添加到 _names,无限次。

帮助!

1 个答案:

答案 0 :(得分:0)

发生这种情况是因为每次调用 BlocBuilder 的构建器时,您的状态都包含 names 列表。

您应该将 List<String> _names = [] 替换为 LinkedHashSet<String> _names = LinkedHashSet<String>();

LinkedHashSet 的工作方式与 list 完全一样,但不允许重复。您可以通过调用将其更改为列表 _names.iterator.toList(); 随时随地。