【问题标题】:How can create this type of dialog in Flutter?如何在 Flutter 中创建这种类型的对话框?
【发布时间】:2021-03-05 21:09:44
【问题描述】:

我想创建一个对话框底部工作表,如下图 gif 所示。当显示对话框按钮仍可点击时,按钮来自第一个屏幕。

我的结果

【问题讨论】:

标签: flutter dialog


【解决方案1】:

有关底部表格的更多信息,请查看documentaton

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

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: RaisedButton(
          onPressed: () {
            _settingModalBottomSheet();
          },
          child: Text('Show Bottom Sheet'),
        ),
      ),
    );
  }

  void _settingModalBottomSheet() {
    showModalBottomSheet(
      context: context,
      builder: (BuildContext bc) {
        return Container(
          child: Wrap(
            children: <Widget>[
              ListTile(
                  leading: Icon(Icons.music_note),
                  title: Text('Music'),
                  onTap: () => {}),
              ListTile(
                leading: Icon(Icons.videocam),
                title: Text('Video'),
                onTap: () => {},
              ),
            ],
          ),
        );
      },
    );
  }
}

【讨论】:

  • 也许你不明白我的目的。我需要底部位置的按钮,然后使用该按钮打开对话框而不覆盖我的按钮。
【解决方案2】:

您可以通过3 方式获得此信息(首先2 方式将根据需要隐藏付款部分)

`案例 1 - 使用全局密钥

import 'package:flutter/material.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();

  runApp(MaterialApp(
    home: BottomWidget(),
  ));
}

class BottomWidget extends StatelessWidget {
  final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey<ScaffoldState>();
  void showOrdersModel(BuildContext context) {
    scaffoldKey.currentState.showBottomSheet((context) {
      return Container(
        height: 250, // change height as required
        decoration: BoxDecoration(
          color: Colors.white,
          boxShadow: [
            BoxShadow(
              blurRadius: 10,
              color: Colors.grey[300],
              spreadRadius: 5,
            ),
          ],
          borderRadius: BorderRadius.only(
            topLeft: Radius.circular(12),
            topRight: Radius.circular(12),
          ),
        ),
        child: Center(child: Text('Orders')),
      );
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      key: scaffoldKey,
      body: Center(
        child: RaisedButton(
          onPressed: () => showOrdersModel(context), // pass context to work
          child: Text('Show my orders'),
        ),
      ),
    );
  }
}

Case 2 - Use scaffold 注意:您需要Scaffold 小部件

import 'package:flutter/material.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();

  runApp(MaterialApp(
    home: BottomWidget(),
  ));
}

class BottomWidget extends StatefulWidget {
  @override
  _BottomWidgetState createState() => _BottomWidgetState();
}

class _BottomWidgetState extends State<BottomWidget> {
  void showOrdersModel(BuildContext context) {
    Scaffold.of(context).showBottomSheet((context) {
      return Container(
        height: 250, // change height as required
        decoration: BoxDecoration(
          color: Colors.white,
          boxShadow: [
            BoxShadow(
              blurRadius: 10,
              color: Colors.grey[300],
              spreadRadius: 5,
            ),
          ],
          borderRadius: BorderRadius.only(
            topLeft: Radius.circular(12),
            topRight: Radius.circular(12),
          ),
        ),
        child: Center(child: Text('Orders')),
      );
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Builder(
        builder: (ctx) => Center(
          child: RaisedButton(
            onPressed: () => showOrdersModel(ctx), // pass context to work
            child: Text('Show my orders'),
          ),
        ),
      ),
    );
  }
}

Case 3 - Use showModalBottomSheet来自颤抖

import 'package:flutter/material.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();

  runApp(MaterialApp(
    home: BottomWidget(),
  ));
}

class BottomWidget extends StatelessWidget {
  void showOrdersModel(BuildContext context) {
    showModalBottomSheet(
      context: context,
      shape: RoundedRectangleBorder( // apply this to get the rounder corners
        borderRadius: BorderRadius.vertical(
          top: Radius.circular(20),
        ),
      ),
      clipBehavior: Clip.antiAliasWithSaveLayer,
      builder: (ctx) {
        return Container(
          height: 250, // change height as required
          color: Colors.transparent,
          child: Center(child: Text('Orders')),
        );
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: RaisedButton(
          onPressed: () => showOrdersModel(context), // pass context to work
          child: Text('Show my orders'),
        ),
      ),
    );
  }
}

【讨论】:

  • 但是当我在打开对话框时将按钮点击移动到底部时,它会覆盖我的按钮。你对此有什么想法吗?
  • 对不起,我的代码太长了,无法附加。您可以尝试将按钮放在底部,然后单击打开对话框,您将看到。
猜你喜欢
  • 2018-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-16
  • 2020-01-10
  • 2021-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多