在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'),
      ),
    );
  }
}

总结

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

相关推荐
子兮曰4 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰4 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万4 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝4 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋4 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁4 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
李少兄4 天前
JavaScript 隐式全局变量解析
javascript
汉堡大王95274 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大4 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师4 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端