Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 发射新状态时不重建立方体_Flutter_Dart_Bloc_Flutter Bloc - Fatal编程技术网

Flutter 发射新状态时不重建立方体

Flutter 发射新状态时不重建立方体,flutter,dart,bloc,flutter-bloc,Flutter,Dart,Bloc,Flutter Bloc,无论何时调用toggleLocked事件,BlocBuilder都不会重建小部件 我在互联网上查阅了很多资料,发现了以下解释: 我认为在某个地方我错误地使用了equalable包,这导致BlocBuilder认为什么都没有改变(而is已经改变) 我已经阅读了Bloc Library的FAQ,提供的三个解决方案(Equalable的道具/不重用相同的状态/使用fromList)似乎无法解决问题 我的肘: class LockCubit扩展了Cubit{ LockCubit({@required t

无论何时调用toggleLocked事件,BlocBuilder都不会重建小部件

我在互联网上查阅了很多资料,发现了以下解释: 我认为在某个地方我错误地使用了equalable包,这导致BlocBuilder认为什么都没有改变(而is已经改变)

我已经阅读了Bloc Library的FAQ,提供的三个解决方案(Equalable的道具/不重用相同的状态/使用fromList)似乎无法解决问题

我的肘:

class LockCubit扩展了Cubit{
LockCubit({@required this.repository})
:assert(repository!=null),
super(LockInitial());
最终锁定存储库;
Future fetch()异步{
试一试{
final locks=await repository.fetchLocks();
emit(LocksDisplayed().copyWith(locks));
}例外{
发射(LockError());
}
}
未来切换锁定(int id)异步{
试一试{
最终锁定=等待存储库。切换锁定(id);
emit(LocksDisplayed().copyWith(List.from(locks)));
}例外{
发射(LockError());
}
}
}
我国:

抽象类LockState扩展了equalable{
常量LockState();
@凌驾
列表获取道具=>[];
}
类LockInitial扩展了LockState{
@凌驾
字符串toString()=>“LocksUninitialized”;
}
类LockError扩展了LockState{
@凌驾
字符串toString()=>“锁定错误”;
}
类LocksDisplayed扩展了LockState{
最终列表锁;
显示常量锁([this.locks=const[]);
LocksDisplayed copyWith(locks)=>LocksDisplayed(locks??this.locks);
@凌驾
列表获取道具=>[locks];
@凌驾
字符串toString()=>'LocksDisplayed{locks:$locks}';
}
我的模型:

类锁扩展了equalable{
锁({this.id,this.name,this.locked,this.displated});
最终int id;
最后的字符串名;
最终布尔锁定;
显示最终bool;
@凌驾
字符串toString()=>
'Lock{id:$id name:$name locked:$locked displated:$displated}';
锁定copyWith({id,name,locked,displated})=>Lock(
id:id??这个,
name:name??this.name,
锁定:锁定??这个。锁定,
显示:显示??本次显示);
@凌驾
列表获取道具=>[id、名称、锁定、显示];
}
我的休息时间:

类锁存储{
列表锁=[];
Future fetchLocks()异步{
//这是一个临时实现
//将来应该从提供者获取数据
锁=[
新锁(
id:0,
名称:'Voordeur',
锁定:错误,
),
新锁(
id:1,
名称:'Achterdeur',
锁定:错误,
)
];
回程锁;
}
未来切换锁定(int id)异步{
//这是一个临时实现
//将来,应请求更改锁,然后检索并编辑特定锁。
locks[id]=locks[id].copyWith(已锁定:!locks[id].locked);
回程锁;
}
}
我正在使用以下触发器更改状态:

context.read().toggleLocked(focusedIndex);
我正在使用BlocBuilder这样构建国家:

BlocBuilder(生成器:(上下文,状态){
打印(“状态更改”);
如果(状态为初始锁定){
返回文本('lockInitial');
}
如果(状态为锁定显示){
回程滑水器(
itemBuilder:(构建上下文,int索引){
返回列(
儿童:[
文本(state.locks[index].name),
文本(state.locks[index].locked.toString())
],
);
},
onIndexChanged:onIndexChanged,
循环:对,
itemCount:state.locks.length);
}
如果(状态为LockError){
返回文本('lockError');
}
返回容器();
});

非常感谢您的帮助。

如果这能奏效,我有点困惑。但是对于一个集团,你会使用一个事件而不是一个立方体(即使事件是基于立方体的)

所以首先我会使用标准模式: 状态 事件 带有mapEventToState的bloc

那个么,我在你们的代码中也并没有看到什么,若你们切换你们的锁,它在伪代码中会是这样的

if(事件为toggleLock){
屈服锁定过程();
切换锁();
显示产量锁;
}

这样,您的状态总是从LocksDisplay变为lockInProgress变为locksDisplayed-正如您在上面的链接中所读到的那样,您可以检查BlocProvider吗?我也有同样的问题。如果此bloc位于materialApp内,则必须在小部件中传递BlocProvider.value not create。

感谢您的回复@w461。根据官方集团图书馆的建议,我使用的是一个立方体而不是一个集团。一立方英尺是一个集团的精简版。排放量是一立方英尺产量的等分。正在进行的加载是一个解决方案,但在我的用例中,它并没有真正意义,因为访问数据是即时的。我知道,我还没有使用cubits,因此我不确定是否可以使用blocbuilder。无论如何,您需要在这两者之间发出另一种状态,不管您的数据是同步还是异步的。在两者之间必须有另一个状态。我必须自己学习:)你确定
repository.toggleLocked(id)正在等待?用这个方法打印一些东西。Equalatable不能成为您的问题的原因,因为它只在集团中使用,而不是在cubit中使用。检查一下sources@IlyaMaximencko谢谢你的回复。我确信
repository.toggleLocked(id)正在等待。我应该补充一点,如果我不使用equatable扩展我的状态,它将按预期工作。然而,为了将来的测试目的,我想扩展equalable。你可能有一个关于立方和等距的链接吗?谢谢!你为我节省了很多调试时间。