मैं सर्वर से अनुरोधित परिणाम प्रस्तुत करने का प्रयास करता हूं और इसका प्रारूप जेसन डेटा है।

यह जेसन के रूप में एपीआई रिटर्न है।

{
    id: 1,
    name: Nhel Theavuth,
    email: info@theavuth.me,
    username: theavuth,
    avatar: null,
    phone_number: null,
    token: 
}

उपयोगकर्ता मॉडल:

import 'package:flutter/foundation.dart';

class User with ChangeNotifier {
  int id;
  String fullName;
  String phoneNumber;
  String email;
  String username;
  String avatar;
  String token;

  User({
    this.id,
    this.fullName,
    this.phoneNumber,
    this.email,
    this.username,
    this.avatar,
    this.token
  });

  factory User.fromJson(dynamic json) {
    return User(
      id         : json['id'],
      fullName   : json['name'],
      phoneNumber: json['phone_number'],
      email      : json['email'],
      username   : json['username'],
      avatar     : json['avatar'],
      token      : json['token']
    );
  }

  Map<String, dynamic> toJson() => {
    'id'          : id,
    'name'        : fullName,
    'phone_number': phoneNumber,
    'email'       : email,
    'username'    : username,
    'avatar'      : avatar,
    'token'       : token
  };

}

सर्वर से dataJson को कॉल करने के लिए यह कोड।

void getProfileData() async {
    SharedPreferences prefs           = await SharedPreferences.getInstance();
    String _token                     = prefs.getString('token');
    Map<String, dynamic> responseData = await _userProvider.userProfile({'token':  _token});
    print(responseData['data']);
    List<User> profileData            = (responseData['data'].toList()).map((parsedJson) => User.fromJson(parsedJson)).toList();

    setState(() {
      this.userProfile = profileData;
    });
  }

उपरोक्त जेसन को उपयोगकर्ता मॉडल में रेंडर करने के बाद यह त्रुटि संदेश।

[ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'List<dynamic>' in type cast

कोई इस पर मदद कर सकता है? अग्रिम में धन्यवाद

0
Mr Theavuth 24 मई 2020, 02:04
क्या आप जोड़ सकते हैं कि आप एपीआई द्वारा लौटाए गए डेटा का उपयोग कैसे कर रहे हैं? वर्तमान उपलब्ध जानकारी के साथ मैं केवल इतना कह सकता हूं कि आपको डेटा के रनटाइम प्रकार को _InternalLinkedHashMap से वास्तविक List में बदलना होगा।
 – 
kartoon
24 मई 2020, 02:27
अब मैं पहले से ही अपना प्रश्न अपडेट कर चुका हूं, कृपया जांचें कि मुझे अभी भी उस त्रुटि का सामना करना पड़ रहा है।
 – 
Theavuth
24 मई 2020, 10:33

2 जवाब

मुझे क्या हो रहा है, कोड के बारे में अधिक जानकारी की आवश्यकता है। लेकिन ऐसा लगता है कि आपको अपने JSON परिणाम से एक सूची प्राप्त करने के लिए .toList() पर कॉल करने की आवश्यकता है, क्योंकि डार्ट जेसन को मानचित्र के रूप में प्रबंधित करता है।

1
Gauris Javier 24 मई 2020, 02:12
हैलो @ गौरिस-जेवियर मैंने पहले ही अपना प्रश्न अपडेट कर लिया है और as List को toList() में भी बदल दिया है लेकिन फिर भी त्रुटि मिली है।
 – 
Theavuth
24 मई 2020, 10:36
इसके बजाय इस तरह से प्रयास करें: List<User> profileData = responseData['data'].map((parsedJson) => User.fromJson(parsedJson)).toList();
 – 
Gauris Javier
24 मई 2020, 20:00

आप नीचे पेस्ट रन पूरा कोड कॉपी कर सकते हैं
मान लें कि आपका जेसन स्ट्रिंग है

String jsonString = '''
    {
    "id": 1,
    "name": "Nhel Theavuth",
    "email": "info@theavuth.me",
    "username": "theavuth",
    "avatar": null,
    "phone_number": null,
    "token": ""
}
    ''';

चरण 1: अपने User.fromJson को संशोधित करें, आप User परिभाषा को पूरे कोड में देख सकते हैं

factory User.fromJson(Map<String, dynamic> json) => User(
    id: json["id"],
    name: json["name"],
    email: json["email"],
    username: json["username"],
    avatar: json["avatar"],
    phoneNumber: json["phone_number"],
    token: json["token"],
  );

चरण 2: जसन स्ट्रिंग को फ़ंक्शन userFromJson के साथ पार्स करें

User userFromJson(String str) => User.fromJson(json.decode(str));
...
User user = userFromJson(jsonString);
print(user.name);

उत्पादन

I/flutter (12738): Nhel Theavuth

पूरा कोड

import 'package:flutter/material.dart';
import 'dart:convert';

User userFromJson(String str) => User.fromJson(json.decode(str));

String userToJson(User data) => json.encode(data.toJson());

class User {
  int id;
  String name;
  String email;
  String username;
  dynamic avatar;
  dynamic phoneNumber;
  String token;

  User({
    this.id,
    this.name,
    this.email,
    this.username,
    this.avatar,
    this.phoneNumber,
    this.token,
  });

  factory User.fromJson(Map<String, dynamic> json) => User(
    id: json["id"],
    name: json["name"],
    email: json["email"],
    username: json["username"],
    avatar: json["avatar"],
    phoneNumber: json["phone_number"],
    token: json["token"],
  );

  Map<String, dynamic> toJson() => {
    "id": id,
    "name": name,
    "email": email,
    "username": username,
    "avatar": avatar,
    "phone_number": phoneNumber,
    "token": token,
  };
}


void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {  
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(       
        primarySwatch: Colors.blue,       
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

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

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    String jsonString = '''
    {
    "id": 1,
    "name": "Nhel Theavuth",
    "email": "info@theavuth.me",
    "username": "theavuth",
    "avatar": null,
    "phone_number": null,
    "token": ""
}
    ''';

    User user = userFromJson(jsonString);

    print(user.name);

    setState(() {     
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {    
    return Scaffold(
      appBar: AppBar(       
        title: Text(widget.title),
      ),
      body: Center(        
        child: Column(          
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}
1
chunhunghan 25 मई 2020, 10:56
बहुत बहुत धन्यवाद अब यह काम कर रहा है!
 – 
Theavuth
26 मई 2020, 02:03
मदद करने में खुशी। कृपया इसे उत्तर के रूप में चिह्नित करें यदि यह आपकी मदद करता है। धन्यवाद।
 – 
chunhunghan
26 मई 2020, 03:38