Radio de esquina de aleteo con fondo transparente

87

A continuación se muestra mi código que espero representar un contenedor de esquina redonda con un fondo transparente.

return new Container(
                //padding: const EdgeInsets.all(32.0),
                height: 800.0,
                //color: const Color(0xffDC1C17),
                //color: const Color(0xffFFAB91),
                decoration: new BoxDecoration(
                  color: Colors.green, //new Color.fromRGBO(255, 0, 0, 0.0),
                  borderRadius: new BorderRadius.only(
                    topLeft:  const  Radius.circular(40.0),
                    topRight: const  Radius.circular(40.0))
                ),
                child:  new Container(
                    decoration: new BoxDecoration(
                        color: Colors.blue,
                        borderRadius: new BorderRadius.only(
                            topLeft:  const  Radius.circular(40.0),
                            topRight: const  Radius.circular(40.0))
                    ),
                  child: new Center(
                    child: new Text("Hi modal sheet"),
                  )

              ),

Sin embargo, esto es lo que representa, representa un contenedor blanco (se espera que sea transparente) con un radio de esquina redondeado. ¿Alguna ayuda?

captura de pantalla

Kemzie
fuente

Respuestas:

112

Si envuelve su Containercon esquinas redondeadas dentro de un padre con el color de fondo establecido en Colors.transparent, creo que hace lo que está buscando. Si está utilizando un Scaffoldcolor de fondo predeterminado es el blanco. Cambie eso por Colors.transparentsi logra lo que desea.

        new Container(
          height: 300.0,
          color: Colors.transparent,
          child: new Container(
            decoration: new BoxDecoration(
              color: Colors.green,
              borderRadius: new BorderRadius.only(
                topLeft: const Radius.circular(40.0),
                topRight: const Radius.circular(40.0),
              )
            ),
            child: new Center(
            child: new Text("Hi modal sheet"),
           )
         ),
        ),
Albert Lardizábal
fuente
1
Si utilizo la imagen en SliverAppBar , ¿cómo hacerlo?
Md.Abdul Halim Rafi
1
puede usar SliverFillRemaining (child: aboveCode)
JenonD
42

Si desea redondear esquinas con fondo transparente, el mejor enfoque es usar ClipRRect.

return ClipRRect(
  borderRadius: BorderRadius.circular(40.0),
  child: Container(
    height: 800.0,
    width: double.infinity,
    color: Colors.blue,
    child: Center(
      child: new Text("Hi modal sheet"),
    ),
  ),
);
Dat Nguyen
fuente
Esto funciona ... pero al final de mi contenedor el radio os al cuadrado: imgur.com/a/Qb5kaVW . ¿puedes ayudarme?
Augusto
Funciona también con ColorFiltered. El BoxDecorationno corta las esquinas si tiene ColorFiltercon BlendMode.color.
Milan Jaros
cuando se usa con showModalBottomSheet, debe especificar bottomSheetTheme como sugirió @jayjw
Jørgen Andersen
27

A partir del 1 de mayo de 2019, use BottomSheetTheme .

MaterialApp(
    theme: ThemeData(
      // Draw all modals with a white background and top rounded corners
      bottomSheetTheme: BottomSheetThemeData(
        backgroundColor: Colors.white,
        shape: RoundedRectangleBorder(
          borderRadius: BorderRadius.vertical(top: Radius.circular(10))
        )
      )
    ),

Presentado recientemente, usar un tema para controlar el estilo de las hojas debería ser lo mejor para este problema.

Si desea asignar un tema a diferentes hojas inferiores de manera diferente, incluya un nuevo objeto Tema en el subárbol apropiado para anular el tema de la hoja inferior solo para esa área.

Si por alguna razón aún desea anular el tema manualmente al iniciar una hoja inferior, showBottomSheet y showModalBottomSheet ahora tienen un parámetro backgroundColor . Úselo así:

 showModalBottomSheet(
    backgroundColor: Colors.transparent,
    context: context,
    builder: (c) {return NavSheet();},
  );

El uso del tema permite que las hojas inferiores se reutilicen independientemente del tema actual de la aplicación / aplicación, y no tiene ninguno de los efectos secundarios negativos de configurar el color del lienzo como se mencionó.

Jayjw
fuente
Esta debería ser la respuesta aceptada ... ¡funciona perfectamente!
John Detlefs
backgroundColor: Colors.transparent,trabajó para mí
tudorprodan
15
/// Create the bottom sheet UI
  Widget bottomSheetBuilder(){
    return Container(
      color: Color(0xFF737373), // This line set the transparent background
      child: Container(
        decoration: BoxDecoration(
          color: Colors.white,
            borderRadius: BorderRadius.only(
                topLeft: Radius.circular(16.0),
                topRight: Radius.circular( 16.0)
            )
        ),
        child: Center( child: Text("Hi everyone!"),)
      ),
    );
  }

Llame a esto para mostrar el BotoomSheet con esquinas:

/// Show the bottomSheet when called
  Future _onMenuPressed() async {
    showModalBottomSheet(
        context: context,
        builder: (widgetBuilder) => bottomSheetBuilder()
    );
  }
Pedro Massango
fuente
14

Es una vieja pregunta. Pero para aquellos que se encuentren con esta pregunta ...

El fondo blanco detrás de las esquinas redondeadas no es en realidad el contenedor. Ese es el color del lienzo de la aplicación.

PARA REPARAR: Cambie el color del lienzo de su aplicación a Colors.transparent

Ejemplo:

return new MaterialApp(
  title: 'My App',
  theme: new ThemeData(
    primarySwatch: Colors.green,
    canvasColor: Colors.transparent, //----Change to this------------
    accentColor: Colors.blue,
  ),
  home: new HomeScreen(),
);
Jorge Menjivar
fuente
Tiene algunos inconvenientes. Otros objetos que dependen del color del lienzo, como el icono de actualización, también tendrán un fondo transparente, en lugar de blanco.
Jorge Menjivar
3
No recomendaría hacer esto. Muchos widgets se basan en el color del lienzo y todos deberían configurarse individualmente.
mauriii
mejor respuesta, esta debería ser la respuesta principal.
Alvin Quezon
cuando se utilice esto, todo canvasColorde aleteo widgets cambiará a color.transparent, intenta abrir el cajón, lo que u ver!
Nourein
¡Finalmente! Resolvió mi problema.
mbartn
8
Scaffold(
  appBar: AppBar(
    title: Text('BMI CALCULATOR'),
  ),
  body: Container(
    height: 200,
    width: 170,
    margin: EdgeInsets.all(15),
    decoration: BoxDecoration(
      color: Color(
        0xFF1D1E33,
      ),
      borderRadius: BorderRadius.circular(5),
    ),
  ),
);
Rhys Coombes
fuente
3

Utilice un color de fondo transparente para la hoja inferior modal y dé un color diferente para la decoración de la caja


   showModalBottomSheet(
      backgroundColor: Colors.transparent,
      context: context, builder: (context) {
    return Container(

      decoration: BoxDecoration(
        color: Colors.white,
        borderRadius: BorderRadius.only(
            topLeft:Radius.circular(40) ,
            topRight: Radius.circular(40)
        ),
      ),
      padding: EdgeInsets.symmetric(vertical: 20,horizontal: 60),
      child: Settings_Form(),
    );
  });
Aditya A. Rajan
fuente
0
class MyApp2 extends StatelessWidget {

  @override
  Widget build(BuildContext context) { 
    return MaterialApp( 
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        appBarTheme: AppBarTheme(
          elevation: 0,
          color: Colors.blueAccent,
        )
      ),
      title: 'Welcome to flutter ',
      home: HomePage()
    );
  }
}

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {

  int number = 0;
  void _increment(){
   setState(() {
      number ++;
   });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        backgroundColor: Colors.blueAccent,
        appBar: AppBar(
          title: Text('MyApp2'), 
          leading: Icon(Icons.menu),
          // backgroundColor: Colors.blueAccent,

          ),
        body: Container(
          decoration: BoxDecoration(
            borderRadius: BorderRadius.only(
              topLeft: Radius.circular(200.0),
              topRight: Radius.circular(200)
            ), 
            color: Colors.white,
          ),
        )
      );
  }
}
Igbani Izuchukwu
fuente
0
showModalBottomSheet(
   context: context,
   builder: (context) => Container(
            color: Color(0xff757575), //background color 
            child:  new Container(
                decoration: new BoxDecoration(
                    color: Colors.blue,
                    borderRadius: new BorderRadius.only(
                        topLeft:  const  Radius.circular(40.0),
                        topRight: const  Radius.circular(40.0))
                ),
              child: new Center(
                child: new Text("Hi modal sheet"),
              )

     

 ),

)

Esto hará que el color del contenedor sea el mismo que el color de fondo. Y habrá un contenedor secundario de la misma altura y ancho con color azul. Esto hará que la esquina tenga el mismo color que el color de fondo.

Mohit Chachra
fuente