[在我的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。
onChanged
的DropDown
内,将调用添加到调用api的方法:DropdownButton(
...
onChanged: (String newValue) {
setState(() {
_lecture = newValue;
state.didChange(newValue);
});
_fetchStudentlist(...);
},
...
),