如何在Flutter中更改下拉值时调用api?

问题描述 投票:0回答:1

[在我的flutter应用程序中,我有两个下拉按钮,第一个是选择子主题,第二个是选择课程号。如果我选​​择了主题和课程号,请呼叫api studentList并在列表视图中显示学生列表。

这是我的代码:

    import 'package:flutter/cupertino.dart';
    import 'package:flutter/material.dart';
    import 'package:flutter_app78/Model/Class_Division_subjectwise.dart';
    import 'package:flutter_app78/Model/LateStudent_list.dart';
    import 'package:flutter_app78/Old_Dashboard.dart';
    import 'package:flutter_spinkit/flutter_spinkit.dart';
    import 'dart:async';
    import 'package:http/http.dart' as http;
    import 'package:flutter_app78/MyDrawerRoute.dart';
    import 'dart:convert';
    import 'package:intl/intl.dart';
    import 'Model/Student_list.dart';


    class SubjectWiseAttendance extends StatefulWidget {

      final imei_no,school_code,employee_id;
      SubjectWiseAttendance({Key key, this.imei_no, this.school_code, this.employee_id})
          : super(key: key);
      @override
      _SubjectWiseAttendanceState createState() => _SubjectWiseAttendanceState();
    }
    class _SubjectWiseAttendanceState extends State<SubjectWiseAttendance> {
      String date =DateFormat("dd-MM-yyyy").format(DateTime.now());
      String holder='9';
      String new_str;
      String old_str;
      String get imei_no => '0';
      String get school_code => 'STAGING';
      String get employee_id => 'EMP450';
      String get class_id=>holder;
      String get subject_id=>'0';
      String get attendance_date=>date;
      String get standard_id=>'0';
      String get attendance_type=>'S';
      String get hr_id=>'0';
      String get batch_id=>'0';
      String get sort_by_lect_no=>'0';
      String get Absent_Enroll_No =>new_str;
      String get proxy_flag =>'N';
      String get proxy_reason =>" ";
      String get late_flag=>'N';
      String get reson_late_attendance=>" ";
      String get absent_late_flag=>" ";
      String get absent_late_desc=>" ";
      String get updateremark=>'0';
      String get enrollment_no=>" ";
      String get remarkdate=>'09-12-2019';
      String get opFlag=>'AB';
      String get homeroom_id=>'0';
      String get lecture_id =>'0';
      var enrollment_no1;
      var class_structure_id;
      String get stdDetails=>'$enrollment_no1'+'#'+'$class_structure_id';
      var HFlag;
      bool holidayFlag=false;
      var flag2;
      ClassDivisionSubject _mySelection;
      List<dynamic> filteredItems;
      List<dynamic> filteredItemsType;
      String _selectedLocation; // Option 2
      bool _flag= true;
      Future api1;
      var result ;
      var msg;
      var validate;
      var validate1;
      List<String> _lectures = <String>['Lect No-1', 'Lect No-2', 'Lect No-3',
        'Lect No-4','Lect No-5','Lect No-6','Lect No-7','Lect No-8','Lect No-9','Lect No-10'];
      String _lecture = 'Lect No-1';
      var api2;
      var array;
      var classid;
      bool apiCall=false;
      @override
      void initState() {
        print('initState');
        _selectedLocation;
       _lectures;
       api1=_fetchClassdivision(imei_no, school_code, employee_id);
       api2=_fetchStudentlist(imei_no, school_code, employee_id, class_id, subject_id, attendance_date, standard_id, attendance_type, hr_id, batch_id, sort_by_lect_no);
        super.initState();
      }
      @override
      void dispose() {
        super.dispose();
      }
      _fetchClassdivision(
          String imei_no, String school_code, String employee_id) async {
        var apiUrl ='https://staging.ethdigitalcampus.com/T-View/service/DC/getClassDivisionSubjectwise' ;
        List<ClassDivisionSubject> list;
        Map<String, String> headers = {

          'content-type': 'application/x-www-form-urlencoded'
        };
        print('api1');
        Map<String, String> body = {
          'imei_no': imei_no,
          'school_code': school_code,
          'employee_id': employee_id,
        };
        http.Response response =
        await http.post(apiUrl, body: body, headers: headers);
        var data = json.decode(response.body);
        if (data != null) {
          result = data['result'];
          print(result);
          if (result == '1') {
            msg = data['msg'];
            setState(() {
              validate = false;
            });
          } else {
            setState(() {
              array = data['Class'];

              validate = true;
            });

          }
        }
        return array;
      }
      String subject;
      List _buildFilteredList(List<dynamic> data) {
        List filteredItems = [];
        for(int j=0;j<data.length;j++)
        {
           subject = data[j]['class_desc']+"--"+ data[j]['subject_desc'];
           classid=data[j]['class_id'].toString();
           if(_selectedLocation==subject)
           {print('inside if');
           holder=classid;
             print(holder);
           }
        // print("class id:-$classid");
          String subject_id1=data[j]['subject_id'].toString();
          //print("subject id:-$subject_id1");
          filteredItems.add(subject.toString());
        }
        return filteredItems;
      }
      Widget getSpinKit(){
        return
          Container(
              child: Center(
                child:  CircularProgressIndicator()
              )
          );
      }
       _fetchStudentlist(String imei_no, String school_code, String employee_id,
          String class_id,String subject_id,String attendance_date,String standard_id,String attendance_type,
          String hr_id,String batch_id,String sort_by_lect_no) async {
        await Future.delayed(Duration(seconds: 10));
          var apiUrl ='https://staging.ethdigitalcampus.com/T-View/service/DC/getStudentsList' ;
          Map<String, String> headers = {

          'content-type': 'application/x-www-form-urlencoded'
          };
        print('api2');
         print(class_id);
        Map<String, String> body = {
          'imei_no': '0',
          'school_code': 'STAGING',
          'employee_id': employee_id,
          'class_id':class_id,
          'subject_id':'0',
          'attendance_date':attendance_date,
          'standard_id':'0',
          'attendance_type':'C',
          'hr_id':'0',
          'batch_id':'0',
          'sort_by_lect_no':'0',
        };
        http.Response response =
        await http.post(apiUrl, body: body, headers: headers);
        //print(response.body);
        var data = json.decode(response.body);
        var resultCheck = data['result'];
        print(resultCheck);
        if (resultCheck == '0') {
          var attendance = data['StudentList'];
          setState(() {
            validate1 = true;
          });
          // print(attendance);
          for (var i = 0; i < attendance.length; i++) {
            var arrayObject = attendance[i];
            enrollment_no1= arrayObject['enrollment_no'];
            class_structure_id=arrayObject['class_structure_id'];
            HFlag=arrayObject['attendance_flag'];
            if(HFlag=='-')
            {
              setState(() {
                holidayFlag=true;
              });
            }
          }
        }else
          if(resultCheck=='1')
            {
              var msg=data['msg'];
              print(msg);
              setState(() {
                validate1 = false;
              });

              showDialog(
                  context: context,
                  builder: (BuildContext context) {
                return AlertDialog(
                  content: new Container(
                      width: 290.0,
                      height: 100.0,
                      decoration: new BoxDecoration(
                        shape: BoxShape.rectangle,
                        color: const Color(0xFFFFFF),
                        borderRadius: new BorderRadius.all(
                            new Radius.circular(32.0)),
                      ),
                      child: new Column(
                          crossAxisAlignment: CrossAxisAlignment.stretch,
                          children: <Widget>[
                            // dialog top
                            new Expanded(
                              child: new Row(
                                children: <Widget>[
                                  Column(
                                    children: <Widget>[
                                      Image.asset("alerts.png", width: 30,),
                                    ],
                                  ),
                                  Padding(padding: EdgeInsets.only(left: 10.0),),
                                  Column(
                                    children: <Widget>[
                                      Text("Alert")
                                    ],
                                  )
                                ],
                              ),
                            ),
                            new Expanded(
                              child: new Container(
                                child: new Text(msg.toString() /*"Assignment created successfully"*/),
                              ),
                            ),
                          ]
                      )
                  ),
                  actions: <Widget>[
                    FlatButton(onPressed: () {
                      // d.clear();
                      Navigator.push(
                        context,
                        MaterialPageRoute(builder: (context) => OldDashboard()),
                      );
                    },
                      child: Text('Ok'),
                    ),
                  ],
                );
              }
              );

        }
        return data['StudentList'];
      }
     Widget listViewWidget(data) {
        return Container(
          child: ListView.builder(
              addAutomaticKeepAlives: false,
              itemCount: data.length,
              padding: const EdgeInsets.all(2.0),
              itemBuilder: (BuildContext cntext, int index) {
                return Card(
                    child: Container(
                        height: 80.0,
                        width: 120.0,
                        child: Center(
                            child: ListTile(
                              subtitle: Padding(
                                padding: const EdgeInsets.only(top: 5.0),
                                child: Text(
                                  data[index]['enrollment_no'],
                                  style: TextStyle(
                                    fontSize: 14.0,
                                    color: Colors.black,
                                    //fontWeight: FontWeight.bold
                                  ),
                                ),
                              ),
                              title: Text(
                                data[index]['student_name'],
                                style: TextStyle(
                                  fontSize: 14.0,
                                  color: Colors.black,
                                ),
                              ),
                              leading: CircleAvatar(
                                  backgroundColor: Colors.white,
                                  child: (data[index]['gender']=='F')
                                      ? Image.asset('female_profile_pic.png')
                                      :(data[index]['gender']=='M')
                                      ?Image.asset('male_profile_icon.png')
                                      :Colors.black
                              ),
                              trailing: ButtonTheme(
                                minWidth: 10.0, height: 40.0,
                                child: RaisedButton(
                                    color:(data[index]['attendance_flag'] == 'P')
                                        ? Colors.green
                                        : (data[index]['attendance_flag'] =='A')
                                        ? Colors.redAccent
                                        : (data[index]['attendance_flag'] =='L')
                                        ? Colors.orange
                                        : (data[index]['attendance_flag'] =='-')
                                        ? Colors.deepPurpleAccent[100]
                                        :Colors.grey,

                                    onPressed: () {
                                      setState(() {
                                        _buttonEnabled = !_buttonEnabled;
                                        _id = index;
                                        if (data[index]['attendance_flag']=='P')
                                        {
                                          setState(() {
                                            data[index]['attendance_flag'] ='A';
                                          });
                                        } else
                                        if(data[index]['attendance_flag']=='A')
                                        {
                                          setState(() {
                                            data[index]['attendance_flag']='P';
                                          });
                                        }
                                        else if(data[index]['attendance_flag']=='L')
                                        {
                                          setState(() {
                                            flag2=data[index]['attendance_flag']='P';
                                          });
                                          _asyncInputDialog(context);
                                        }
                                      });
                                      print("You clicked item number $_id");
                                      if(new_str == null){
                                        print('if-part');
                                        new_str =data[index]['enrollment_no']+'\$'+class_structure_id.toString();
                                        print(new_str);
                                      }else {
                                        print('else-part');
                                        old_str=data[index]['enrollment_no']+'\$'+class_structure_id.toString();

                                        new_str  =  new_str+'#'+old_str ;
                                        print(new_str);
                                      }

                                    },
                                    child: Text(_buttonEnabled ? data[index]['attendance_flag']
                                        :(data[index]['attendance_flag']=='-')?'H':_buttonEnabled==false
                                    )
                                ),
                              ),
                              onTap:(){
                                setState((){
                                  _id = index;
                                });
                              },
                            )
                        )
                    )
                );
              }),
        );
      }


      final GlobalKey<FormState> _formKey = new GlobalKey<FormState>();

      int _id;
      bool _buttonEnabled = true;
       @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title : Text("Subject Wise Attendance"),
            backgroundColor: Colors.black,
          ),
          drawer: MyDrawer(),
          body: new SafeArea(
              top: false,
              bottom: false,
              child: new Form(
                  key: _formKey,
                  autovalidate: true,
                  child: new ListView(
                    padding: const EdgeInsets.only(top: 10.0,left: 8.0,right: 8.0),
                    children: <Widget>[

                       Container(
                        child:FutureBuilder(
                            future:api1,
                            builder: (BuildContext context,snapshot) {
                              print('class division');
                              if (snapshot.data == null) {
                                return Column(children: <Widget>[
                                  Container(
                                      child: Center(
                                        child:  CircularProgressIndicator()
                                      ))
                                ]);
                              } else {
                                if(result =='0') {
                                  filteredItems = _buildFilteredList(array);
                                  if (filteredItems.length > 0) {
                                    if(_flag == true){
                                      _selectedLocation = filteredItems[0];


                                    }
                                    return Column(children: <Widget>[
                                      Divider(),
                                      DropdownButton(
                                        style: TextStyle(color: Colors.black,fontStyle: FontStyle.normal,fontSize: 16.5
                                        ),
                                        isExpanded: true,
                                        isDense: true,
                                        value: _selectedLocation,
                                        onChanged: (newValue) {
                                          setState(() {
                                            _flag = false;
                                            _selectedLocation = newValue;

                                           // print(_selectedLocation);
                                            //print('$_selectedLocation.class_desc');
                                          });
                                        },
                                        items: filteredItems.map((location) {
                                          return DropdownMenuItem(
                                            child: new Text(location),
                                            value: location,
                                          );
                                        }).toList(),
                                      ),
                                    ]
                                    );
                                  }
                                } }}),
                      ),

                   // new Text("selected leave name is ${_selectedLocation} : and Id is : ${_selectedLocation}"),
                     _dropdownError == null
                      ? SizedBox.shrink()
                      : Text(
                    _dropdownError ?? "",
                    style: TextStyle(color: Colors.red),),

                     Container(padding: const EdgeInsets.only(top: 5.0)),
                     Container(
                    decoration:  BoxDecoration(

                      borderRadius: BorderRadius.only(
                        topLeft: Radius.circular(20.0),
                        topRight: Radius.circular(20.0),
                        bottomRight: Radius.circular(20.0),
                        bottomLeft: Radius.circular(20.0),
                      ),
                    ),
                     ),

                      new FormField(
                        builder: (FormFieldState state) {
                          return InputDecorator(
                            decoration: InputDecoration(
                              //labelText: 'Lecture No',
                            ),

                            child: new DropdownButtonHideUnderline(
                              child: new DropdownButton(
                                //underline: Container(),
                               // hint: Text('Select Lect No'),
                                value: _lecture,
                                isDense: true,
                                onChanged: (String newValue) {
                                  setState(() {
                                    _lecture = newValue;
                                    state.didChange(newValue);
                                  });
                                },
                                items: _lectures.map((String value) {
                                  return new DropdownMenuItem(
                                    value: value,
                                    child: new Text(value),
                                  );
                                }).toList(),
                              ),
                            ),
                          );
                        },
                      ),
                      Container(padding: const EdgeInsets.only(top: 20.0)),
                      validate1==null? getSpinKit(): new Container(height: 500,
                        padding: const EdgeInsets.only(top:20),
                        child: FutureBuilder(
                            future: api2,
                            builder: (context, snapshot) {
                              print('check student list');
                              if (snapshot.hasError) print(snapshot.error);
                              return snapshot.data != null
                                  ? listViewWidget(snapshot.data)
                                  : Center(child: CircularProgressIndicator());
                            }),
                      ),

                    ],
                  )
              )
          ),
 }

输出:

“输出”

如果更改下拉值,那么如何根据下拉值更改studentList。

flutter dart
1个回答
0
投票
onChangedDropDown内,将调用添加到调用api的方法:

DropdownButton( ... onChanged: (String newValue) { setState(() { _lecture = newValue; state.didChange(newValue); }); _fetchStudentlist(...); }, ... ),

© www.soinside.com 2019 - 2024. All rights reserved.