【问题标题】:Open showModalBottomSheet from left side flutter从左侧 flutter 打开 showModalBottomSheet
【发布时间】:2022-11-27 12:39:12
【问题描述】:

我正在使用 ShowModalBottomSheet 。我想从左侧而不是从底部打开它。

【问题讨论】:

标签: flutter dart flutter-layout


【解决方案1】:

为了实现您想要的 UI 要求,您应该创建一个自定义模式表。 这非常简单,您只需制作一个容器并使用补间动画使其可见,它就像模态表一样工作,您可以从开始动画开始改变容器的方向等等。 稍后我将尝试为其添加代码。

这个包帮助你实现侧模态表。 https://pub.dev/packages/side_sheet

或者还有另一种方法,您应该访问此链接,我希望它能满足您的要求。 https://pub.dev/packages/modal_side_sheet

我认为第一个包对你更有帮助,因为它有一些自定义选项,比如你可以选择侧面等。

【讨论】:

  • 您的答案可以通过其他支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写出好的答案的信息in the help center
  • 我真的很感谢你,我会确保我的回答是描述性的,并用一些代码 sn-ps 来理解更多。我真的很感激,我是初学者,你指出了我的错误,所以我会改正并编辑我的尽快发布。(非常感谢)
【解决方案2】:

以防有人仍然需要帮助。您可以结合使用覆盖和补间来创建自定义侧页。

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Custom Sidesheet',
      theme: ThemeData(useMaterial3: true),
      home: const MyHomePage(title: 'Custom Sidesheet'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});
  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin {
  OverlayEntry? sideSheetOverlayEntry;
  final sideSheetOverlayLayerLink = LayerLink();
  bool isSidebarShown = false;

  @override
  void initState() {
    super.initState();
  }

  void showSideSheet() {
    final sideSheetOverlay = Overlay.of(context)!;
    sideSheetOverlayEntry = OverlayEntry(
      builder: (context) => Positioned(
        height: MediaQuery.of(context).size.height,
        child: isSidebarShown
            ? CompositedTransformFollower(
                link: sideSheetOverlayLayerLink,
                child: TweenAnimationBuilder(
                  tween: Tween<double>(begin: 150, end: 300),
                  duration: const Duration(milliseconds: 300),
                  builder: (BuildContext context, double size, Widget? child) {
                    return Material(
                      child: SafeArea(
                        child: Container(
                            width: size,
                            padding: const EdgeInsets.all(10.0),
                            decoration: BoxDecoration(
                              color: Theme.of(context).colorScheme.surface,
                            ),
                            child: Column(
                              children: [
                                Row(
                                  mainAxisAlignment: MainAxisAlignment.end,
                                  children: [
                                    InkWell(
                                      onTap: () {
                                        setState(() {
                                          isSidebarShown = false;
                                          showSideSheet();
                                        });
                                      },
                                      onHover: (value) {},
                                      child: const Icon(
                                        Icons.close,
                                        color: Colors.redAccent,
                                        size: 25.0,
                                      ),
                                    )
                                  ],
                                ),
                                Column(
                                  children: [
                                    Container(
                                      child: Text(
                                        "Custom Side Sheet",
                                        overflow: TextOverflow.ellipsis,
                                        style: const TextStyle(color: Colors.blueGrey),
                                      ),
                                    ),
                                    const Divider(
                                      height: 5.0,
                                      color: Colors.black,
                                    ),
                                    Container(
                                      child: Row(children: [
                                        Icon(
                                          Icons.dashboard,
                                          size: 25.0,
                                          color: Colors.blueGrey,
                                        ),
                                        Text(
                                          "Home",
                                          overflow: TextOverflow.ellipsis,
                                          style: TextStyle(color: Colors.blueGrey, fontSize: 25.0, fontWeight: FontWeight.w300),
                                        )
                                      ]),
                                    )
                                  ],
                                )
                              ],
                            )),
                      ),
                    );
                  },
                ))
            : SizedBox.shrink(),
      ),
    );
    sideSheetOverlay.insert(sideSheetOverlayEntry!);
  }

  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Scaffold(
          appBar: AppBar(
            title: Text(widget.title),
            leading: GestureDetector(
              onTap: () {
                setState(() {
                  isSidebarShown = true;
                  showSideSheet();
                });
              },
              child: Icon(
                Icons.menu_sharp,
                size: 30.0,
              ),
            ),
          ),
          body: Container(
            color: Color.fromRGBO(223, 230, 233, 1.0),
          )),
    );
  }
}

side sheet not active image

side sheet active image

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-28
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    • 2016-06-26
    • 1970-01-01
    相关资源
    最近更新 更多