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: мне нужен общий класс, который я могу использовать для выпадающих меню, где я могу заполнить значения начального значения подсказки и общий список значений на выбор.
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)
Волшебное ключевое слово для этого — функция обратного вызова.
Если подумать, не могли бы вы уточнить последнюю строку /(String val) => setState(() => foo = val)/ ?
Это то, что вы найдете, если погуглите ;-) Вы вызываете DropdownBehaviour, который отправит обратный вызов с помощью selectedValue
. Вы выбираете его значение с помощью (Sting val)
и присваиваете его некоторой переменной состояния. Итак, foo = val — это то, что вы хотите сделать с выбранным значением.
большое спасибо, в итоге разобрался как все применить. Многое узнал из этой темы!
Я мог бы рассматривать то, что вы делаете, как слияние концепций управления состоянием и создания классов. Это может быть хорошо, а может быть лучше думать о них отдельно.
Например, я бы не подумал, что все, что вы здесь написали, обязательно связано с управлением состоянием, в том, что искать при поиске помощи, а скорее просто создание виджета. Отправной точкой для передачи переменных будет размещение переменных в вашем классе 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)
)
);
}
}
Блестящий. Я попытался создать новый конструктор, но не понял, что мне все еще нужна его часть «Ключ», и не понял, что могу просто добавить больше параметров после части «Ключ». Теперь я должен быть в состоянии решить свою проблему.
Вам тоже спасибо за решение. Я выбрал другой ответ в качестве официального ответа, потому что в нем было больше глубины общего объяснения. Тем не менее, спасибо за понимание того, как я могу лучше идентифицировать такие проблемы в следующий раз, теперь я знаю, что гуглить в следующий раз :).