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

Flutter中如何在runApp执行前加载JSON并解决main无context问题

解决方法

main函数执行时Flutter组件树还未初始化,不存在可用的BuildContext,你可以用Flutter提供的全局rootBundle对象加载assets,不需要依赖context,调整方案如下:

1. 修改LoadLanguage函数

去掉BuildContext参数,改用rootBundle加载JSON文件:

import 'dart:convert';
import 'package:flutter/services.dart';

// 你原有定义的全局语言数据变量
dynamic LanguageData;

Future<void> LoadLanguage(String lng) async {
  String data = await rootBundle.loadString("assets/translations/$lng.json");
  LanguageData = jsonDecode(data);
}

2. 改造main函数为异步,加载完成后再启动应用

注意必须先调用WidgetsFlutterBinding.ensureInitialized()初始化Flutter运行环境,否则异步操作会报错:

import 'package:flutter/material.dart';

void main() async {
  // 初始化Flutter运行绑定,确保异步功能可用
  WidgetsFlutterBinding.ensureInitialized();
  
  // 等待语言资源加载完成,替换为你实际需要加载的语言编码
  await LoadLanguage("zh");
  
  // 资源加载完成后再启动应用
  runApp(const MyApp());
}

// 你的原有应用代码
class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      // 你的应用配置
      home: const HomePage(),
    );
  }
}

可选兼容方案

如果你后续在页面等有context的场景需要重新加载语言,可以保留原有带context的重载版本,两个版本可共存:

Future<void> LoadLanguageWithContext(BuildContext context, String lng) async {
  String data = await DefaultAssetBundle.of(context).loadString("assets/translations/$lng.json");
  LanguageData = jsonDecode(data);
}

注意:请确保你已经在pubspec.yaml中正确声明了翻译资源的路径,示例配置:

flutter:
  assets:
    - assets/translations/

内容的提问来源于stack exchange,提问作者Mozhgan Javadzadeh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 14:15:03