首页 > 解决方案 > 如何使用颤振块设置本地状态

问题描述

我有一个使用 Bloc 模式进行状态管理的 Flutter 应用程序。

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

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

如何加载 to 的初始state.names_names

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

我尝试过类似的东西,

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

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

帮助!

标签: flutterblocflutter-bloc

解决方案


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

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

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


推荐阅读