Search code examples
flutterdartdropdown

API data not showing in flutter dropdown


i am trying to display data list API to dropdown but the result is not there, which i have to fix. I'm trying to change or update user data and have some data in the form of a list including the user being able to choose country, religion, and others. among these how do i make it.

fetch API

Future<UserBiodata> getBiodata() async {
    String url = Constant.baseURL;
    String token = await UtilSharedPreferences.getToken();
    final response = await http.get(
      Uri.parse(
        '$url/auth/mhs_siakad/biodata',
      ),
      headers: {
        'Authorization': 'Bearer $token',
      },
    );

    print(response.statusCode);
    print(response.body);
    if (response.statusCode == 200) {
      return UserBiodata.fromJson(jsonDecode(response.body));
    } else {
      throw Exception('Token Expired!');
    }
  }

show in widget

 String? _mySelection;

  List<Agama> agama = [];

  @override
  void initState() {
    super.initState();
    BiodataProvider().getBiodata();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: PreferredSize(
        preferredSize: const Size.fromHeight(kToolbarHeight),
        child: CustomAppbar(
          title: 'Edit Biodata',
        ),
      ),
      body: Padding(
        padding: const EdgeInsets.all(18),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Container(
              padding: const EdgeInsets.only(left: 12, right: 8),
              width: double.infinity,
              height: 50,
              decoration: BoxDecoration(
                color: Colors.white,
                boxShadow: [
                  BoxShadow(
                    color: Colors.grey.withOpacity(0.2),
                    spreadRadius: 1,
                    blurRadius: 9,
                    offset: const Offset(
                      1,
                      2,
                    ),
                  ),
                ],
              ),
              child: DropdownButtonHideUnderline(
                child: DropdownButton<String>(
                  items: agama.map((item) {
                    return DropdownMenuItem<String>(
                      value: item.nmAgama,
                      child: Text(item.nmAgama),
                    );
                  }).toList(),
                  onChanged: (newVal) {
                    setState(() {
                      _mySelection = newVal!;
                    });
                  },
                  value: _mySelection,
                ),
              ),
            ),

enter image description here


Solution

  • Here is a full example like you want.

    import 'package:flutter/material.dart';
    import 'package:http/http.dart' as http;
    import 'dart:convert';
    import 'dart:async';
    
    void main() {
      runApp(const MyApp());
    }
    
    class MyApp extends StatelessWidget {
      const MyApp({Key? key}) : super(key: key);
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter DropDownButton',
          theme: ThemeData(
            primarySwatch: Colors.green,
          ),
          home: const MyHomePage(),
          debugShowCheckedModeBanner: false,
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      const MyHomePage({Key? key}) : super(key: key);
    
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      String? dropdownvalue;
    
      Future<List<String>> getAllCategory() async {
        var baseUrl = "https://gssskhokhar.com/api/classes/";
    
        http.Response response = await http.get(Uri.parse(baseUrl));
    
        if (response.statusCode == 200) {
          List<String> items = [];
          var jsonData = json.decode(response.body) as List;
          for (var element in jsonData) {
            items.add(element["ClassName"]);
          }
          return items;
        } else {
          throw response.statusCode;
        }
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: const Text("DropDown List"),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                FutureBuilder<List<String>>(
                  future: getAllCategory(),
                  builder: (context, snapshot) {
                    if (snapshot.hasData) {
                      var data = snapshot.data!;
                      return DropdownButton(
                        // Initial Value
                        value: dropdownvalue ?? data[0],
    
                        // Down Arrow Icon
                        icon: const Icon(Icons.keyboard_arrow_down),
    
                        // Array list of items
                        items: data.map((String items) {
                          return DropdownMenuItem(
                            value: items,
                            child: Text(items),
                          );
                        }).toList(),
                        // After selecting the desired option,it will
                        // change button value to selected value
                        onChanged: (String? newValue) {
                          setState(() {
                            dropdownvalue = newValue!;
                          });
                        },
                      );
                    } else {
                      return const CircularProgressIndicator();
                    }
                  },
                ),
              ],
            ),
          ),
        );
      }
    }