user1080247
user1080247

Reputation: 1166

why i see encoding issue with this map in flutter

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

Answers (2)

Ehsan Askari
Ehsan Askari

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

Ali Qanbari
Ali Qanbari

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

Related Questions