Как обновить только содержимое ящика

#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. Это имеет смысл в отношении поведения с учетом состояния. И при реализации он демонстрирует желаемое поведение. Однако он больше не действует как «ящик», то есть покрывает только часть экрана и автоматически исчезает. Знаете ли вы, как имитировать это поведение?