当我第一次加载 json 文件时变量 return null
Variable return null when i load json file the first time
我的代码工作正常,但我不知道为什么变量:Map dataJsonObject; return “null” 当我构建时我的带有 adb 的应用程序(在 android studio 代码中)。
但是,如果我执行 hot reload 或 hot 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
我的代码工作正常,但我不知道为什么变量:Map
我的代码
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