如何防止Navigator推送刷新屏幕

时间:2020-02-28 17:41:23

标签: android ios flutter dart

我正在编写一个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}"),

          ],),
        ),
      ),
    );
  }
}

是否可以将所选的值保留在下拉列表中或防止屏幕重新加载?

1 个答案:

答案 0 :(得分:0)

如果您要离开当前页面/视图,则丢失当前的下拉选择很有意义。您可以将当前选择作为参数传递给push函数,以在新页面上重新显示。高度