#flutter #setstate #drawer
#flutter #setstate #ящик
Вопрос:
Мы используем ящик для отображения состояния «настройки». Я хотел бы, чтобы пользователь мог изменять настройки и видеть результат, отраженный в ящике.
Но когда я вызываю setState, он обновляет родительское окно, а не состояние ящика.
Я хочу, чтобы пользователь мог изменить уведомление с «нет» на «телефон» и увидеть отражение в состоянии ящика. Но вместо этого он всегда показывает исходное значение.
@override
Widget build(BuildContext context) {
var key = GlobalKey<ScaffoldState>();
return Scaffold(
key: key,
body: Text("Test Data"),
bottomNavigationBar: NavBar(),
drawer: Drawer( child: components( context ) ),
);
}
Widget components( context )
{
return ListView(
children: <Widget>[
ListTile( dense: true, leading: Icon(Icons.notifications), title: Text("Notifications"),
trailing: DropdownButtonHideUnderline ( child: DropdownButton<String>(
value: Settings.notifications.toString().split('.')[1],
icon: Icon(Icons.expand_more),
onChanged: (String newValue) {
if ( 'none' == newValue )
Settings.notifications = Notifications.none;
else if ( 'email' == newValue )
Settings.notifications = Notifications.email;
else if ( 'phone' == newValue )
Settings.notifications = Notifications.phone;
else
Settings.notifications = Notifications.both;
setState(() {
});
},
items: <String>['none','email','phone','both']
.map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>( value: value, child: Text(value), );
}).toList(),
) ),),
],
);
}
Комментарии:
1. Итак, после выбора вы хотите изменить текст по умолчанию?
Ответ №1:
Drawer
сам по себе виджет без состояния
Помещение кода вашего виджета в функцию не обеспечит ему отдельное состояние. По сути, это часть основного виджета, поэтому setState()
вызовы находятся под основным виджетом.
Создайте отдельный StatefulWidget
(скажем MyStatefulDrawer
) и поместите туда свой код виджета ящика с Drawer
классом в качестве корневого виджета.
Теперь используйте MyStatefulDrawer
в своем основном виджете как таковой:
@override
Widget build(BuildContext context) {
var key = GlobalKey<ScaffoldState>();
return Scaffold(
key: key,
body: Text("Test Data"),
bottomNavigationBar: NavBar(),
drawer: MyStatefulDrawer(context),
);
}
Теперь, когда ваш ящик отслеживает состояние, вы можете setState()
использовать его, и он будет перестроен с обновленным значением.
Комментарии:
1. Это имеет смысл в отношении поведения с учетом состояния. И при реализации он демонстрирует желаемое поведение. Однако он больше не действует как «ящик», то есть покрывает только часть экрана и автоматически исчезает. Знаете ли вы, как имитировать это поведение?