Reputation: 41
When loading data from json I got some problem. I think the problem is in fetching the data. Any idea what's going on?
I'm not best Flutter developer it's more like hobby so try to be easygoing.
Here is error:
The following NoSuchMethodError was thrown building RulesCard(dirty, dependencies: [_LocalizationsScope-[GlobalKey#806d5], _InheritedTheme], state: _RulesCardState#471f3): The getter 'campusRulesList' was called on null. Receiver: null Tried calling: campusRulesList
The relevant error-causing widget was: RulesCard file:///H:/Projekty/kampus_sggw/lib/global_widgets/side_drawer.dart:43:57 When the exception was thrown, this was the stack: #0 Object.noSuchMethod (dart:core-patch/object_patch.dart:54:5) #1 _RulesCardState.build (package:kampus_sggw/screens/map_screen/rules_card.dart:69:53) #2 StatefulElement.build (package:flutter/src/widgets/framework.dart:4684:27) #3 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4567:15) #4 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4739:11) ... ════════════════════════════════════════════════════════════════════════════ E/flutter (18750): [ERROR:flutter/lib/ui/ui_dart_state.cc(186)] Unhandled Exception: Unable to load asset: assets/json/campus_rules_pl.json E/flutter (18750): #0
PlatformAssetBundle.load (package:flutter/src/services/asset_bundle.dart:227:7) E/flutter (18750): E/flutter (18750): #1
AssetBundle.loadString (package:flutter/src/services/asset_bundle.dart:68:27) E/flutter (18750): E/flutter (18750): #2
_RulesCardState.loadFromJson (package:kampus_sggw/screens/map_screen/rules_card.dart:31:54) E/flutter (18750): E/flutter (18750): #3
_RulesCardState.initState. (package:kampus_sggw/screens/map_screen/rules_card.dart:23:21) E/flutter (18750): E/flutter (18750):
rules_card.dart where the Widget is defined:
class RulesCard extends StatefulWidget {
@override
_RulesCardState createState() => _RulesCardState();
}
class _RulesCardState extends State<RulesCard> {
CampusRules rulesListPL;
CampusRules rulesListEn;
@override
initState() {
WidgetsBinding.instance.addPostFrameCallback((_) async
{
rulesListPL = await this.loadFromJson();
print(rulesListPL);
});
super.initState();
}
Future<CampusRules> loadFromJson() async {
Map<String, dynamic> campusRulesMap = jsonDecode(await CampusRules.getJsonSting());
final campusRules = CampusRules.fromJson(campusRulesMap);
return campusRules;
}
@override
Widget build(BuildContext context) {
return Drawer(
child: ListView(
padding: EdgeInsets.zero,
children: [
Container(
height: 90.0,
child: DrawerHeader(
child: Text(
LocaleKeys.campus_rules.tr(),
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.headline3
),
decoration: BoxDecoration(
color: Theme.of(context).bannerTheme.backgroundColor
),
),
),
for (CampusRule campusRule in rulesListPL.campusRulesList)
SingleChildScrollView(
physics: BouncingScrollPhysics(),
child: buildListTitle(context, campusRule),
),
],
),
);
}
Widget buildListTitle(BuildContext context, CampusRule rule) => ExpansionTile(
title: Text(
rule.rule,
style: Theme.of(context).textTheme.headline4,
),
children: [
for (CampusSubRule subRule in rule.subRulesList)
ListTile(
title:
Text(
subRule.subRule,
style: Theme.of(context).textTheme.headline4,
),
)
],
);
}
campus_rules.dart where is defined the model of CampusRules object:
import 'package:flutter/services.dart';
import 'package:json_annotation/json_annotation.dart';
part 'campus_rules.g.dart';
@JsonSerializable()
class CampusRules {
String name;
String lang;
List<CampusRule> campusRulesList;
CampusRules(
this.name,
this.lang,
this.campusRulesList,
);
factory CampusRules.fromJson(Map<String, dynamic> json) =>
_$CampusRulesFromJson(json);
static Future<String> getJsonSting() {
return rootBundle.loadString('assets/json/campus_rules_pl.json');
}
}
@JsonSerializable()
class CampusRule {
int ruleNumber;
String rule;
List<CampusSubRule> subRulesList;
CampusRule(
this.ruleNumber,
this.rule,
this.subRulesList,
);
factory CampusRule.fromJson(Map<String, dynamic> json) =>
_$CampusRuleFromJson(json);
}
@JsonSerializable()
class CampusSubRule {
int subRuleNumber;
String subRule;
CampusSubRule(
this.subRuleNumber,
this.subRule,
);
factory CampusSubRule.fromJson(Map<String, dynamic> json) =>
_$CampusSubRuleFromJson(json);
}
campus_rules.g.dart where is the auto generated code for Serialization
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'campus_rules.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
CampusRules _$CampusRulesFromJson(Map<String, dynamic> json) {
return CampusRules(
json['name'] as String,
json['lang'] as String,
(json['campusRulesList'] as List)
?.map((e) =>
e == null ? null : CampusRule.fromJson(e as Map<String, dynamic>))
?.toList(),
);
}
Map<String, dynamic> _$CampusRulesToJson(CampusRules instance) =>
<String, dynamic>{
'name': instance.name,
'lang': instance.lang,
'campusRulesList': instance.campusRulesList,
};
CampusRule _$CampusRuleFromJson(Map<String, dynamic> json) {
return CampusRule(
json['ruleNumber'] as int,
json['rule'] as String,
(json['subRulesList'] as List)
?.map((e) => e == null
? null
: CampusSubRule.fromJson(e as Map<String, dynamic>))
?.toList(),
);
}
Map<String, dynamic> _$CampusRuleToJson(CampusRule instance) =>
<String, dynamic>{
'ruleNumber': instance.ruleNumber,
'rule': instance.rule,
'subRulesList': instance.subRulesList,
};
CampusSubRule _$CampusSubRuleFromJson(Map<String, dynamic> json) {
return CampusSubRule(
json['subRuleNumber'] as int,
json['subRule'] as String,
);
}
Map<String, dynamic> _$CampusSubRuleToJson(CampusSubRule instance) =>
<String, dynamic>{
'subRuleNumber': instance.subRuleNumber,
'subRule': instance.subRule,
};
And the json file:
{
"name": "campus_rules",
"lang": "pl",
"campusRulesList": [
{
"ruleNumber": "1",
"rule": "I. Kampus Uczelni jest terenem ogólnodostępnym w godz. od 6:00 do 22:00. W pozostałym przedziale czasowym na terenie Kampusu mogą przebywać tylko osob do tego uprawnione:",
"subRulesList": [
{
"subRuleNumber": "1",
"subRule": "1) pracownicy Uczelni (a także osoby im towarzyszące) oraz osoby wykonujące prace zlecone na rzecz Uczelni posiadające indywidualne zezwolenia;"
},
{
"subRuleNumber": "2",
"subRule": "2) studenci i doktoranci SGGW oraz osoby im towarzyszące;"
},
{
"subRuleNumber": "3",
"subRule": "3) mieszkańcy domów studenckich. Domu Asystenckiego i Pokoi Gościnnych Ikar;"
},
{
"subRuleNumber": "3",
"subRule": "4) osoby korzystające z obiektów usługowych na terenie Kampusu do czasu ich zamknięcia."
}
]
},
{
"ruleNumber": "2",
"rule": "II. Każdy kto przebywa na terenie Kampusu SGGW zobowiązany jest do:",
"subRulesList": [
{
"subRuleNumber": "1",
"subRule": "1) przestrzegania ogólnie przyjętych norm postępowania w zakresie relacji międzyludzkich:"
},
{
"subRuleNumber": "2",
"subRule": "2) przestrzegania zasad poszanowania mienia wspólnego Uczelni, poszanowania zieleni, a zwłaszcza niezaśmiecania Kampusu;"
},
{
"subRuleNumber": "3",
"subRule": "3) właściwego korzystania z urządzeń, instalacji oraz wyposażenia budynków z uwzględnieniem ich przeznaczenia;"
},
{
"subRuleNumber": "4",
"subRule": "4) właściwego korzystania z dróg transportu samochodowego, parkingów dla samochodów oraz chodników dla pieszych;"
},
{
"subRuleNumber": "5",
"subRule": "5) zachowania zwykłych i nakazanych środków ostrożności przy trzymaniu psów oraz przy trzymaniu innych zwierząt."
}
]
},
{
"ruleNumber": "3",
"rule": "III. Na terenie Kampusu zabrania się:",
"subRulesList": [
{
"subRuleNumber": "1",
"subRule": "1) zakłócania porządku publicznego, agresywnego, napastliwego i nieobyczajnego zachowania oraz niszczenia mienia Uczelni;"
},
{
"subRuleNumber": "2",
"subRule": "2) spożywania alkoholu (nie dotyczy lokali konsumpcyjnych znajdujących się na terenie Kampusu SGGW oraz wydarzeń okazjonalnych lub cyklicznych organizowanychna terenie Kampusu SGGW, pod warunkiem wyrażenia przez Władze Uczelni zgody na spożywanie alkoholu podczas takiego wydarzenia), przebywania w stanie nietrzeźwym oraz pod wpływem innych środków odurzających;"
},
{
"subRuleNumber": "3",
"subRule": "3) wnoszenia i posiadania broni (z wyłączeniem osób pełniących służbę ochrony) i innych przedmiotów mogących stanowić zagrożenie bezpieczeństwa, w szczególności: materiałów wybuchowych, wyrobów pirotechnicznych, środków odurzających lub psychotropowych;"
},
{
"subRuleNumber": "4",
"subRule": "4) organizowania ognisk;"
},
{
"subRuleNumber": "5",
"subRule": "5) grillowania poza miejscami do tego wyznaczonymi;"
},
{
"subRuleNumber": "6",
"subRule": "6) wyprowadzania psów bez smyczy i kagańców oraz pozastawiania ich bez opieki;"
},
{
"subRuleNumber": "7",
"subRule": "7) parkowania pojazdów poza wyznaczonymi miejscami;"
},
{
"subRuleNumber": "8",
"subRule": "8) prowadzenia handlu obwoźnego i akwizycji bez zgody Władz Uczelni."
}
]
},
{
"ruleNumber": "4",
"rule": "VII. Osoby odpowiedzialne za sprawowanie nadzoru na terenie Kampusu SGGW. a szczególnie pracownicy Straży Akademickiej oraz monitoringu obiektów są uprawnione i zobowiązane do:",
"subRulesList": [
{
"subRuleNumber": "1",
"subRule": "1) ograniczania wstępu na teren Kampusu osobom nieupoważnionym, a w przypadku ujawnienia naruszeń postanowień Regulaminu żądania opuszczenia terenu Kampusu;"
},
{
"subRuleNumber": "2",
"subRule": "2) zwracania szczególnej uwagi na osoby, które swoim zachowaniem budzą uzasadnione podejrzenia zakłócenia porządku publicznego i reagowania w sytuacjach zagrożenia;"
},
{
"subRuleNumber": "3",
"subRule": "3) współdziałania, zgodnie z Prawem o Szkolnictwie Wyższym i Statutem Uczelni, w zakresie bezpieczeństwa z właściwymi terenowo jednostkami Policji. Straży Miejskiej, a w przypadku jakiegokolwiek zagrożenia wezwania grup interwencyjnych czy innych służb miejskich lub ratunkowych (Straż Pożarna. Pogotowie Ratunkowe);"
},
{
"subRuleNumber": "4",
"subRule": "4) kontrolowania uprawnień do przebywania na terenie Kampusu SGGW."
}
]
}
]
}
Upvotes: 0
Views: 425
Reputation: 41
Thanks to Stewie answer I added some code to handle refresh after it is loaded:
class _RulesCardState extends State<RulesCard> with TickerProviderStateMixin{
CampusRules rulesListPL;
CampusRules rulesListEn;
AnimationController controller;
@override
initState() {
WidgetsBinding.instance.addPostFrameCallback((_) async
{
rulesListPL = await this.loadFromJson();
print(rulesListPL);
});
controller = AnimationController(
vsync: this,
duration: const Duration(seconds: 5),
)..addListener(() {
setState(() {});
});
controller.repeat(reverse: true);
super.initState();
}
@override
void dispose() {
controller.dispose();
super.dispose();
}
Future<CampusRules> loadFromJson() async {
Map<String, dynamic> campusRulesMap = jsonDecode(await CampusRules.getJsonSting());
final campusRules = CampusRules.fromJson(campusRulesMap);
return campusRules;
}
@override
Widget build(BuildContext context) {
// If rulesListPL has not initialized yet
if (rulesListPL == null) {
// Display your loading screen instead
return Center(
child: CircularProgressIndicator(
value: controller.value,
),
);
}
return Drawer(
child: ListView(
padding: EdgeInsets.zero,
children: [
Container(
height: 90.0,
child: DrawerHeader(
child: Text(
LocaleKeys.campus_rules.tr(),
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.headline3
),
decoration: BoxDecoration(
color: Theme.of(context).bannerTheme.backgroundColor
),
),
),
for (CampusRule campusRule in rulesListPL.campusRulesList)
SingleChildScrollView(
physics: BouncingScrollPhysics(),
child: buildListTitle(context, campusRule),
),
],
),
);
}
Upvotes: 1
Reputation: 5618
You're trying to access rulesListPL
without waiting for loadFromJson()
to complete and assign the result to it. So, you need a loading state:
@override
Widget build(BuildContext context) {
// If rulesListPL has not initialized yet
if (rulesListPL == null) {
// Display your loading screen instead
return Center(
child: CircularProgressIndicator(),
);
}
return Drawer(
child: ListView(
padding: EdgeInsets.zero,
children: [
Container(
height: 90.0,
child: DrawerHeader(
child: Text(LocaleKeys.campus_rules.tr(),
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.headline3),
decoration: BoxDecoration(
color: Theme.of(context).bannerTheme.backgroundColor),
),
),
for (CampusRule campusRule in rulesListPL.campusRulesList)
SingleChildScrollView(
physics: BouncingScrollPhysics(),
child: buildListTitle(context, campusRule),
),
],
),
);
}
Upvotes: 1