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

如何解决flutter_screenutil与Monarch配合使用时的初始化报错问题?

修复Monarch中flutter_screenutil初始化失败的问题

问题根源

Monarch的独立预览环境不会自动继承Flutter项目中flutter_screenutil的全局初始化配置,导致_minTextApdapt等核心字段未初始化,进而使14.sp、ScreenUtil().setSp(14)无法正常工作。

具体修复方案


1. 在Story入口包裹ScreenUtilInit

直接在你定义的story widget外层添加ScreenUtilInit,确保所有依赖flutter_screenutil的组件都在其上下文范围内:

Widget paid() => ScreenUtilInit(
      // 替换为你的设计稿基准尺寸
      designSize: const Size(375, 812),
      minTextAdapt: true,
      builder: (context, child) => HistoryItem(Paid(
            orderDate: '2023-11-10',
            subscriptionType: 1,
            orderId: '3YMU5SCEP57H',
            orderPrice: 10000,
            orderProduct: 'Vitamin C')),
    );

2. 全局初始化(适用于多个story)

如果你的项目有多个story需要使用flutter_screenutil,可以在Monarch的全局入口文件(如monarch_stories.dart)中统一初始化:

void main() {
  // 确保获取屏幕尺寸
  ScreenUtil.ensureScreenSize();
  runApp(ScreenUtilInit(
    designSize: const Size(375, 812),
    minTextAdapt: true,
    builder: (context, child) => const MaterialApp(
      home: Scaffold(body: YourStoryContainer()),
    ),
  ));
}

3. 组件内手动初始化(应急方案)

如果上述方法不适用,可在依赖flutter_screenutil的组件内部手动初始化:

class Paid extends StatefulWidget {
  // ... 你的字段定义

  @override
  State<Paid> createState() => _PaidState();
}

class _PaidState extends State<Paid> {
  @override
  void initState() {
    super.initState();
    // 初始化ScreenUtil
    WidgetsBinding.instance.addPostFrameCallback((_) {
      ScreenUtil.init(context, designSize: const Size(375, 812), minTextAdapt: true);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Text(
      widget.orderProduct,
      style: TextStyle(fontSize: ScreenUtil().setSp(14)),
    );
  }
}

关键注意事项

  • 必须保证所有使用sp扩展或ScreenUtil方法的组件,都处于ScreenUtilInit的上下文子树中。
  • designSize要和你项目中使用的基准设计尺寸保持一致,避免适配比例出错。

内容的提问来源于stack exchange,提问作者c-an

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 19:22:54