简体   繁体   中英

Flutter Page showing blank screen

I want to display data from api to the text and it is showing blank screen and I think I did anything required, I followed this tutrial https://docs.flutter.dev/cookbook/networking/fetch-data and still it does not work for me. I tried everything,

May you please help me.

My api call below

Future<CarDetails?> signInData() async {
    final prefs = await SharedPreferences.getInstance();
    final String? token = prefs.getString('token');

    try {
      Response response = await _dio.post('$_baseUrl/api/gateway',
          data: {
            "ClientPackageId": "0cdd231a-d7ad-4a68-a934-d373affb5100",
            "PlatformId": "ios",
            "ClientUserId": "AhmedOmar",
            "VinNumber": VINumber
          },
          options: Options(headers: {
            "Content-Type": "application/json",
            "Authorization": "Bearer $token",
          }));
      print("data");
      print(response.data.toString());
      print(response.statusCode);
      if (response.statusCode == 200) {

        Navigator.of(context).pushReplacement(
          MaterialPageRoute(
            builder: (context) => const ResultsPage(),
          ),
        );
      }


      else if (response.statusCode == 500) {
        // call your refresh token api here and save it in shared preference
        print(response.statusCode);
        await getToken();
        signInData();
      }

      return CarDetails.fromJson(jsonDecode(response.data.toString()));
    } catch (e) {
      print(e);
    }

My other page where I wanna show the results

class ResultsPage extends StatefulWidget {
  const ResultsPage({Key? key}) : super(key: key);

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

class _ResultsPageState extends State<ResultsPage> {
  //List<CarDetails> objectList = [];
   late Future<CarDetails?>? objectList;
  _APIState? api;

  @override
  void initState() {
    super.initState();
    objectList = api?.signInData();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        //centerTitle: true,
      ),
    body: Center(
    child: FutureBuilder<CarDetails?>(
    future: objectList,
    builder: (context, snapshot) {
    if (snapshot.hasData) {
    return Text(snapshot.data?.make??"error");
    } else if (snapshot.hasError) {
    return Text('${snapshot.error}');
    }

    // By default, show a loading spinner.
    return const CircularProgressIndicator();
    },
    ),
    ));
  }
}

My model class

class CarDetails {
  String? make;
  String? type;
  String? model;
  int? year;
  String? body;
  String? driveType;
  String? fueType;

  CarDetails(
      {this.make,
        this.type,
        this.model,
        this.year,
        this.body,
        this.driveType,
        this.fueType});

  CarDetails.fromJson(Map<String, dynamic> json) {
    make = json['make'];
    type = json['type'];
    model = json['model'];
    year = json['year'];
    body = json['body'];
    driveType = json['drive_type'];
    fueType = json['fue_type'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['make'] = this.make;
    data['type'] = this.type;
    data['model'] = this.model;
    data['year'] = this.year;
    data['body'] = this.body;
    data['drive_type'] = this.driveType;
    data['fue_type'] = this.fueType;
    return data;
  }
}

The problem is you are replacing the widget in your navigator stack when you get success.

Future<CarDetails?> signInData() async {
final prefs = await SharedPreferences.getInstance();
final String? token = prefs.getString('token');

try {
  Response response = await _dio.post('$_baseUrl/api/gateway',
      data: {
        "ClientPackageId": "0cdd231a-d7ad-4a68-a934-d373affb5100",
        "PlatformId": "ios",
        "ClientUserId": "AhmedOmar",
        "VinNumber": VINumber
      },
      options: Options(headers: {
        "Content-Type": "application/json",
        "Authorization": "Bearer $token",
      }));
  print("data");
  print(response.data.toString());
  print(response.statusCode);
  if (response.statusCode == 200) {


    //Get rid of this
    //Navigator.of(context).pushReplacement(
    //  MaterialPageRoute(
    //    builder: (context) => const ResultsPage(),
    //  ),
    //);

    // Return your future here
    return CarDetails.fromJson(jsonDecode(response.data.toString()));
  }


  else if (response.statusCode == 500) {
    // call your refresh token api here and save it in shared preference
    print(response.statusCode);
    await getToken();
    signInData();
  }
} catch (e) {
  print(e);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM