Как элегантно использовать переменные для состояния во Flutter/Dart?

class EventCreator extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Stack(
        children: <Widget> [
          Positioned.fill(
            child: Image(
              image: AssetImage('images/planning.jpg'),
              fit: BoxFit.cover,
            ),
          ),
          Container(
            child: Column(
              children: <Widget>[

                //DropdownBehavior(valueArg, listArg), idea

                DropdownBehavior(), // current

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

class DropdownBehavior extends StatefulWidget {
  DropdownBehavior({Key key}) : super(key: key);
  @override
  _DropdownBehavior createState() => _DropdownBehavior();
}

class _DropdownBehavior extends 
  State<DropdownBehavior> {
  String dropdownValue = "Public event";
  List<String> dropdownlist = ['Public event', ['Private event'];
                                         // These should be variables,
  @override                              // and be modifiable in EventCreator

  Widget build(BuildContext context) {
    return DropdownButton<String>(
      value: dropdownValue,
      elevation: 16,
      style: TextStyle(color: Colors.white),
      dropdownColor: Colors.black,
      underline: Container(
        height: 2,
        color: Colors.deepPurpleAccent,
      ),
      onChanged: (String newValue) {
        setState(() {
          dropdownValue = newValue;
        });
      },
      items: dropdownlist.map<DropdownMenuItem<String>>((String value) {
        return DropdownMenuItem<String>(
          value: value,
          child: Text(value),
        );
      }).toList(),
    );
  }

}

У меня есть следующий код. Я хочу иметь возможность повторно использовать свои классы DropdownBehavior для различных типов значений. Поэтому я считаю, что мне нужна переменная, которую я могу передать в конструктор DropdownBehavior и, таким образом, каждый раз изменять работу класса.

Я пробовал различные реализации конструктора в DropdownBehavior, но мне кажется, что мне не хватает знаний о состояниях во Flutter, потому что я не могу понять, как это работает. Я также не понимаю использование «Ключа» в конструкторе и как он используется.

Я использовал пример кода DropdownButton для общей реализации.

Я новичок во Flutter и разработке приложений, поэтому мне бы хотелось объяснить, почему то, что я делаю, глупо.

TL;DR: мне нужен общий класс, который я могу использовать для выпадающих меню, где я могу заполнить значения начального значения подсказки и общий список значений на выбор.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
2 029
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

class DropdownBehavior extends StatefulWidget {
  DropdownBehavior({Key key, List<String> dropdownlist) : super(key: key); // added dropdownlist 
  final Function(String) selectedValue;
  @override
  _DropdownBehavior createState() => _DropdownBehavior();
}

class _DropdownBehavior extends 
  State<DropdownBehavior> {
  String dropdownValue = "Public event";
  List<String> dropdownlist = ['Public event', ['Private event']; 
                                         // These should be variables,
  @override                              // and be modifiable in EventCreator

  Widget build(BuildContext context) {
    return DropdownButton<String>(
      value: dropdownValue,
      elevation: 16,
      style: TextStyle(color: Colors.white),
      dropdownColor: Colors.black,
      underline: Container(
        height: 2,
        color: Colors.deepPurpleAccent,
      ),
      onChanged: (String newValue) {
        setState(() {
          widget.selectedValue(newValue); // added
          dropdownValue = newValue;
        });
      }, // added widget. below
      items: widget.dropdownlist.map<DropdownMenuItem<String>>((String value) {
        return DropdownMenuItem<String>(
          value: value,
          child: Text(value),
        );
      }).toList(),
    );
  }

}

Затем в вашем вызывающем классе введите `DropdownBehavior (выпадающий список: mydropdownlist, selectedValue: (String val) => setState (() => foo = val)

Волшебное ключевое слово для этого — функция обратного вызова.

Вам тоже спасибо за решение. Я выбрал другой ответ в качестве официального ответа, потому что в нем было больше глубины общего объяснения. Тем не менее, спасибо за понимание того, как я могу лучше идентифицировать такие проблемы в следующий раз, теперь я знаю, что гуглить в следующий раз :).

ma22om 13.12.2020 19:34

Если подумать, не могли бы вы уточнить последнюю строку /(String val) => setState(() => foo = val)/ ?

ma22om 13.12.2020 19:57

Это то, что вы найдете, если погуглите ;-) Вы вызываете DropdownBehaviour, который отправит обратный вызов с помощью selectedValue. Вы выбираете его значение с помощью (Sting val) и присваиваете его некоторой переменной состояния. Итак, foo = val — это то, что вы хотите сделать с выбранным значением.

w461 13.12.2020 20:37

большое спасибо, в итоге разобрался как все применить. Многое узнал из этой темы!

ma22om 17.12.2020 12:46
Ответ принят как подходящий

Я мог бы рассматривать то, что вы делаете, как слияние концепций управления состоянием и создания классов. Это может быть хорошо, а может быть лучше думать о них отдельно.

Например, я бы не подумал, что все, что вы здесь написали, обязательно связано с управлением состоянием, в том, что искать при поиске помощи, а скорее просто создание виджета. Отправной точкой для передачи переменных будет размещение переменных в вашем классе DropDownBehavior (чтобы идти вместе с Key). Я думаю об этом проще: вместо того, чтобы создавать виджет с состоянием и состоянием, подумайте о том, чтобы просто попытаться создать функцию, которая принимает параметры и возвращает раскрывающуюся кнопку.

Вот сокращенный пример:

class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
  final String title;
//Etc.
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title)
         )
       );
   }
}


Блестящий. Я попытался создать новый конструктор, но не понял, что мне все еще нужна его часть «Ключ», и не понял, что могу просто добавить больше параметров после части «Ключ». Теперь я должен быть в состоянии решить свою проблему.

ma22om 13.12.2020 19:31

Другие вопросы по теме