Мы используем ящик для отображения состояния «настроек». Я хотел бы, чтобы пользователь мог изменить настройку и увидеть результат, отраженный в ящике.
Но когда я вызываю setState, он обновляет родительское окно, а не состояние Drawer.
Я хочу, чтобы пользователь мог изменить уведомление с «нет» на «телефон» и видеть, как это отражается в состоянии ящика. Но вместо этого всегда отображается исходное значение.
@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 ответ
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()
внутри него, и он будет перестроен с обновленным значением.
Похожие вопросы
Новые вопросы
flutter
Используйте этот тег для вопросов о наборе инструментов кроссплатформенного пользовательского интерфейса Flutter. Если ваш вопрос касается конкретной платформы, отметьте ее также (например, [android], [ios] и т. д.). Вы также можете включить тег [dart] для вопросов по кодированию.