You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中结合ThemeData使用Screen Utils报错问题咨询

解决Screen Utils在ThemeData中使用时的LateInitializationError问题

核心原因

Screen Utils的内部状态(如_minTextAdapt字段)尚未完成初始化,就被ThemeData提前调用,触发未初始化错误。

解决方案

  1. 优先完成Screen Utils初始化
    不要直接在ThemeData的全局定义中调用Screen Utils方法,先在main函数或根组件中完成初始化,再构建ThemeData:

    void main() async {
      WidgetsFlutterBinding.ensureInitialized();
      // 先初始化Screen Utils
      await ScreenUtil.ensureScreenSize();
      runApp(const MyApp());
    }
    
    class MyApp extends StatelessWidget {
      const MyApp({super.key});
    
      @override
      Widget build(BuildContext context) {
        // 此时Screen Utils已完成初始化,可安全使用
        final appTheme = ThemeData(
          textTheme: TextTheme(
            bodyLarge: TextStyle(fontSize: ScreenUtil().setSp(16)),
          ),
        );
        return ScreenUtilInit(
          designSize: const Size(375, 812),
          builder: (context, child) {
            return MaterialApp(
              theme: appTheme,
              home: const HomePage(),
            );
          },
        );
      }
    }
    
  2. 在ScreenUtilInit的builder内构建ThemeData
    若需在ThemeData中使用Screen Utils的动态计算值,将ThemeData的创建逻辑放到ScreenUtilInit的builder回调中,确保此时工具已完成初始化:

    class MyApp extends StatelessWidget {
      const MyApp({super.key});
    
      @override
      Widget build(BuildContext context) {
        return ScreenUtilInit(
          designSize: const Size(375, 812),
          builder: (context, child) {
            // 这里可安全访问Screen Utils的所有方法
            final appTheme = ThemeData(
              textTheme: TextTheme(
                bodyLarge: TextStyle(fontSize: ScreenUtil().setSp(16)),
              ),
            );
            return MaterialApp(
              theme: appTheme,
              home: const HomePage(),
            );
          },
        );
      }
    }
    
  3. 避免全局静态变量定义依赖Screen Utils的ThemeData
    不要将ThemeData定义为全局静态变量——静态变量会在Screen Utils初始化前就被实例化,必然触发未初始化错误。将ThemeData的创建放在组件build方法或ScreenUtilInit的builder内部。

额外提示

如果使用的是flutter_screenutil最新版本,确认已正确配置ScreenUtilInit的designSize参数,且未在初始化完成前调用其内部方法。

内容的提问来源于stack exchange,提问作者Hadi Khan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 19:42:04