#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,
);}