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

总结

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

相关推荐
顾北128 小时前
AI对话应用接口开发全解析:同步接口+SSE流式+智能体+前端对接
前端·人工智能
iDao技术魔方8 小时前
深入Vue 3响应式系统:为什么嵌套对象修改后界面不更新?
javascript·vue.js·ecmascript
ujainu8 小时前
护眼又美观:Flutter + OpenHarmony 鸿蒙记事本一键切换夜间模式(四)
android·flutter·harmonyos
ujainu8 小时前
让笔记触手可及:为 Flutter + OpenHarmony 鸿蒙记事本添加实时搜索(二)
笔记·flutter·openharmony
一只大侠的侠8 小时前
Flutter开源鸿蒙跨平台训练营 Day 13从零开发注册页面
flutter·华为·harmonyos
历程里程碑8 小时前
普通数组-----除了自身以外数组的乘积
大数据·javascript·python·算法·elasticsearch·搜索引擎·flask
摸鱼的春哥8 小时前
春哥的Agent通关秘籍07:5分钟实现文件归类助手【实战】
前端·javascript·后端
念念不忘 必有回响8 小时前
viepress:vue组件展示和源码功能
前端·javascript·vue.js
Amumu121388 小时前
Vue3 Composition API(一)
开发语言·javascript·ecmascript
C澒8 小时前
多场景多角色前端架构方案:基于页面协议化与模块标准化的通用能力沉淀
前端·架构·系统架构·前端框架