Flutter资源图片预加载失败:当前Context为空问题求助
Flutter图片预加载时Context为空的解决办法
问题根源
你在runApp(const MyApp())执行前调用了preloadImages(),此时GetMaterialApp还未完成构建,navigatorKey还未与导航器绑定,自然获取不到有效的BuildContext。
方案一:不依赖Context,用ImageConfiguration预加载
precacheImage支持通过ImageConfiguration参数完成预加载,无需依赖BuildContext。修改preloadImages函数如下:
Future<void> preloadImages() async { final config = ImageConfiguration.empty; for (String asset in allAsset) { await precacheImage(AssetImage(asset), null, configuration: config); } print("所有图片预加载完成"); }
修改后可以直接在原main函数流程中调用,不需要等待Context初始化。
方案二:应用初始化完成后执行预加载
如果需要依赖Context(比如适配设备像素比等场景),可以在runApp之后,等待第一帧绘制完成再执行预加载:
void main() async { WidgetsBinding widgetsBinding = WidgetsFlutterBinding.ensureInitialized(); FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding); // 先启动应用 runApp(const MyApp()); // 等待第一帧绘制完成后执行预加载 WidgetsBinding.instance.addPostFrameCallback((_) async { await preloadImages(); FlutterNativeSplash.remove(); }); }
同时保留原preloadImages函数即可,此时navigatorKey已绑定导航器,能正常获取Context:
Future<void> preloadImages() async { BuildContext? context = navigatorKey.currentContext; if (context != null) { for (String asset in allAsset) { await precacheImage(AssetImage(asset), context); } print("所有图片预加载完成"); } else { print("获取Context失败,无法预加载图片"); } }
也可以选择在初始页面(如WelcomePage/HomePage)的initState中执行预加载逻辑,效果一致。
内容的提问来源于stack exchange,提问作者Mona
相关产品推荐
相关产品推荐

