如何从DropDownMenu获取所选项目的值

问题描述 投票:0回答:1

我是新手,我创建了小部件GenreDropDown,它显示了各种流派的电影;我在MyHomePage中使用了它,并在小部件Text中显示了所选项目(只是测试),但是我不知道如何在MyHomePage屏幕中获取所选项目,我需要它,因为以后我会添加其他小部件TextField和通过FlatButton发送所有数据(如表单)

这是MyHomePage

import 'package:flutter/material.dart';
import 'package:appcinema/Model/Genre.dart';

class MyHomePage extends StatefulWidget {

  static const routeName = '/';

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

class _MyHomePageState extends State<MyHomePage> {

  @override
  Widget build(BuildContext context) {

    return Scaffold(
      appBar: AppBar(
        title: Text("App Cinema"),
      ),
      body: SafeArea(
        child: Padding(
          padding: EdgeInsets.all(10),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.start,
            mainAxisSize: MainAxisSize.min,
            children: <Widget>[
              Row(
                mainAxisAlignment: MainAxisAlignment.start,
                children: <Widget>[
                  Text("Select the genre of the film: ", style: TextStyle(fontSize: 17)),
                  GenreDropDown(),

                ],
              ),
              //Text where i would show the selected value of GenreDropDown
            ],
          ),
        ),
      )
    );
  }
}

这是类Genre和GenreDropDown

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

class Genre{
  final int id;
  final String name;

  Genre(this.id, this.name);

}

class GenreDropDown extends StatefulWidget {

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

class GenreDropDownWidget extends State<GenreDropDown>{

  Genre ddbValue;

  final List<Genre> genreList = <Genre>[
    Genre(1, "Animation"),
    Genre(2, "Action"),
    Genre(3, "Adventure"),
    Genre(4, "Biography"),
    Genre(5, "Comedy"),
    Genre(6, "Crime"),
    Genre(7, "Documentary"),
    Genre(8, "Drama"),
    Genre(9, "Erotic"),
    Genre(10, "Family"),
    Genre(11, "Fantasy"),
    Genre(12, "Horror"),
    Genre(13, "History"),
    Genre(14, "Musical"),
    Genre(15, "Mystery"),
    Genre(16, "Philosophical"),
    Genre(17, "Political"),
    Genre(18, "Romance"),
    Genre(19, "Science Fiction"),
    Genre(20, "Sci-Fi"),
    Genre(21, "Social"),
    Genre(22, "Thriller"),
    Genre(23, "Urban"),
    Genre(24, "War"),
    Genre(25, "Western")
  ];

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.start,
      children: <Widget>[
        DropdownButton<Genre>(
          disabledHint: Text("Disabilitated"),
          hint: Text("ex: Fantasy"),
          isExpanded: false,
          value: ddbValue,
          items: genreList.map<DropdownMenuItem<Genre>>(
                  (Genre item){
                return DropdownMenuItem<Genre>(
                  value: item,
                  child: Text(item.name),
                );
              }
          ).toList(),
          onChanged: (Genre newValue){
            setState(() {
              ddbValue = newValue;
            });
          },
        ),
      ],
    );
  }
}
flutter dart drop-down-menu dropdown
1个回答
0
投票

您可以传递函数,当下拉值更改时,该函数也会更改值。

以下代码可为您提供更多帮助。

class DeleteWidget extends StatefulWidget {
  @override
  _DeleteWidgetState createState() => _DeleteWidgetState();
}

class _DeleteWidgetState extends State<DeleteWidget> {
  Genre currentvalue;
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              GenreDropDown(
                changeState: (Genre newValue) {
                  setState(() {
                    print(newValue.name);
                    currentvalue = newValue;
                  });
                },
              ),
              Text(currentvalue?.name.toString())
            ],
          ),
        ),
      ),
    );
  }
}

class Genre {
  final int id;
  final String name;

  Genre(this.id, this.name);
}

class GenreDropDown extends StatefulWidget {
  final Function changeState;
  GenreDropDown({this.changeState});
  @override
  GenreDropDownWidget createState() => GenreDropDownWidget();
}

class GenreDropDownWidget extends State<GenreDropDown> {
  Genre ddbValue;

  final List<Genre> genreList = <Genre>[
    Genre(1, "Animation"),
    Genre(2, "Action"),
    Genre(3, "Adventure"),
    Genre(4, "Biography"),
    Genre(5, "Comedy"),
    Genre(6, "Crime"),
    Genre(7, "Documentary"),
    Genre(8, "Drama"),
    Genre(9, "Erotic"),
    Genre(10, "Family"),
    Genre(11, "Fantasy"),
    Genre(12, "Horror"),
    Genre(13, "History"),
    Genre(14, "Musical"),
    Genre(15, "Mystery"),
    Genre(16, "Philosophical"),
    Genre(17, "Political"),
    Genre(18, "Romance"),
    Genre(19, "Science Fiction"),
    Genre(20, "Sci-Fi"),
    Genre(21, "Social"),
    Genre(22, "Thriller"),
    Genre(23, "Urban"),
    Genre(24, "War"),
    Genre(25, "Western")
  ];

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.start,
      children: <Widget>[
        DropdownButton<Genre>(
          disabledHint: Text("Disabilitated"),
          hint: Text("ex: Fantasy"),
          isExpanded: false,
          value: ddbValue,
          items: genreList.map<DropdownMenuItem<Genre>>((Genre item) {
            return DropdownMenuItem<Genre>(
              value: item,
              child: Text(item.name),
            );
          }).toList(),
          onChanged: (Genre newValue) {
            setState(() {
              widget.changeState(newValue);
              ddbValue = newValue;
            });
          },
        ),
      ],
    );
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.