当我第一次加载 json 文件时变量 return null

Variable return null when i load json file the first time

我的代码工作正常,但我不知道为什么变量:Map dataJsonObject; return “null” 当我构建时我的带有 adb 的应用程序(在 android studio 代码中)。 但是,如果我执行 hot reloadhot restart,我的变量“dataJsonObject” return 我是正确的值。当我第一次构建代码时,我如何获得 return 的正确值。 谢谢

我的代码

import 'package:flutter/material.dart';
import 'dart:convert'; //(jsonDecode)
import 'package:flutter/services.dart'; // (loadJson)
import 'package:flutter/foundation.dart'; //(debugPrint)

class ProverbDisplay extends StatefulWidget {
  final int myId;
  final String myCountry;
  const ProverbDisplay(this.myId, this.myCountry);

  @override
  _ProverbDisplayState createState() => _ProverbDisplayState();
}

class _ProverbDisplayState extends State<ProverbDisplay> {
  Map<String, dynamic> dataJsonObject;

  //Get JSON
  Future getJsonProverb() async {
    final String rawJson = await rootBundle.loadString('assets/json/data.json');
    dataJsonObject = await jsonDecode(rawJson);
    return dataJsonObject;
  }

  @override
  void initState() {
    super.initState();
    getJsonProverb();
  }

  @override
  Widget build(BuildContext context) {
    debugPrint(' jsonData : $dataJsonObject'); //Return null

    return Container(
      color: Colors.blue,
      height: 250,
      child: Row(
        children: [
          Container(
            width: 300,
            child: PageView.builder(itemBuilder: (context, index) {
              return Text("$dataJsonObject");
            }),
          ),
        ],
      ),
    );
  }
}


您正在初始状态下执行 getJsonProverb(),但该函数可能在您的构建函数运行之前未完成。由于函数尚未完成 dataJsonObject 可能仍为空。你应该做的是确保你的未来完成,然后只呈现小部件。您可以通过使用未来的构建器来实现这一点。以下是我将如何重写您的代码:

import 'dart:convert'; //(jsonDecode)

import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; // (loadJson)

class ProverbDisplay extends StatefulWidget {
  final int myId;
  final String myCountry;

  const ProverbDisplay(this.myId, this.myCountry);

  @override
  _ProverbDisplayState createState() => _ProverbDisplayState();
}

class _ProverbDisplayState extends State<ProverbDisplay> {
  Future getJsonProverbFuture = getJsonProverb();

  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
        future: getJsonProverbFuture,
        builder: (context, snapshot) {
          if (!snapshot.hasData) {
            return Text('Loading...');
          } else {
            return Container(
              color: Colors.blue,
              height: 250,
              child: Row(
                children: [
                  Container(
                    width: 300,
                    child: PageView.builder(itemBuilder: (context, index) {
                      return Text("${snapshot.data}");
                    }),
                  ),
                ],
              ),
            );
          }
        });
  }
}

//Get JSON
Future getJsonProverb() async {
  final String rawJson = await rootBundle.loadString('assets/json/data.json');
  return await jsonDecode(rawJson);
}

这里有更多关于未来建造者的信息https://api.flutter.dev/flutter/widgets/FutureBuilder-class.html