expo-asset插件配置后资源无法加载,求图片预加载解决方案
解决expo-asset预加载背景图黑屏问题
先修正配置语法错误
你在app.json里的expo-asset配置存在语法问题:"assets:"多了个冒号,正确写法是"assets",修正后的配置如下:
"plugins": [ "expo-router", [ "expo-asset", { "assets": ["./assets/images/authBackground.jpg"] } ] ],
正确使用预加载后的图片
直接将Image的source设为字符串"authBackground"是错误用法,expo-asset不会自动映射文件名。正确流程如下:
- 导入expo-asset模块:
import { Asset } from 'expo-asset';
- 在组件挂载阶段预加载资源:
useEffect(() => { async function preloadImage() { const imageAsset = Asset.fromModule(require('../../assets/images/authBackground.jpg')); await imageAsset.downloadAsync(); } preloadImage(); }, []);
- 保持
Image组件的source写法不变:
<Image source={require("../../assets/images/authBackground.jpg")} contentFit='cover' className='absolute w-full h-full -z-20' />
这样图片会在组件初始化时提前下载,避免加载时的黑屏闪烁。
替代方案:利用expo-image缓存策略
如果觉得expo-asset配置繁琐,可以直接给expo-image添加缓存策略,让图片优先读取缓存:
<Image source={require("../../assets/images/authBackground.jpg")} contentFit='cover' className='absolute w-full h-full -z-20' cachePolicy='memory-disk' />
memory-disk策略会将图片缓存到内存和磁盘,二次加载时直接读取缓存,消除闪烁问题。
另一种替代方案:启动时全局预加载
如果应用有多个需要预加载的资源,可在根组件启动时统一处理,结合启动屏避免空白:
import { Asset } from 'expo-asset'; import { useState, useEffect } from 'react'; import { SplashScreen } from 'expo-splash-screen'; // 阻止启动屏自动隐藏 SplashScreen.preventAutoHideAsync(); export default function RootLayout() { const [assetsReady, setAssetsReady] = useState(false); useEffect(() => { async function loadAllAssets() { const targetAssets = [ require('../../assets/images/authBackground.jpg'), // 可添加其他需要预加载的资源 ]; const loadPromises = targetAssets.map(item => Asset.fromModule(item).downloadAsync()); await Promise.all(loadPromises); setAssetsReady(true); await SplashScreen.hideAsync(); } loadAllAssets(); }, []); if (!assetsReady) { return null; // 或自定义加载占位组件 } return ( // 应用页面内容 ); }
这种方式会在应用启动阶段完成背景图预加载,进入目标页面时直接显示,彻底解决闪烁问题。
内容的提问来源于stack exchange,提问作者Tavis Gritton
相关产品推荐
相关产品推荐

