0

所以我在尝试显示的底部工作表上有问题。

这个想法是我想显示一个底部表并在底部表显示时删除我的底部导航栏。无论如何,我已经创建了一个名为 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,
              ),
      ),
4

2 回答 2

0

用 statefulbuilder 包裹它

StatefulBuilder(
    builder: (BuildContext context, StateSetter setState) {
       return BottomNavBar(
            FeedScreen.selectedIndex,
            _changeTab,
          );}
于 2021-02-23T12:18:05.390 回答
0

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

您可以将 Stateful builder 与 Bottomsheet 一起包装以使用 setState。

于 2021-02-23T12:12:13.983 回答