Reputation: 1166
I have a json result as string and I have a page model to convert this string to dart map. Although I use the correct function I still see the same error. Why do I see this error and how can I fix it?, thank you.
E/flutter (23261): [ERROR:flutter/lib/ui/ui_dart_state.cc(186)]
Unhandled Exception: type '_InternalLinkedHashMap<String, dynamic>' is
not a subtype of type 'String' E/flutter (23261): #0 PagesController.getPage.<anonymous closure> (package:talab/modules/pages/controllers/pages_controller.dart:28:35)
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:talab/helpers/notify_helper.dart';
import 'package:talab/modules/pages/providers/pages_provider.dart';
import 'package:talab/modules/pages/models/page_model.dart';
class PagesController extends GetxController {
var isLoading = false.obs;
var test = "".obs;
var pageData = {}.obs ;
@override
onInit() {
// Fetch Data
getPage("terms_and_conditions");
super.onInit();
}
// Fetch Data
getPage(pageLink) {
try {
isLoading(true);
PagesProvider().getPage(pageLink).then((resp) {
isLoading(false);
final page = pageFromJson(resp);
pageData.addAll(page) ;
print(page);
}, onError: (err) {
isLoading(false);
NotifyHelper.showSnackBar("Error", err, Colors.red);
});
} catch (exception) {
isLoading(false);
NotifyHelper.showSnackBar("Exception", exception.toString(), Colors.red);
}
}
// To parse this JSON data, do
//
// final page = pageFromJson(jsonString);
import 'dart:convert';
Page pageFromJson(String str) => Page.fromJson(json.decode(str));
String pageToJson(Page data) => json.encode(data.toJson());
class Page {
Page({
this.pageId,
this.pageTitle,
this.pageDesc,
this.pageContent,
});
int pageId;
String pageTitle;
String pageDesc;
String pageContent;
factory Page.fromJson(Map<String, dynamic> json) => Page(
pageId: json["page_id"],
pageTitle: json["page_title"],
pageDesc: json["page_desc"],
pageContent: json["page_content"],
);
Map<String, dynamic> toJson() => {
"page_id": pageId,
"page_title": pageTitle,
"page_desc": pageDesc,
"page_content": pageContent,
};
}
}
Upvotes: 0
Views: 211
Reputation: 891
Page pageFromJson(String str) => Page.fromJson(json.decode(str));
json.decode()
requires a String
parameter but you have provided a Map
.
In this case you do not need to decode the api response.
Just directly pass the response to your Constructor.
try {
isLoading(true);
PagesProvider().getPage(pageLink).then((resp) {
isLoading(false);
final page = Page.fromJson(resp); // change this
}, onError: (err) {
isLoading(false);
NotifyHelper.showSnackBar("Error", err, Colors.red);
});
} catch (exception) {
isLoading(false);
NotifyHelper.showSnackBar("Exception", exception.toString(), Colors.red);
}
Upvotes: 1
Reputation: 3121
I don't understand what are you trying to do with pageData
, try replacing it like this:
var isLoading = false.obs;
var test = "".obs;
Rxn<Page> pageData = Rxn<Page>();
And for updating it:
PagesProvider().getPage(pageLink).then((resp) {
isLoading(false);
final page = pageFromJson(resp);
// pageData.addAll(resp) ; - remove this
pageData.value = page; // update it like this
print(page);
}, onError: (err) {
isLoading(false);
NotifyHelper.showSnackBar("Error", err, Colors.red);
});
Upvotes: 0