ListView.builder 在iOS的设备上重复一直渲染

143 阅读3分钟

ScreenUtilInit 是 flutter_screenutil 插件的一部分,它提供了一种简单的方式来使得应用程序在不同屏幕尺寸上都有一致的体验。然而,rebuildFactor 回调函数是用来确定在设备配置(如设备方向或屏幕尺寸)发生变化时是否需要重建Widget的。

我目前的配置中将 rebuildFactor 设置为:

rebuildFactor: (old, data) => true,

这意味着每次设备配置发生变化时,ScreenUtilInit 的 builder 方法都会重建其子 Widget,无论变化是否显著。

在iOS上,滚动ListView.builder可能会造成微小的尺寸变化(可能是因为状态栏、导航栏的显隐等原因),所以如果你在ListView.builder的构建中依赖了 ScreenUtil 的尺寸调整,那么这可能会导致整个ListView.builder频繁重建。

为了解决这个问题,你可以尝试两种方法:

  1. 更新 rebuildFactor 以避免非必要重建

只有在旧的 ScreenUtil 数据和新数据之间存在显著差异时才重建 Widget。 为了确定在哪些条件下需要重建,你可以比较MediaQueryDatasizedevicePixelRatiotextScaleFactor,或orientation等属性。这里是一个更新后的示例,我们将比较sizeorientation属性来确定是否需要重建:

rebuildFactor: (oldMediaQueryData, newMediaQueryData) {
  // 检查屏幕方向是否已更改
  bool orientationChanged = oldMediaQueryData.orientation != newMediaQueryData.orientation;
  // 检查屏幕尺寸是否有重大变化
  bool sizeChanged = oldMediaQueryData.size != newMediaQueryData.size;
  
  // 当屏幕方向或尺寸变化时才重建
  return orientationChanged || sizeChanged;
},

MediaQueryData中的size是一个Size对象,其中包含了屏幕宽度和高度的信息。比较旧的和新的size可以告诉你屏幕尺寸是否有变化。

如果移除或优化rebuildFactor没有解决问题,那么问题可能与ScreenUtilInit没有直接关联,而可能是其他状态更新或应用逻辑导致了额外的重建。在这种情况下,你需要审查相关的GetX控制器或其他涉及状态更新的部分,以确保这些更新仅在必要时才发生。

  1. 移除 rebuildFactor

如果你发现rebuildFactor没有实际的用途,你可以直接移除它,并让ScreenUtilInit在初始化时设置一次尺寸。

通过对rebuildFactor进行精确的控制,或者通过移除它,可以避免在iOS设备上由于微小设备配置变化导致的ListView.builder的频繁重建。

请注意,ScreenUtilInit的这些设置可能会影响应用程序中其他依赖ScreenUtil的地方。在进行更改时,请确保这些更改不会影响您期望的屏幕适配行为。您可能需要在不同的屏幕尺寸和设备方向上测试您的应用程序,以确保屏幕适配效果依然符合设计要求。

综上所述,移除或者优化rebuildFactor回调的目的是减少不必要的重建,让ScreenUtil只在设备配置发生重大变化时才重新设置尺寸,这样可以提高性能,尤其是在有大量动态列表项目的场景中。