如何在颤动中打开底页时设置状态?

问题描述

所以我在尝试显示底部工作表时遇到了问题。

这个想法是我想显示一个底部工作表并在底部工作表显示删除我的底部导航栏。无论如何,我已经创建了一个名为 sheetopen 的布尔值,它最初设置为 false 并且想法是将其设置为 true 以便在工作表弹出时关闭底部导航栏。 在不使用 setstate 的情况下这样做不会反映对 UI 的任何更改。但是,如果我在显示底部表单功能中使用设置状态,应用程序就会崩溃,并且我收到以下消息:“查找停用的小部件的祖先是不安全的。此时小部件的元素树的状态不再稳定。要在其 dispose() 方法中安全地引用小部件的祖先,请通过调用小部件的 didChangeDependencies() 方法中的 DependOnInheritedWidgetofExactType() 来保存对祖先的引用。 我尝试了多种解决方案(Stateful Builder,调用 _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,),

解决方法

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

你可以用Bottomsheet包装Stateful builder来使用setState。

,

用 statefulbuilder 包装它

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...