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

总结

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

相关推荐
长存祈月心9 分钟前
Rust 迭代器适配器
java·服务器·前端
先树立一个小目标14 分钟前
puppeteer生成PDF实践
前端·javascript·pdf
冲刺逆向17 分钟前
【js逆向案例二】瑞数6 深圳大学某医院
前端·javascript·vue.js
啃火龙果的兔子18 分钟前
Promise.all和Promise.race的区别
前端
马达加斯加D21 分钟前
Web身份认证 --- OAuth授权机制
前端
2401_8370885021 分钟前
Error:Failed to load resource: the server responded with a status of 401 ()
开发语言·前端·javascript
全栈师22 分钟前
LigerUI下frm与grid的交互
java·前端·数据库
叫我詹躲躲22 分钟前
被前端存储坑到崩溃?IndexedDB 高效用法帮你少走 90% 弯路
前端·indexeddb
无尽夏_23 分钟前
CSS3(前端基础)
前端·css·1024程序员节
温宇飞24 分钟前
Next.js 简述 - React 全栈框架
前端