Как превратить функцию флаттера в класс без состояния? - PullRequest
0 голосов
/ 21 апреля 2020

Я следую инструкциям новичка по флаттеру Анджелы Ю, и я не мог понять, как превратить функцию в класс без состояния и использовать ее внутри виджета.

Я делал это раньше с простой Контейнер или Столбец, но я не смог получить asp концепцию на следующем примере:

class _PriceScreenState extends State<PriceScreen> {
  String selectedCurrency = 'USD';

  List<DropdownMenuItem> getDropdownItems() {
    List<DropdownMenuItem<String>> dropdownItems = [];

    for (String currency in currenciesList) {
      var newItem = DropdownMenuItem(
        child: Text(currency),
        value: currency,
      );
      dropdownItems.add(newItem);
    }
    return dropdownItems;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        child: DropdownButton<String>(
            value: selectedCurrency,
            items: getDropdownItems(),
            onChanged: (value) {
              setState(() {
                selectedCurrency = value;
              });
            }),
      ),
    );
  }
}

Как бы вы превратили функцию getDropdownItems () в отдельный класс без сохранения состояния и использовали бы его внутри виджет?

Спасибо.

1 Ответ

2 голосов
/ 21 апреля 2020

Идея не в том, чтобы превратить List<DropdownMenuItem> в StatelessWidget, а в том, чтобы создать виджет без состояния для элемента списка

. Это вопрос изменения

DropdownButton<String>(
  value: selectedCurrency,
  items: [
    for (String currency in currenciesList)
      DropdownMenuItem(
        child: Text(currency),
        value: currency,
      ),
  ],
  onChanged: (value) {
    setState(() {
      selectedCurrency = value;
    });
  },
),

в :

DropdownButton<String>(
  value: selectedCurrency,
  items: [
    for (String currency in currenciesList)
      MyStatelessWidget(currency: currency),
  ],
  onChanged: (value) {
    setState(() {
      selectedCurrency = value;
    });
  },
),

...

class MyStatelessWidget extends StatelessWidget {
  const MyStatelessWidget({Key key, this.currency}) : super(key: key);

  final String currency;

  @override
  Widget build(BuildContext context) {
    return DropdownMenuItem(
      value: currency,
      child: Text(currency),
    );
  }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...