Flutter 具有刷新指示器重建两次的Flatter bloc streambuilder 小部件构建(构建上下文){ final blocData=WeatherBlocProvider.of(context).bloc; if(WeatherBloc.permission==true){ blocData.forceRefreshAll(); 返回容器( 孩子:StreamBuilder( 流:blocData.zipAll, 生成器:(scontext,快照){ //做 }

Flutter 具有刷新指示器重建两次的Flatter bloc streambuilder 小部件构建(构建上下文){ final blocData=WeatherBlocProvider.of(context).bloc; if(WeatherBloc.permission==true){ blocData.forceRefreshAll(); 返回容器( 孩子:StreamBuilder( 流:blocData.zipAll, 生成器:(scontext,快照){ //做 },flutter,Flutter,现在,我正在使用streambuilder的bloc模式 当我刷新父窗口小部件时,我可以看到blocData.forceRefreshAll()这一行被请求了两次。(我的意思是生成方法被请求了两次)我如何只生成一行? 我看到了不需要的重建主题,他们说使用instance或initstate,但对于bloc模式,我认为使用initstate是不可能的,const value不起作用 blocData.forceRefreshAll() 如果您无法在initState中访问bloc,因为没有cont

现在,我正在使用streambuilder的bloc模式 当我刷新父窗口小部件时,我可以看到
blocData.forceRefreshAll()
这一行被请求了两次。(我的意思是生成方法被请求了两次)我如何只生成一行? 我看到了
不需要的重建主题
,他们说使用instance或initstate,但对于bloc模式,我认为使用initstate是不可能的,const value不起作用
blocData.forceRefreshAll()

如果您无法在
initState
中访问bloc,因为没有
context
但是-重写另一个方法,
didChangeDependencies
。它在
initState
之后调用,并且可以使用
context
,因此您可以使用它访问bloc提供程序。

build
方法用于构建小部件树,它由于各种原因可以多次调用。这就是为什么不应在
生成中获取数据的原因


如果您无法在
initState
中访问bloc,因为没有
context
但是-覆盖另一个方法,
didChangeDependencies
。它在
initState
之后调用,可以使用
context
,因此您可以使用它访问bloc提供程序。

谢谢您的快速回答,但当我刷新didchagedependencie时s也被称为twiceyes,它也可以被多次调用,因此,如果您想确保方法一旦被调用,您可以创建一些标志(
bool isdatarequest
)只有在未设置标志的情况下才能获取数据。谢谢,我想我解决了这个问题,我可以问一下为什么refreshindicator会工作两次吗?很难说有一小部分代码,所以答案是抽象的。之所以会这样,是因为小部件树和框架中的某些更改决定重建它。StreamBuilder也会在第一次启动时导致这种行为没有数据,然后它会从流中捕获数据感谢您的快速回答,但当我刷新didchagedependencies时,它也被称为twiceyes,它也可以被多次调用,因此如果您想确保方法被调用一次,您可以创建一些标志(
bool isDataRequested
)只有在未设置标志的情况下才能获取数据。谢谢,我想我解决了这个问题,我可以问一下为什么refreshindicator会工作两次吗?很难说有一小部分代码,所以答案是抽象的。之所以会这样,是因为小部件树和框架中的某些更改决定重建它。StreamBuilder也会在第一次启动时导致这种行为没有数据,然后它从流中捕获数据