Flutter - 如何使用 BloC 实现下拉列表?

标签 flutter dart bloc

我想在我的应用程序中添加一个包含“名称”的下拉列表,而不是像下面的代码中那样添加一个文本字段。 我如何使用 BloC 来做到这一点?

class PersonPage extends StatefulWidget {

  PersonPage(this.person);
  final Person person;

  @override
  _PersonPageState createState() => _PersonPageState();
}

class Names{
  const Item(this.name);
  final String name;
}

class _PersonPageState extends State<PersonPage> {
  Item selectedUser;
  List<Item> names = <Names>[
   const Item('Thomas'),
   const Item('John'),
   const Item('Mary'),
   const Item('Lukas'),
  ];
 TextEditingController _nameController;

 final _bloc = PersonBloc();

 @override
 void initState() {

  _bloc.setPerson(widget.person);
  _nameController = TextEditingController(text: widget.person.name);

  super.initState();
 }
@override
void dispose() {
 _nameController.dispose();
 super.dispose();
}

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      title: Text("MyApp"),
    ),
    body: Container(
      child: Padding(
        padding: const EdgeInsets.all(8.0),
        child: ListView(
          children: <Widget>[             
            Container(
              child: TextField(
                decoration: InputDecoration(labelText: "Name"),
                controller: _nameController,
                onChanged: _bloc.setName,
              ),
            ),
            Container(
              height: 20,
            ),              
            RaisedButton(
              child: Text("Save"),
              onPressed: () {
                if (_bloc.insertOrUpdate()) {
                  Navigator.pop(context);
                }
              },
            )
          ],
        ),
      ),
    ),
  );
}

谢谢。

最佳答案

我给你一个例子,你尝试在你的代码中应用

class _PersonPageState extends State<PersonPage> {
  final _bloc = PersonBloc();

  @override
  void initState() {

    _bloc.setPerson(widget.person);
    _nameController = TextEditingController(text: widget.person.name);

   super.initState();
  }

  @override
  void dispose() {
    _nameController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      title: Text("MyApp"),
    ),
    body: Container(
      child: Padding(
        padding: const EdgeInsets.all(8.0),
        child: ListView(
          children: <Widget>[             
            StreamBuilder(
              stream: bloc.outName,
              builder: (context, snapshot) {
                if (!snapshot.hasData)
                  return Container();

                return DropdownButton(
                  hint: Text("Names"),
                  value: snapshot.data,
                  items: bloc.names.map((item) {
                    return DropdownMenuItem(
                      value: item,
                      child: Row(children: <Widget>[Text(item),]),
                    );
                  }).toList(),
                  onChanged: bloc.inName,
                );
              },
            ),
            Container(
              height: 20,
            ),              
            RaisedButton(
              child: Text("Save"),
              onPressed: () {
                if (_bloc.insertOrUpdate()) {
                  Navigator.pop(context);
                }
              },
            )
          ],
        ),
      ),
    ),
  );
}

将您的名称列表更改为 BLoC,并创建名称 BehaviorSubject

PersonBloc{

  List<String> names = ['Thomas', 'John', 'Mary', 'Lukas'];

  final _name = BehaviorSubject<String>.seeded("");
  Stream<String> get outName  => _name.stream;
  Function(String) get inName => _name.sink.add;
  //TODO - Don't forget to dispose this _name

}

现在您的_name已选择名称,要获取名称,您只需执行以下操作

Person.name = _name.stream.value;

这个例子还可以改进,它只是一个草稿

关于Flutter - 如何使用 BloC 实现下拉列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59654870/

相关文章:

dart - Flutter:在简历上更新小部件?

Flutter:如何限制在flutter "ListView.builder()"中获取图像?

flutter - 无法从方法 'Null' 返回类型为 'onGenerateRoute' 的值,因为它的返回类型为 'Route<dynamic>'

dart - Flutter 如何计算不同分辨率的像素?

flutter - pub get failed (65 ' ) 退出代码 65

flutter - flutter :在点击时更改容器的颜色

dart - 如何为函数参数声明自定义类型?

flutter - 将切换按钮扩展到父容器宽度

flutter - Flutter-在复杂的UI中应该如何进行 Bloc 通信?

Flutter BLoC - Bloc vs Cubit 事件驱动状态管理优势