如何在主方法 Flutter 中加载 json?

Posted

技术标签:

【中文标题】如何在主方法 Flutter 中加载 json?【英文标题】:How to load json in main method Flutter? 【发布时间】:2021-09-28 08:30:18 【问题描述】:

我正在尝试将 json 文件加载到我的 main() 应用程序方法中。 你能告诉我这是否可能吗?我试过 File 和 rootBundle 但似乎 Assets 的文件夹还没有准备好。

这是我的代码:

资产

  assets:
    - assets/settings/settings.json

主要方法

void main() async 
    final file = await rootBundle.loadString('assets/settings/settings.json');
      final data = jsonDecode(file);
      Settings settings = Get.put(Settings.fromJson(data), permanent: true);
  runApp(MyApp());

【问题讨论】:

您能提供更多信息吗?例如,您的 pubspec.yaml 文件。你有任何错误吗?当您尝试打印变量“数据”时,输出是什么? 我更喜欢在 MyApp() initState 中进行操作 * 我正在使用 getx 包创建实例 pub.dev/packages/get * 我遇到的错误是“对空值使用空检查运算符”,这在执行 rootBundle 时发生。我要做的是在整个应用程序启动之前加载我的 settings.json,例如 NetCore load appsettings.json 【参考方案1】:

使用 FutureBuilder 找到解决方案

class MyApp extends StatefulWidget 
  @override
  _MyAppState createState() => _MyAppState();


class _MyAppState extends State<MyApp> 


  _load() async 
    final file = await rootBundle.loadString('assets/j.json');
    final data = await jsonDecode(file);
    print(data.toString());
  

  @override
  Widget build(BuildContext context) 
    return FutureBuilder(
        future: _load(),
        builder: (_, AsyncSnapshot<dynamic> snapshot) 
          return !snapshot.hasData
              ? Container(
                  color: Colors.white,
                  child: Center(
                      child: Container(
                    child: CircularProgressIndicator(),
                    width: 20,
                    height: 20,
                  )),
                )
              : MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        appBarTheme: AppBarTheme(
          titleTextStyle: Theme.of(context).textTheme.headline1,
        ),
      ),
      home: Scaffold(
        body: Text("Body"),

        // MaxWidthButton(),
      ),
    );
        );
  

【讨论】:

抱歉,我尝试了 initState 但它不起作用,我尝试在 FutureBuilder 中调用我的方法,而不是加载我的 initState 方法,并且效果很好。【参考方案2】:

我好像不是,而是尝试MyApp 并使其成为statefullWidget


class MyApp extends StatefulWidget 
  @override
  _MyAppState createState() => _MyAppState();


class _MyAppState extends State<MyApp> 
  @override
  void initState() 
    super.initState();
    _load();
  

  _load() async 
    final file = await rootBundle.loadString('assets/j.json');
    final data = await jsonDecode(file);
    print(data.toString());
  

  @override
  Widget build(BuildContext context) 
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        appBarTheme: AppBarTheme(
          titleTextStyle: Theme.of(context).textTheme.headline1,
        ),
      ),
      home: Scaffold(
        body: Text("Body"),

        // MaxWidthButton(),
      ),
    );
  


【讨论】:

它不起作用,抛出同样的错误“Null check operator used on a null value” 检查更新的答案,如果发现任何错误,请分享?

以上是关于如何在主方法 Flutter 中加载 json?的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Flutter 中加载本地 JSON 文件

Facebook 如何发布 json 并在 iframe 中加载响应?

如何在颤动中加载数据之前显示进度对话框?

如何在Objective-C中加载数据期间异步加载JSON数据并填充UITableView

如何在 appsettings.json 中加载多态对象

图像未在flutter android中加载