flutter - 如何在状态更改时更新 BlocBuilder 之外的 SliverAppBar 小部件?
问题描述
我正在尝试更新SliverAppBar小部件关于BlocState更改的数据。由于 SliverAppBar 不是 BlocBuilder 的一部分,因此它不会在状态更改时更新。从块中调用 setState() 会导致以下错误。
这个 HomePage 小部件不能被标记为需要构建,因为框架已经在构建小部件的过程中。仅当其祖先之一当前正在构建时,小部件才能在构建阶段标记为需要构建。这个例外是允许的,因为框架在子组件之前构建父窗口小部件,这意味着将始终构建脏后代。否则,框架可能不会在此构建阶段访问此小部件。RenderViewport 需要 RenderSliver 类型的子级,但接收到 RenderErrorBox 类型的子级。
这是我的代码...
class HomePageState extends State<HomePage> {
int items = 121;
@override
Widget build(BuildContext context) {
return Material(
child: Scaffold(
backgroundColor: Colors.white,
body: CustomScrollView(
slivers: [setAppBar(), setContent()],
),
),
);
}
setAppBar() {
return SliverAppBar(
automaticallyImplyLeading: false,
floating: true,
elevation: 1.0,
forceElevated: true,
centerTitle: false,
backgroundColor: Colors.white,
title: Text("$items"));
}
setContent(){
return BlocBuilder<MyBloc, MyState>(
builder: (context, state) {
if (state is DataLoadedState) {
return SliverFillViewport(
delegate:
SliverChildBuilderDelegate((BuildContext context, int index) {
items = state.items;
///
/// **Want to update my items in the SliverAppBar from here ...**
///
return MyWidget();
}, childCount: 1),
);
}
}
如何将我的更改发布到 BlockBuilder 范围之外的小部件?
解决方案
我想到了。解决方案是使用BlocConsumer代替BlocBuilder。我在BlocConsumer中实现了BlocListener和BlocBuilder。
setContent(){
return BlocConsumer<HealthHomeBloc, HealthHomeState>(
buildWhen: (previous, current) {
return !(current is ItemUpdateState);
}, builder: (context, state) {
return ReuiredWidgetBasedOnState();
}, listener: (context, state) {
if(state is ItemUpdateState)
setState(){
items = state.items;
}
}, listenWhen: (previous, current) {
return current is ItemUpdateState;
});
}
所以当我们以这种方式调用 setState 时,它不会干扰构建器的状态。BlocListener 可以将我们需要的状态发布到 BlocBuilder 之外的小部件
推荐阅读
- java - 在 Runnable 之外时,LinearLayout.getwidth 为零
- assembly - 组装新手。如何计算传递的参数中的字符数?
- nginx - nginx 将 url 的中间重写为另一个模式
- node.js - 使用 request-promise 发出请求后无法记录响应和 json
- javascript - 外部单击以重置颜色?
- html - 如何水平对齐元素?
- jquery - FlipClock JS:从特定日期开始个性化倒计时
- python-3.x - 未应用 Seaborn 样式
- html - 为什么我的数据库结果显示错误
- c++ - Rapidjson::Type 的开关盒