Есть ли способ изменить форму диалога? - PullRequest
0 голосов
/ 03 октября 2018

Я просматривал свойства для различных диалоговых классов и не видел ничего, что могло бы изменить его форму.Есть ли способ изменить форму диалогов?

Ответы [ 2 ]

0 голосов
/ 04 апреля 2019

Вот так

Dialog(
  shape: RoundedRectangleBorder(
    borderRadius: BorderRadius.circular(8.0),
  ),
  child: Text('Dialog'),
);
0 голосов
/ 04 октября 2018

Вы можете создавать различные диалоговые окна, используя Container в сочетании с существующими виджетами отсечения ( Рисунки и виджеты эффектов ) или расширением CustomClipper.Ниже приведен диалог в форме ромба.Существуют такие виджеты, как ClipOval, которые работают без каких-либо настроек (см. Скриншот ниже).Если вы хотите попробовать ClipOval, просто замените ClipPath на ClipOval и закомментируйте clipper:.Ознакомьтесь с классом painting.dart, чтобы узнать о создании пользовательских путей.

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Shaped Dialog Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        dialogBackgroundColor: Colors.transparent,
      ),
      home: MyHomePage(title: 'Flutter Shaped Dialog Demo'),
    );
  }
}

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(
      floatingActionButton: FloatingActionButton(
          child: Icon(Icons.add),
          onPressed: () {
            _showShapedDialog();
          }),
    );
  }

  _showShapedDialog() {
    showDialog(
      context: context,
      builder: (context) {
        return Padding(
          padding: const EdgeInsets.fromLTRB(24.0, 20.0, 24.0, 24.0),
          child: ClipPath(
            child: Material(
              color: Colors.white,
              child: Center(
                child: Container(
                  alignment: FractionalOffset.center,
                  height: MediaQuery.of(context).size.width / 2.0,
                  width: MediaQuery.of(context).size.width / 2.0,
                  decoration: BoxDecoration(
                    border: Border.all(),
                  ),
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: <Widget>[
                      Padding(
                        padding: const EdgeInsets.only(bottom: 20.0),
                        child: Text(
                          'Clipping to a path is expensive. Certain shapes have more optimized widgets.',
                          textAlign: TextAlign.center,
                        ),
                      ),
                      FlatButton(
                        child: Text(
                          'OK',
                          style: TextStyle(color: Colors.blue),
                        ),
                        onPressed: () {
                          Navigator.pop(context);
                        },
                      ),
                    ],
                  ),
                ),
              ),
            ),
            clipper: _MyClipper(), // Comment this out if you want to replace ClipPath with ClipOval
          ),
        );
      },
    );
  }
}

class _MyClipper extends CustomClipper<Path> {
  @override
  Path getClip(Size size) {
    final path = Path();
    path.lineTo(size.width / 2.0, 0.0);
    path.lineTo(0.0, size.height / 2.0);
    path.lineTo(size.width / 2.0, size.height);
    path.lineTo(size.width, size.height / 2.0);
    path.lineTo(size.width / 2.0, 0.0);
    path.close();
    return path;
  }

  @override
  bool shouldReclip(CustomClipper<Path> oldClipper) => false;
}

Diamond-shaped dialog using ClipPath

Dialog using ClipOval

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...