You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter子页面导航实现:点击底部导航仅切换页面局部区域

实现底部导航仅切换页面部分区域的Flutter方案

当前你的代码会在点击底部导航时替换整个页面内容,要实现仅切换部分区域,只需调整页面布局结构,将固定区域与动态切换区域分离即可。

修改后的完整代码

import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int selectedPage = 2;
  final _pageOptions = const [
    PageOne(),
    PageTwo(),
    PageThree(),
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      // 拆分body为固定区域+动态切换区域
      body: Column(
        children: [
          // 这里是页面固定区域,可自定义为顶部标题栏、通用导航等
          const SizedBox(
            height: 60,
            child: Center(
              child: Text(
                '固定顶部区域',
                style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
              ),
            ),
          ),
          // 动态切换的区域,用Expanded占据剩余屏幕空间
          Expanded(
            child: _pageOptions[selectedPage],
          ),
        ],
      ),
      bottomNavigationBar: BottomNavigationBar(
        items: const [
          BottomNavigationBarItem(icon: Icon(Icons.add), label: ""),
          BottomNavigationBarItem(icon: Icon(Icons.abc), label: ""),
          BottomNavigationBarItem(icon: Icon(Icons.access_alarm), label: ""),
        ],
        currentIndex: selectedPage,
        onTap: (int index) {
          setState(() {
            selectedPage = index;
          });
        },
      ),
    );
  }
}

// 示例页面组件,可根据业务需求自定义
class PageOne extends StatelessWidget {
  const PageOne({super.key});

  @override
  Widget build(BuildContext context) {
    return const Center(child: Text('页面一内容'));
  }
}

class PageTwo extends StatelessWidget {
  const PageTwo({super.key});

  @override
  Widget build(BuildContext context) {
    return const Center(child: Text('页面二内容'));
  }
}

class PageThree extends StatelessWidget {
  const PageThree({super.key});

  @override
  Widget build(BuildContext context) {
    return const Center(child: Text('页面三内容'));
  }
}

关键修改说明

  • 将原有的body: _pageOptions[selectedPage]替换为Column布局,拆分出固定区域和动态切换区域
  • 固定区域可根据需求自定义(如AppBar、搜索栏等),这部分不会随底部导航切换而变化
  • 用Expanded包裹动态切换的页面组件,确保它自动填充剩余屏幕空间,点击底部导航时仅更新该区域
  • 补充currentIndex: selectedPage,让底部导航栏的选中状态与当前页面同步

内容的提问来源于stack exchange,提问作者ahmed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 16:10:33