как установить состояние при открытии нижнего листа в flutter?

#flutter #dart #navigationbar #bottom-sheet #bottom

#flutter #dart #панель навигации

Вопрос:

Итак, у меня проблема с нижним листом, который я пытаюсь отобразить.

идея в том, что я хочу отобразить нижний лист и удалить нижнюю панель навигации при отображении нижнего листа. в любом случае, я создал логическое значение с именем sheetOpen, для которого изначально установлено значение false, и идея состоит в том, чтобы установить для него значение true, чтобы закрыть нижнюю панель навигации при появлении листа . выполнение этого без использования setstate не отражает никаких изменений в пользовательском интерфейсе . Но если я использую set state в функции show Bottom sheet, приложение вылетает, и я получаю это сообщение: «Поиск предка деактивированного виджета небезопасен. на этом этапе состояние дерева элементов виджета больше не стабильно. чтобы безопасно ссылаться на предка виджета в его методе dispose(), сохраните ссылку на предка, вызвав dependOnInheritedWidgetOfExactType() в методе didChangeDependencies() виджета.»Я пробовал несколько решений (построитель с отслеживанием состояния, вызов _controller.setstate ..) но ничего не работает. Застрял на этом в течение 3 дней.. в любом случае я покажу код, который я написал, и я был бы очень признателен всем, кто может помочь.

   class FeedScreen extends StatefulWidget {
  static bool sheetOpen = false;
  static int selectedIndex = 0;
  const FeedScreen();
  @override
  _FeedScreenState createState() => _FeedScreenState();
}

class _FeedScreenState extends State<FeedScreen> {
  late final GlobalKey<ScaffoldState> _key;
  late PersistentBottomSheetController _controller;
  void _showPreview(
      final BuildContext context,
) {

//this is what's causing the issue
    setState(() {
      FeedScreen.sheetOpen = true;
    });

    _controller = _key.currentState!.showBottomSheet(
      (ctx) {
    //etc....
}



    @override
  void initState() {
    super.initState();
    _key = GlobalKey<ScaffoldState>();
  }

    Widget build(BuildContext context) {
    return Scaffold(
    //....
     bottomNavigationBar: FeedScreen.sheetOpen
            ? null
            : BottomNavBar(
                FeedScreen.selectedIndex,
                _changeTab,
              ),
      ),
 

Ответ №1:

https://api.flutter.dev/flutter/widgets/StatefulBuilder-class.html ?

вы можете обернуть конструктор с отслеживанием состояния с помощью Bottomsheet, чтобы использовать setState.

Ответ №2:

оберните его с помощью statefulbuilder

 StatefulBuilder(
    builder: (BuildContext context, StateSetter setState) {
       return BottomNavBar(
            FeedScreen.selectedIndex,
            _changeTab,
          );}