skip to Main Content

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

3

Answers


  1. using StateManagement or FutureBuilder to receive async data from Future function (BiodataProvider().getBiodata();)
    read more at: https://dart.dev/codelabs/async-await
    https://docs.flutter.dev/development/data-and-backend

    Login or Signup to reply.
  2. you are using List<Agama> agama = []; to display the dropdown items, but you are not adding data to your agama list.

    So, add the proper data into your agama list which you are getting from API.

    And don’t forget to do setState((){}) after adding data into agama list because you are not using any state management.

    Login or Signup to reply.
  3. 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();
                    }
                  },
                ),
              ],
            ),
          ),
        );
      }
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search