flutter bottomSheet 控件详解

文章目录

      • [1. Persistent BottomSheet](#1. Persistent BottomSheet)
        • [示例:创建一个 Persistent BottomSheet](#示例:创建一个 Persistent BottomSheet)
        • 解释:
      • [2. Modal BottomSheet](#2. Modal BottomSheet)
        • [示例:创建一个 Modal BottomSheet](#示例:创建一个 Modal BottomSheet)
        • 解释:
      • [3. BottomSheet 的交互和手势](#3. BottomSheet 的交互和手势)
        • [示例:实现拖动关闭的 BottomSheet](#示例:实现拖动关闭的 BottomSheet)
        • 解释:
      • [4. `BottomSheet` 的样式和自定义](#4. BottomSheet 的样式和自定义)
        • [示例:自定义 BottomSheet 样式](#示例:自定义 BottomSheet 样式)
        • 解释:
      • [5. 总结](#5. 总结)

BottomSheet 是 Flutter 中一个非常重要的控件,它用于从屏幕的底部滑出一个面板,提供额外的内容或操作。 BottomSheet 提供了一种非常灵活的方式来展示额外的信息、操作选项或交互组件,通常用于显示不需要占用整个屏幕空间的临时内容。

Flutter 提供了两种类型的 BottomSheet

  1. Persistent BottomSheet:持久的底部面板,通常用于显示一些永久存在的内容,如过滤选项、音量控制等。用户可以与它交互并保持它可见。
  2. Modal BottomSheet :模态底部面板,它会覆盖内容并要求用户做出选择或操作。用户在与 Modal BottomSheet 交互时,通常无法与屏幕上的其他内容交互,直到面板被关闭。

1. Persistent BottomSheet

Persistent BottomSheet 是一种常驻底部面板,它不会阻塞用户的其他操作。用户可以与屏幕上的其他内容交互,面板也可以通过手势滑动或编程方式来隐藏。

示例:创建一个 Persistent BottomSheet
dart 复制代码
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Persistent BottomSheet Example"),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 打开 Persistent BottomSheet
            showBottomSheet(
              context: context,
              builder: (context) {
                return Container(
                  height: 200,
                  color: Colors.blue,
                  child: Center(child: Text('Persistent BottomSheet')),
                );
              },
            );
          },
          child: Text("Show BottomSheet"),
        ),
      ),
    );
  }
}
解释:
  • showBottomSheet 方法用于显示一个持久的底部面板。当点击按钮时,底部面板从屏幕底部滑出。
  • 该面板上的内容可以自由滚动,且用户可以与屏幕上的其他控件进行交互。

Modal BottomSheet 是模态底部面板,它会覆盖屏幕的部分内容并要求用户操作。用户需要关闭这个面板才能继续与屏幕上的其他内容交互。Modal BottomSheet 通常用于展示选择列表、表单等交互式内容。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Modal BottomSheet Example"),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 打开 Modal BottomSheet
            showModalBottomSheet(
              context: context,
              builder: (context) {
                return Container(
                  height: 200,
                  color: Colors.green,
                  child: Center(child: Text('Modal BottomSheet')),
                );
              },
            );
          },
          child: Text("Show Modal BottomSheet"),
        ),
      ),
    );
  }
}
解释:
  • showModalBottomSheet 方法会创建一个模态底部面板,用户无法在面板关闭之前与其他屏幕内容交互。
  • builder 回调用于定义面板的内容。该面板通常会遮盖屏幕底部的内容。

3. BottomSheet 的交互和手势

BottomSheet 支持拖动操作,允许用户通过滑动来打开或关闭面板。用户可以通过手势或编程方式控制 BottomSheet 的状态。

示例:实现拖动关闭的 BottomSheet
dart 复制代码
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("BottomSheet with Gesture"),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            showModalBottomSheet(
              context: context,
              builder: (context) {
                return Container(
                  height: 200,
                  color: Colors.red,
                  child: Center(child: Text('Drag me to close')),
                );
              },
            );
          },
          child: Text("Show Modal BottomSheet"),
        ),
      ),
    );
  }
}
解释:
  • showModalBottomSheet 显示一个模态底部面板,可以通过手势拖动来关闭面板。
  • showBottomSheet 的面板也支持滑动手势来关闭,但这个例子集中于 Modal BottomSheet 的手势操作。

