在Flutter应用内部实现分屏功能

前言

这一次被要求实现屏幕上同时展示两个页面,并且两个页面的逻辑,功能互不影响,通俗一点讲就是在Flutter内部实现一个类似于分屏的功能,这可难不倒我。

方法

要在 Flutter 中实现一个屏幕的上半部分和下半部分展示不同的页面(我这里是左右两部分),并且两个页面的逻辑互不影响,可以使用 Row 和 Expanded 组件来划分屏幕的左右部分,并分别在这两个部分中使用 Navigator 进行页面导航。还可以依赖 Navigator 在任一页面中对另一个页面的路由进行控制。

效果如下:

代码

dart 复制代码
import 'package:date_format/date_format.dart';
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  final GlobalKey<NavigatorState> topNavigatorKey = GlobalKey<NavigatorState>();
  final GlobalKey<NavigatorState> bottomNavigatorKey =
      GlobalKey<NavigatorState>();

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Row(
          children: [
            Expanded(
              child: Navigator(
                key: topNavigatorKey,
                onGenerateRoute: (settings) {
                  return MaterialPageRoute(
                    settings: settings,
                    builder: (_) => TopPage(
                      bottomNavigatorKey: bottomNavigatorKey,
                    ),
                  );
                },
              ),
            ),
            Expanded(
              child: Navigator(
                key: bottomNavigatorKey,
                onGenerateRoute: (settings) {
                  return MaterialPageRoute(
                    settings: settings,
                    builder: (_) =>
                        BottomPage(), // Placeholder, BottomPage can be added here
                  );
                },
              ),
            ),
          ],
        ),
      ),
    );
  }
}

class TopPage extends StatelessWidget {
  final GlobalKey<NavigatorState> bottomNavigatorKey;
  TopPage({required this.bottomNavigatorKey});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Top Page')),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(children: [
          Center(
            child: ElevatedButton(
              child: Text('Go to Top Details'),
              onPressed: () {
                Navigator.of(context).push(
                  MaterialPageRoute(builder: (_) => TopDetailsPage()),
                );
              },
            ),
          ),
          SizedBox(height: 20),
          Center(
            child: ElevatedButton(
              child: Text('Show Bottom Page Details'),
              onPressed: () {
                // changeBottomPageState();
                bottomNavigatorKey.currentState!.push(
                  MaterialPageRoute(builder: (_) => BottomDetailsPage()),
                );
              },
            ),
          ),
        ]),
      ),
    );
  }
}

class TopDetailsPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Top Details Page')),
      body: Center(
        child: ElevatedButton(
          child: Text(
              'Go to Bottom Page'), // Add a button to navigate to BottomPage
          onPressed: () {
            Navigator.of(context).push(
              MaterialPageRoute(builder: (_) => BottomPage()),
            );
          },
        ),
      ),
    );
  }
}

class BottomPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Bottom Page')),
      body: Center(
        child: ElevatedButton(
          child: Text('Go to Bottom Details'),
          onPressed: () {
            Navigator.of(context).push(
              MaterialPageRoute(builder: (_) => BottomDetailsPage()),
            );
          },
        ),
      ),
    );
  }
}

class BottomDetailsPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Bottom Details Page')),
      body: Center(
        child: Text('This is the Bottom Details Page'),
      ),
    );
  }
}

总结

以上就是本期内容啦,如果你有其他的实现方法,欢迎留言一起讨论交流哦。

相关推荐
AAA大运重卡何师傅(专跑国道)17 分钟前
力扣hot100
服务器·前端·数据库
kTR2hD1qb26 分钟前
Flutter 复杂拖拽排序实战:同源排序 + 跨容器拖拽完整落地
flutter
GISer_Jing31 分钟前
前端沙箱开源项目推荐(React/Next/Vue优先)
前端·react.js·开源
云水一下35 分钟前
CSS3从零基础到精通(三):动感地带——过渡、动画、变形与响应式
前端·css3
KaMeidebaby1 小时前
卡梅德生物技术快报|Western Blot 实验应用:肺肠轴机制研究全流程技术解析
前端·数据库·人工智能·算法·百度
MageGojo1 小时前
做节日活动页时,如何用 API 快速生成对联内容
javascript·python·节日·对联生成
达达爱吃肉1 小时前
claude 接入deepseek 运行报错
java·服务器·前端
jingling5551 小时前
Flutter | Dio网络请求实战
android·开发语言·前端·flutter
向上的车轮2 小时前
Next.js 入门指南:从零到一构建全栈应用
开发语言·javascript·ecmascript
freeinlife'2 小时前
精准秒表计时器实现---基于js
开发语言·前端·javascript