如何防止集体处置? 我希望何时何地处置它?
当状态没有变化,但是该状态自带的值,比如列表,当它变化的时候,ui并没有注意到该值随着状态的变化。必须更改状态以便用户界面能够理解。我该如何处理这个问题?
Bloc(业务逻辑组件)包(例如 Flutter 中的 flutter_bloc 和 bloc)为您提供了一种控制应用程序状态并通知 UI 更改的方法。使用 Bloc 的小部件的生命周期和范围决定了它是否应该被丢弃。
以下是处置 Bloc 的一些注意事项:
作用域为 Widget 的生命周期:如果您希望在从 Widget 树中删除 Widget 时(例如,当在导航堆栈中弹出页面时)删除 Bloc,则通常应该使用 flutter_bloc 包中的 BlocProvider 或 BlocListener )。当小部件从小部件树中删除时,这些小部件会自动处理 Bloc 的处理。
BlocProvider(
create: (context) => DesiredBloc(),
child: DesiredWidget(),
)
全局范围:如果 Bloc 需要在应用程序的生命周期内持续存在,您可能不想删除它。在这种情况下,您可以在应用程序中更高级别(例如在主函数中)处理 Bloc,并在应用程序使用期间保持其活动状态。
手动处置:在小部件的丢弃方法中,如果您需要更精确地控制何时处置 Bloc,则可以手动处置 Bloc。例如:
class YourWidget extends StatefulWidget {
@override
_YourWidgetState createState() => _YourWidgetState();
}
class _YourWidgetState extends State<YourWidget> {
final YourBloc _yourBloc = YourBloc();
@override
void dispose() {
_yourBloc.close();
super.dispose();
}
@override
Widget build(BuildContext context) {
return BlocProvider(
create: (context) => _yourBloc,
child: YourChildWidget(),
);
}
}
关于第二个查询,您可以通过使用 Equatable 或类似方法来解决此问题,以确保当值发生变化时,即使状态本身没有变化,也会以不同的方式处理状态对象。
使用 Equatable:您可以覆盖状态类中的 props 函数,通过扩展 Equatable 来比较状态内的值。这样,因为当值改变时,状态对象被视为不同,因此会导致 UI 更新。
class YourState extends Equatable {
final List<int> data;
YourState(this.data);
@override
List<Object?> get props => [data];
}
克隆状态:在某些情况下,可能需要克隆状态才能强制 UI 更新。例如:
void updateData(List<int> newData) {
final currentState = state;
final newState = YourState([...currentState.data, ...newData]);
emit(newState);
}
即使状态对象引用保持不变,您也可以通过使用修改后的值创建新的状态对象并发出它来导致 UI 更新。
请记住,Flutter 框架是为了在状态保持静态时更有效地渲染页面,因此应谨慎执行强制更新,以防止不必要的 UI 重新渲染。