我正在编写一个Flutter程序,用户应在其中从DropdownButtonFormField中选择一个值。做出选择后,该选择应显示在下拉菜单中。我使用推送路由从第二个屏幕中获取数据,并在其中进行选择。我的问题是选择该选项后,页面会刷新,因此在下拉列表中未显示所选的值。
下面是我的代码:
我在一个名为shared.dart的文件中创建了Dropdownbuttonformfield,因此可以在多个文件中调用它:
class UserDropdownList extends StatefulWidget {
@override
_UserDropdownListState createState() => _UserDropdownListState();
}
class _UserDropdownListState extends State<UserDropdownList> {
String currentUser;
@override
Widget build(BuildContext context) {
final user = Provider.of<List<User>>(context) ?? [];
return DropdownButtonFormField(
isExpanded: true,
decoration: textInputDecoration,
value: currentUser,
hint: Text(
'Incoming Officer',
),
onChanged: (val) {
setState(() => currentUser = val);
var route = MaterialPageRoute(
builder: (BuildContext context) =>
FinalForm(chosenUser: currentUser,)
);
Navigator.of(context).push(route);
},
// onChanged: (val) => setState(() => currentUser = val),
items: user.map((user){
return DropdownMenuItem(
value: user.userId,
child: Text(user.name)
);
}).toList(),
);
}
}
然后我像这样调用主页中的“自定义”按钮
class FinalForm extends StatefulWidget {
//code for importing selected user
final String chosenUser;
FinalForm({Key key, this.chosenUser}) : super (key: key);
@override
_FinalForm createState() => _FinalFormState();
}
class _FinalFormState extends State<FinalForm> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Final Form')
),
body: Form(
child: Center(
child: ListView(
shrinkWrap: true,
padding: EdgeInsets.fromLTRB(5, 5, 5, 5),
children: <Widget>[
SizedBox(height: 20.0),
Align(
child: Text(
'Select Incoming Officer',
style: TextStyle(
fontSize: 20.0,
fontWeight: FontWeight.bold,
color: Colors.blueAccent,
),
)
),
SizedBox(height: 20.0),
StreamProvider<List<User>>.value(
value: DatabaseService().users,
child: UserDropdownList(),
),
SizedBox(height: 20.0),
Text("${widget.chosenUser}"),
],),
),
),
);
}
}
是否可以将所选的值保留在下拉列表中或防止屏幕重新加载?
答案 0 :(得分:0)
如果您要离开当前页面/视图,则丢失当前的下拉选择很有意义。您可以将当前选择作为参数传递给push函数,以在新页面上重新显示。高度