第207行位置15:'0 < = currentIndex && currentIndex < items. length':在Flutter App中不成立

b1payxdu  于 2023-06-07  发布在  Flutter
关注(0)|答案(2)|浏览(144)

我正面临一个问题。我想做一个Flutter应用程序,所有页面都将显示在Android Fragment中。
我已经创建了一个列表,

int _currentIndex = 0;

List<Widget> pages = [
    const HomeMain(),
    const AdPage(),
    const ImageCleanPage(),
    const HomeMain(),
  ];

我在这里列出了4页。我还创建了一个抽屉和底部导航栏。我试着从底部的导航栏里找到0和1页,从抽屉里找到0,2,3页,就像碎片一样.
我试过这个密码

drawer: SafeArea(
          child: Drawer(
            child: Container(
              color: Colors.white,
              child: ListView(
                children:  [
                  DrawerHeader(
                    decoration: const BoxDecoration(
                        color: Colors.indigoAccent
                    ),
                    child: Column(
                      children: [
                        Container(
                          width: 70,
                          height: 70,
                          decoration: BoxDecoration(
                              borderRadius: BorderRadius.circular(50),
                              border: Border.all(
                                  color: Colors.white,
                                  width: 2.0),
                              image: const DecorationImage(
                                image: AssetImage('assets/images/logo_image.png'),
                              )
                          ),
                        ),
                        const SizedBox(height: 15,),
                        const Text("Image Cleaner",
                          style: TextStyle(
                            color: Colors.white,
                            fontWeight: FontWeight.bold, fontSize: 15,
                          ),),
                        const SizedBox(height: 2,),
                        const Text("support.imageclean@gmail.com",
                          style: TextStyle(
                            color: Colors.white,
                            fontSize: 12,
                            decorationThickness: 15,
                          ),)
                      ],
                    ),
                  ),
                  ListBody(
                    children: [
                      ListTile(
                        leading: const Icon(Icons.home),
                        title: const Text('Home'),
                        onTap: () {
                          setState(() {
                            _currentIndex = 0;
                            Navigator.of(context).pop();
                            // Do something when the home page is tapped.
                          });
                        },
                      ),
                      ListTile(
                        leading: const Icon(Icons.settings),
                        title: const Text('Settings'),
                        onTap: () {
                          setState(() {
                            _currentIndex = 2;
                            Navigator.of(context).pop();
                            // Do something when the home page is tapped.
                          });
                        },
                      ),
                      ListTile(
                        leading: const Icon(Icons.help),
                        title: const Text('Help'),
                        onTap: () {
                          setState(() {
                            _currentIndex = 3;
                            Navigator.of(context).pop();
                            // Do something when the home page is tapped.
                          });
                        },
                      ),
                    ],
                  )
                ],
              ),
            ),
          ),
        ),
        bottomNavigationBar: BottomNavigationBar(
          onTap: NavClick,
          items: const [
            BottomNavigationBarItem(
              icon: Icon(Icons.home),
              label: 'Home',
            ),
            BottomNavigationBarItem(
              icon: Icon(Icons.ad_units),
              label: 'Free Coin',
            ),
          ],
          currentIndex: _currentIndex,
          selectedItemColor: Colors.amber[800],
        ),
        backgroundColor: Colors.white,
        body:   SafeArea(
          child:  pages[_currentIndex],
        )
    );
  }
  void NavClick(int index) {
    setState(() {
      _currentIndex = index;
    });
  }

当我从抽屉中点击索引2时,我得到了这个错误,

Failed assertion: line 207 pos 15: '0 <= currentIndex && currentIndex < items.length': is not true.
uujelgoq

uujelgoq1#

BottomNavigationBar始终需要在items的数量范围内具有currentIndex。所以在你的代码中

bottomNavigationBar: BottomNavigationBar(
      onTap: NavClick,
      items: const [
        BottomNavigationBarItem(
          icon: Icon(Icons.home),
          label: 'Home',
        ),
        BottomNavigationBarItem(
          icon: Icon(Icons.ad_units),
          label: 'Free Coin',
        ),
      ],
      currentIndex: _currentIndex,
      selectedItemColor: Colors.amber[800],
    ),

这里有2个items。这意味着currentIndex必须是0或1。但是你的代码使它在通过抽屉制作currentIndex 2时超出了这个范围。注意,你也不能让它“取消选择”或什么的。因此,即使您想要索引2,您也需要在底部栏中选择0或1。要消 debugging 误,您可能需要更改行

currentIndex: _currentIndex,

currentIndex: (_currentIndex == 0 || _currentIndex == 1) ? _currentIndex : 0,

使其在超出范围时回落到0

r1zhe5dt

r1zhe5dt2#

您遇到的错误表明当前索引值_currentIndex超出了BottomNavigationBar中的项目范围。在本例中,BottomNavigationBar中有两个项目,但在抽屉中选择“设置”时将_currentIndex设置为2。这将导致Assert失败,因为对于当前配置,有效索引范围应介于0和1之间(包括0和1)。
要解决此问题,需要调整Drawer中ListTile小部件的onTap回调中的索引值。以下是您应该进行的更改:
对于“主页”选项,将_currentIndex设置为0。
对于“设置”选项,将_currentIndex设置为1。
对于“帮助”选项,将_currentIndex设置为2。
通过进行这些调整,您将确保_currentIndex值保持在BottomNavigationBar的有效范围内。这将解决您遇到的错误,并允许您的应用程序正常运行。

相关问题