मैं एक पोकेमॉन ऐप बनाने की कोशिश कर रहा हूं। लेकिन मुझे यह त्रुटि मिलती है:

"गेटर 'पोकेमॉन' को शून्य पर बुलाया गया था।

रिसीवर: शून्य

कॉल करने की कोशिश की: पोकेमॉन"

मैं डेटा के लिए इस एपीआई यूआरएल का उपयोग कर रहा हूँ "https://raw.githubusercontent.com/Biuni/PokemonGO-Pokedex/master/pokedex.json"

और मेरी पोकेमॉन क्लास यहाँ है:

class PokeHub {
  List<Pokemon> pokemon;

  PokeHub({this.pokemon});

  PokeHub.fromJson(Map<String,dynamic> json) {
    if (json['pokemon'] != null) {
      pokemon = new List<Pokemon>();
      json['pokemon'].forEach((items) {
        pokemon.add(new Pokemon.fromJson(items));
      });
    }
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    if (this.pokemon != null) {
      data['pokemon'] = this.pokemon.map((items) => items.toJson()).toList();
    }
    return data;
  }
}

class Pokemon {
  int id;
  String num;
  String name;
  String img;
  List<String> type;
  String height;
  String weight;
  String candy;
  int candyCount;
  String egg;
  String spawnChance;
  String avgSpawns;
  String spawnTime;
  List<double> multipliers;
  List<String> weaknesses;
  List<NextEvolution> nextEvolution;

  Pokemon(
      {this.id,
        this.num,
        this.name,
        this.img,
        this.type,
        this.height,
        this.weight,
        this.candy,
        this.candyCount,
        this.egg,
        this.spawnChance,
        this.avgSpawns,
        this.spawnTime,
        this.multipliers,
        this.weaknesses,
        this.nextEvolution});

  Pokemon.fromJson(Map<String, dynamic> json) {
    id = json['id'];
    num = json['num'];
    name = json['name'];
    img = json['img'];
    type = json['type'].cast<String>();
    height = json['height'];
    weight = json['weight'];
    candy = json['candy'];
    candyCount = json['candy_count'];
    egg = json['egg'];
    spawnChance = json['spawn_chance'].toString();
    avgSpawns = json['avg_spawns'].toString();
    spawnTime = json['spawn_time'];
    multipliers = json['multipliers']?.cast<double>();
    weaknesses = json['weaknesses'].cast<String>();
    if (json['next_evolution'] != null) {
      nextEvolution = new List<NextEvolution>();
      json['next_evolution'].forEach((v) {
        nextEvolution.add(new NextEvolution.fromJson(v));
      });
    }
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['id'] = this.id;
    data['num'] = this.num;
    data['name'] = this.name;
    data['img'] = this.img;
    data['type'] = this.type;
    data['height'] = this.height;
    data['weight'] = this.weight;
    data['candy'] = this.candy;
    data['candy_count'] = this.candyCount;
    data['egg'] = this.egg;
    data['spawn_chance'] = this.spawnChance;
    data['avg_spawns'] = this.avgSpawns;
    data['spawn_time'] = this.spawnTime;
    data['multipliers'] = this.multipliers;
    data['weaknesses'] = this.weaknesses;
    if (this.nextEvolution != null) {
      data['next_evolution'] =
          this.nextEvolution.map((v) => v.toJson()).toList();
    }
    return data;
  }
}

class NextEvolution {
  String num;
  String name;

  NextEvolution({this.num, this.name});

  NextEvolution.fromJson(Map<String, dynamic> json) {
    num = json['num'];
    name = json['name'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['num'] = this.num;
    data['name'] = this.name;
    return data;
  }

और यह मेरी main.dart फ़ाइल है:

import 'package:flutter/material.dart';
import 'package:pokemon_flutter/screens/main_screen.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "Poke App",
      home: MainScreen(),
      debugShowCheckedModeBanner: false,
    );
  }

}

और यह मेरी main_screen.dart फ़ाइल है:

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';

import 'package:pokemon_flutter/models/pokemon.dart';

class MainScreen extends StatefulWidget {
  @override
  _MainScreenState createState() => _MainScreenState();
}

class _MainScreenState extends State<MainScreen> {
  var url =
      "https://raw.githubusercontent.com/Biuni/PokemonGO-Pokedex/master/pokedex.json";
  PokeHub pokeHub;
  @override
  void initState() {
    super.initState();
    fetchData();
  }

  void fetchData() async {
    var res = await http.get(url);
    var decodedJson = jsonDecode(res.body);
    pokeHub = PokeHub.fromJson(decodedJson);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Poke App"),
        backgroundColor: Colors.cyan,
      ),
      body: GridView.count(
        crossAxisCount: 2,
        children: pokeHub.pokemon.map((poke) => Card()).toList(),
      ),
      drawer: Drawer(),
      floatingActionButton: FloatingActionButton(
        onPressed: () {},
        backgroundColor: Colors.cyan,
        child: Icon(Icons.refresh),
      ),
    );
  }
}

ऐसा लगता है कि सब कुछ सच है इसलिए मैं गलती को नहीं पहचान सकता। यदि आपके पास इस स्थिति के लिए कोई सलाह है तो मेरी सराहना की जाएगी।

संपादित करें: मैं यहां नया हूं इसलिए कभी-कभी मेरे प्रश्न व्यर्थ हो सकते हैं। लेकिन कृपया मेरे अंक कम न करें। स्टैक ओवरफ्लो अब मेरे प्रश्नों को स्वीकार नहीं करेगा। कृपया मेरे अंक बढ़ाएँ।

0
Cihan İçelliler 13 पद 2020, 13:37

2 जवाब

सबसे बढ़िया उत्तर

जब आप pokeHub.pokemon को कॉल करते हैं, तो pokeHub अभी भी शून्य है इसलिए यह pokemon getter के लिए कोई मान वापस नहीं कर सकता है। मैं देख रहा हूं कि आप डेटा ला रहे हैं, लेकिन जब आपका विजेट बनाया जाता है, तो यह डेटा (जो अतुल्यकालिक रूप से लौटाया जाता है) अभी तक वापस नहीं किया गया है। इस मामले में, FutureBuilder का उपयोग करना एक अच्छा विकल्प होगा। ऐसा कुछ काम करना चाहिए:

   var res;
    void fetchData()  {
      res = http.get(url).then((value){
        var decodedJson = jsonDecode(res.body);
        pokeHub = PokeHub.fromJson(decodedJson);
      });
      
   }
@override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Poke App"),
        backgroundColor: Colors.cyan,
      ),
      body: FutureBuilder(
      future: res,
      builder: (BuildContext context, AsyncSnapshot snapshot) {
        if(snapshot.hasData)

        return GridView.count(
          crossAxisCount: 2,
          children: pokeHub.pokemon.map((poke) => Card()).toList(),
        ),
        drawer: Drawer(),
        floatingActionButton: FloatingActionButton(
          onPressed: () {},
          backgroundColor: Colors.cyan,
          child: Icon(Icons.refresh),
        );
      },
    ),
    );
  }

यह (तरह का) भविष्य के निर्माता का उपयोग केवल एक बार डेटा पुनर्प्राप्त करने के बाद विजेट बनाने के लिए करता है। अधिक जानकारी: https://api.flutter.dev/flutter/widgets/FutureBuilder -class.html

0
Mohammad_Asef 13 पद 2020, 15:03

जब मैंने अपना कोड समाप्त किया तो एप्लिकेशन ने काम किया। यहाँ मेरी नई main_screen.dart फ़ाइल है:

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';

import 'package:pokemon_flutter/models/pokemon.dart';
import 'package:pokemon_flutter/screens/pokemon_detail_screen.dart';

class MainScreen extends StatefulWidget {
  @override
  _MainScreenState createState() => _MainScreenState();
}

class _MainScreenState extends State<MainScreen> {
  var url =
      "https://raw.githubusercontent.com/Biuni/PokemonGO-Pokedex/master/pokedex.json";
  PokeHub pokeHub;
  @override
  void initState() {
    super.initState();
    fetchData();
  }
  var res;
  void fetchData() async {
     res= await http.get(url);
    var decodedJson = jsonDecode(res.body);
    pokeHub = PokeHub.fromJson(decodedJson);
    print(pokeHub.toJson());
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Poke App"),
        backgroundColor: Colors.cyan,
      ),
      body: pokeHub == null
          ? Center(
              child: CircularProgressIndicator(),
            )
          : GridView.count(
              crossAxisCount: 2,
              children: pokeHub.pokemon
                  .map((poke) => Padding(
                        padding: const EdgeInsets.all(2.0),
                        child: InkWell(
                          onTap: (){
                            Navigator.push(context, MaterialPageRoute(builder: (context)=>PokeDetail(
                              pokemon: poke,
                            )));
                          },
                          child: Hero(
                            tag: poke.img,
                            child: Card(
                              elevation: 3.0,
                              child: Column(
                                mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                                children: <Widget>[
                                  Container(
                                    height: 100.0,
                                    width: 100.0,
                                    decoration: BoxDecoration(
                                        image: DecorationImage(
                                            image: NetworkImage(poke.img))),
                                  ),
                                  Text(
                                    poke.name,
                                    style: TextStyle(
                                      fontSize: 20.0,
                                      fontWeight: FontWeight.bold,
                                    ),
                                  )
                                ],
                              ),
                            ),
                          ),
                        ),
                      ))
                  .toList(),
            ),
      drawer: Drawer(),
      floatingActionButton: FloatingActionButton(
        onPressed: () {},
        backgroundColor: Colors.cyan,
        child: Icon(Icons.refresh),
      ),
    );
  }
}

मैंने अगर और स्टेटमेंट जोड़ा और स्टेट सेट किया। मुझे नहीं पता कि मैंने इस समस्या को कैसे हल किया लेकिन इसे हल किया गया। मुझे लगता है कि यह कोड काम कर रहे हैं:

 void fetchData() async {
     res= await http.get(url);
    var decodedJson = jsonDecode(res.body);
    pokeHub = PokeHub.fromJson(decodedJson);
    print(pokeHub.toJson());
    setState(() {});
  }
body: pokeHub == null
          ? Center(
              child: CircularProgressIndicator(),
            )
          : GridView.count(
1
Cihan İçelliler 13 पद 2020, 15:05