मैं यहाँ से json ला रहा हूँ: https://api.myjson.com/bins/1g3xpe , मेरे स्पंदन ऐप में।

यहां कोड है (मैंने असंबंधित भाग हटा दिया है)। मुद्दा यह है कि फ्यूचरबिल्डर के निर्माता भाग को कभी भी कॉल नहीं किया जा रहा है। इस लाइन debugPrint(snapshot.hasData.toString()); को कभी कॉल नहीं किया जा रहा है।

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:nirmithi/objects/project.dart';
import 'dart:convert';

class Projects extends StatefulWidget {
  @override
  ProjectsState createState() => new ProjectsState();
}

class ProjectsState extends State<Projects> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      primary: true,
      appBar: EmptyAppBar(),
      body: Column(
        children: <Widget>[
          headerWidget(),
          Container(
            child: futureBuilder(),
          )
        ],
      ),
    );
  }

  @override
  void setState(fn) {
    super.setState(fn);
  }
}

Future<List<Project>> getData() async {
  String getProjects = "https://api.myjson.com/bins/1g3xpe";

  final response = await http.get(getProjects);

  if (response.statusCode == 200) {
    List responseJson = json.decode(response.body);
    return responseJson.map((m) => Project.fromJson(m)).toList();
  } else
    throw Exception(response.toString());
}

Widget futureBuilder() {
  FutureBuilder<List<Project>>(
    future: getData(),
    builder: (context, snapshot) {
      debugPrint(snapshot.hasData.toString());
    },
  );

  return Center(
    child: CircularProgressIndicator(),
  );
}


Widget listWidget(List<Project> data) {
  return ListView.builder(
    itemCount: data.length,
    itemBuilder: (BuildContext context, int index) {
      listItem(data.elementAt(index));
    },
  );
}

Widget listItem(Project project) {

  return Card(
    elevation: 6.0,
    child: Column(
      children: <Widget>[Text(project.projectId), Text(project.projectName)],
    ),
  );
}

class EmptyAppBar extends StatelessWidget implements PreferredSizeWidget {
  @override
  Widget build(BuildContext context) {
    return Container();
  }

  @override
  Size get preferredSize => Size(0.0, 0.0);
}

अद्यतन: यह बिल्डर भाग में कोड है जिसे मैंने डिबग करने के लिए हटा दिया था।

switch (snapshot.connectionState) {
        case ConnectionState.none:
        case ConnectionState.waiting:
          return new Text('loading...');
        default:
          if (snapshot.hasError)
            return new Text('Error: ${snapshot.error}');
          else
            return listWidget(snapshot.data);
      }
1
Hirak Chhatbar 21 मई 2019, 12:35

1 उत्तर

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

आपको अपना FutureBuilder वापस करना होगा ताकि यह विजेट ट्री का हिस्सा हो:

Widget futureBuilder() {
  return FutureBuilder<List<Project>>(
    future: getData(),
    builder: (context, snapshot) {
      // ...
    },
  );
}

केवल इसका एक उदाहरण बनाने से भविष्य का समाधान नहीं होगा।

6
Swift 21 मई 2019, 10:21