4. BottomSheet 的样式和自定义

你可以自定义 BottomSheet 的样式,包括颜色、圆角、阴影等。通过在 builder 中返回自定义布局,你可以非常灵活地设计 BottomSheet

示例:自定义 BottomSheet 样式
dart 复制代码
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Custom BottomSheet Example"),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            showModalBottomSheet(
              context: context,
              shape: RoundedRectangleBorder(
                borderRadius: BorderRadius.only(
                  topLeft: Radius.circular(20),
                  topRight: Radius.circular(20),
                ),
              ),
              builder: (context) {
                return Container(
                  height: 250,
                  color: Colors.orange,
                  child: Center(child: Text('Custom BottomSheet')),
                );
              },
            );
          },
          child: Text("Show Custom BottomSheet"),
        ),
      ),
    );
  }
}
解释:
  • 这里我们通过 shape 属性自定义了底部面板的圆角样式。
  • 使用 RoundedRectangleBorder 来设置底部面板的圆角效果,使得它看起来更加美观。

5. 总结

BottomSheet 是 Flutter 中一个非常有用的控件,它可以提供一种从屏幕底部滑出的界面,用户可以交互并获得更多的信息或操作选项。Flutter 提供了两种类型的 BottomSheet

  1. Persistent BottomSheet:适合显示持久的内容或操作,用户可以与其他界面内容交互。
  2. Modal BottomSheet:适合显示临时的交互内容,用户需要完成操作或关闭面板才能继续与界面交互。

BottomSheet 提供了灵活的自定义选项,支持手势操作、样式设置和动态内容。无论是简单的底部面板,还是需要复杂交互的模态面板,BottomSheet 都可以满足需求。


结束语

Flutter是一个由Google开发的开源UI工具包,它可以让您在不同平台上创建高质量、美观的应用程序,而无需编写大量平台特定的代码。我将学习和深入研究Flutter的方方面面。从基础知识到高级技巧,从UI设计到性能优化,欢饮关注一起讨论学习,共同进入Flutter的精彩世界!

相关推荐
提子拌饭1334 小时前
风息时钟:鸿蒙Flutter 实现的自然风格时钟应用
flutter·华为·架构·开源·harmonyos
浮芷.7 小时前
Flutter 框架跨平台鸿蒙开发 - AR动物互动应用
flutter·ar·harmonyos
SharpCJ7 小时前
Android 开发者为什么必须掌握 AI 能力?端侧视角下的技术变革
android·ai·aigc
_李小白7 小时前
【OSG学习笔记】Day 38: TextureVisitor(纹理访问器)
android·笔记·学习
JJay.8 小时前
Kotlin 高阶函数学习指南
android·开发语言·kotlin
jinanwuhuaguo8 小时前
截止到4月8日,OpenClaw 2026年4月更新深度解读剖析:从“能力回归”到“信任内建”的范式跃迁
android·开发语言·人工智能·深度学习·kotlin
加农炮手Jinx8 小时前
Flutter 组件 conventional 适配鸿蒙 HarmonyOS 实战:约定式提交标准,构建自动化版本治理与 CI/CD 质量治理架构
flutter·harmonyos·鸿蒙·openharmony
王码码20358 小时前
Flutter 三方库 appstream 的鸿蒙化适配指南 - 驾驭 Linux 生态元数据规范,打造高性能、标准化、国际化的 OpenHarmony 桌面应用商店分发基石
flutter·harmonyos·鸿蒙·openharmony
见山是山-见水是水8 小时前
Flutter 框架跨平台鸿蒙开发 - AR植物养护助手
flutter·华为·ar·harmonyos
JJay.8 小时前
Android Kotlin 协程使用指南
android·开发语言·kotlin