_TypeError was thrown building FutureBuilder<dynamic>(dirty, state: _FutureBuilderState<dynamic> type 'Null' is not a subtype of type 'List<dynamic>'

Viewed 1309

# I've been dealing with this problem for a long time. I am trying to parse JSON and convert it into list view. I am getting the response body and it is been converted to list also but its sending null to the future builder, I am getting this error: #

Exception caught by widgets library ======================================================= The following _TypeError was thrown building FutureBuilder(dirty, state: _FutureBuilderState#a289a): type 'Null' is not a subtype of type 'List'

The relevant error-causing widget was: 
  FutureBuilder<dynamic> file:///Users/metehanmacbook/StudioProjects/flutter_mysql/lib/main.dart:37:13
When the exception was thrown, this was the stack: 
#0      _MyHomePageState.build.<anonymous closure> (package:flutter_mysql/main.dart:40:14)
#1      _FutureBuilderState.build (package:flutter/src/widgets/async.dart:775:55)
#2      StatefulElement.build (package:flutter/src/widgets/framework.dart:4691:27)
#3      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4574:15)
#4      StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4746:11)
...

**# Codes: #**

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

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

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter MySql',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.lime,
      ),
      home: MyHomePage(title: 'Flutter MYSQL'),
    );
  }
}
class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, required this.title}) : super(key: key);
  final String title;
  @override
  _MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: FutureBuilder(
      future: Getmethod(),
        builder: (BuildContext context, AsyncSnapshot snapshot){
        List snap = snapshot.data;
        if(snapshot.connectionState == ConnectionState.waiting){
          return Center(
            child: CircularProgressIndicator(),
          );
        }
        if(snapshot.hasError){
          return Center(
            child: Text('error fatch'),
          );
        }

        return ListView.builder(
            itemCount: snap.length,
            itemBuilder: (context, index){
              return ListTile(
                title: Text("Product Name: ${snap[index]['pro_name']}"),
                subtitle: Text("Product Desc: ${snap[index]['pro_desc']}"),
              );
          }
        );
        },

      ),

    );
  }



  Getmethod()async{
    String theurl = ('http://10.0.2.2/flutter-demo/getdata.php');

    var res = await http.get(Uri.parse(Uri.encodeFull(theurl)),headers: {"Accept":"application/json"});
    var responseBody = json.decode(res.body);
    print(responseBody);
    return responseBody;
  }



}

how can i solve this problem?

1 Answers

Seems like error is List snap = snapshot.data; snapshot.data is null, and you want to cast it to list.

Solutions:

  1. You can make your snap variable as nullable: List? snap = snapshot.data;
  2. You can return default value (empty list for example) if snap returns null: List snap = snapshot.data ?? [];
  3. Investigate why your Getmethod returns null;
Related