flutter - 如何使用颤振块设置本地状态
问题描述
我有一个使用 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
,无限次。
帮助!
解决方案
names
发生这种情况是因为每次调用 BlocBuilder 的构建器时,您的状态都包含列表。
您应该替换List<String> _names = []
为LinkedHashSet<String> _names = LinkedHashSet<String>()
;
LinkedHashSet 的工作方式与列表完全相同,但不允许重复。您可以随时通过调用将其更改为列表
_names.iterator.toList();
。
推荐阅读
- r - 从 R 中的数据矩阵中获取向量范数
- c# - Button.DialogResult、Form.ShowDialog 和异步事件处理程序超出预期的执行顺序
- python - 从 HTML 中的 var 中提取字典
- python - 将“Manager”从 Flask-Script 迁移到 Flask CLI
- python-3.x - 在 Flask 中为每个请求附加 jwt 令牌
- python - Tensorflow Keras中的水印二进制分类器卡住了
- android - Android Studio 中的 Koin Libraray 问题
- excel - 我想在 excel vba 中创建 21 个表,但我得到 Argument not optional 错误
- php - Laravel 在 POST 方法中从 multipart/form-data 获取请求
- pandoc - 如何防止 pandoc 插入