showModalBottomSheet ne fournit aucun style ni aucune décoration. Je souhaite créer quelque chose comme la feuille de calcul Google Tasks.
Il s'agit de la fonction modalBottomSheet nécessaire.
void _modalBottomSheetMenu(){
showModalBottomSheet(
context: context,
builder: (builder){
return new Container(
height: 350.0,
color: Colors.transparent, //could change this to Color(0xFF737373),
//so you don't have to change MaterialApp canvasColor
child: new Container(
decoration: new BoxDecoration(
color: Colors.white,
borderRadius: new BorderRadius.only(
topLeft: const Radius.circular(10.0),
topRight: const Radius.circular(10.0))),
child: new Center(
child: new Text("This is a modal sheet"),
)),
);
}
);
}
La partie la plus importante de ce fonctionnement est également, dans MaterialApp, définissez canvasColor sur transparent comme celui illustré ci-dessous.
return new MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Tasks',
theme: new ThemeData(
primarySwatch: Colors.teal,
canvasColor: Colors.transparent,
),
home: new TasksHomePage(),
);
}
J'ai testé le code et cela fonctionne très bien car je faisais également un clone de l'application Google Tasks qui sera ouverte dans mon github .
Vous pouvez maintenant le faire en utilisant la méthode par défaut showModalBottomSheet
qui prend désormais en charge l'ajout d'un ShapeBorder
et également backgroundColor
!
showModalBottomSheet(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10.0),
),
backgroundColor: Colors.white,
...
);
Au lieu de remplacer le thème entier de l'application (ce qui a causé des problèmes dans diverses parties de mon application) comme suggéré par d'autres réponses, j'ai décidé de jeter un œil à l'implémentation de showModalBottomSheet
et de trouver le problème moi-même. Il s'avère que tout ce qui était nécessaire était d'encapsuler le code principal du modal dans un widget Theme
qui contient le canvasColor: Colors.transparent
tour. J'ai également facilité la personnalisation du rayon et de la couleur du modal lui-même.
Vous pouvez utiliser soit le package sur pub ou un Gist contenant le même code. N'oubliez pas d'importer le package/fichier approprié.
showRoundedModalBottomSheet(
context: context,
radius: 20.0, // This is the default
color: Colors.white, // Also default
builder: (context) => ???,
);
Vous pouvez maintenant simplement définir l'argument shape
. Exemple:
showModalBottomSheet(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(10.0)),
),
context: context,
builder: (context) => MyBottomSheet(),
);
En rassemblant toutes les réponses avant, j'ai pu obtenir le meilleur résultat possible (à mon avis) pour cela.
showModalBottomSheet(
context: context,
backgroundColor: Colors.white,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.only(topLeft: Radius.circular(15.0), topRight: Radius.circular(15.0)),
),
builder: (context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
ListTile(
leading: Icon(Icons.email),
title: Text('Send email'),
onTap: () {
print('Send email');
},
),
ListTile(
leading: Icon(Icons.phone),
title: Text('Call phone'),
onTap: () {
print('Call phone');
},
),
],
);
});