是否有可能在下拉按钮中显示的值不在菜单中?

Is it possible in a dropdown button the displayed value to not be in the menu?

我尝试这样做但出现错误。我想知道是否存在某种漏洞。 另外,有没有办法让菜单在显示值以下打开?

代码如下:

import 'package:flutter/material.dart';
import './grile_view.dart';

class Grile extends StatefulWidget {  

@override
  State<StatefulWidget> createState() {
    return GrileState();
  }
}

class GrileState extends State<Grile> {

  var _bGrile = ['bgrila 1', 'bgrila 2'];
  var _bio = 'bgrila 1';    

  @override
  Widget build(BuildContext context) {

    return Scaffold(

        body: Padding(

            padding: EdgeInsets.only(top: 15.0, left: 10.0, right: 10.0),
            child: ListView(
                children: <Widget>[
// DropdownButton
                  DropdownButton<String>(

                      items: _bGrile.map((String dropDownStringItem) {
                        return DropdownMenuItem<String>(
                            value: dropDownStringItem,
                            child: Text(dropDownStringItem)
                        );
                      }).toList(),

                      onChanged: (value){
                        Navigator.push(context, MaterialPageRoute(builder: (context) =>
                            GView()));
                      },
                      value: _bio
                  ),
// DropdownButton End
                ]
            )
        )
    );
  } // build
} // GrileState

我是编程新手,请原谅我在代码中写的任何蠢话。

DropdownButton class 包含一个非常方便的 hint 属性。根据 DropdownButton 文档:

If [value] is null and [hint] is non-null, the [hint] widget is displayed as a placeholder for the dropdown button's value.

这对你意味着什么?

您所要做的就是向 DropdownButton 添加一个 hint 小部件,然后从您的动态值中删除分配。

这是一个 DropdownButtonhint 属性 的简短示例:

class DropDownPage extends StatefulWidget {
  @override
  _DropDownPageState createState() => _DropDownPageState();
}

class _DropDownPageState extends State<DropDownPage> {
  int dropdownValue; // Notice how this isn't assigned a value.
  @override
  Widget build(BuildContext context) {
    return Center(
        child: DropdownButton(
      // Here's the hint property. I used a Text widget, 
      // but you can use any widget you like
      hint: Text("Pick a Widget"),
      value: dropdownValue,
      items: [
        DropdownMenuItem(child: Text("FlatButton"), value: 0),
        DropdownMenuItem(child: Text("Container"), value: 1),
        DropdownMenuItem(child: Text("Scaffold"), value: 2),
        DropdownMenuItem(child: Text("GestureDetector"), value: 3),
      ],
      onChanged: (value) {
        setState(() {
          dropdownValue = value;
        });
      },
    ));
  }
}

这是结果:

所以在您的代码中,这是您必须在自己的代码中执行的操作。

编辑:var _bio = 'bgrila 1';

并将其更改为:var _bio;

然后添加提示 属性 到您的 DropdownButton:

       DropdownButton<String>(
                hint: Text("Pick a *****"), // Replace with your hint widget
                items: _bGrile.map((String dropDownStringItem) {
                 return DropdownMenuItem<String>(
                     value: dropDownStringItem,
                   child: Text(dropDownStringItem)
                  );
                }).toList(),

                onChanged: (value){
                 Navigator.push(context, MaterialPageRoute(builder: (context) =>
                        GView()));
               },
               value: _bio
            ),

因此您的整个代码如下所示:

class Grile extends StatefulWidget {  

@override
  State<StatefulWidget> createState() {
    return GrileState();
  }
}

class GrileState extends State<Grile> {

  var _bGrile = ['bgrila 1', 'bgrila 2'];
  var _bio;    

  @override
  Widget build(BuildContext context) {

    return Scaffold(

        body: Padding(

            padding: EdgeInsets.only(top: 15.0, left: 10.0, right: 10.0),
            child: ListView(
                children: <Widget>[
// DropdownButton
                  DropdownButton<String>(
                    hint: Text("Pick a *******"),
                      items: _bGrile.map((String dropDownStringItem) {
                        return DropdownMenuItem<String>(
                            value: dropDownStringItem,
                            child: Text(dropDownStringItem)
                        );
                      }).toList(),

                      onChanged: (value){
                        Navigator.push(context, MaterialPageRoute(builder: (context) =>
                            GView()));
                      },
                      value: _bio
                  ),
// DropdownButton End
                ]
            )
        )
    );
  } // build
} // GrileState