Partager via


Itinéraires contextuels flutter prenant en compte la charnière

Lorsque votre application est étendue sur le Surface Duo, les boîtes de dialogue s’affichent sur le premier écran, qui est l’écran de gauche pour les configurations de gauche à droite. Le paramètre anchorPoint facultatif sur la showDialog méthode vous permet de remplacer ce comportement. Les menus contextuels évitent la charnière par défaut. Si votre code a des itinéraires modals personnalisés, vous pouvez les encapsuler avec DisplayFeatureSubScreen pour éviter le chevauchement de la charnière.

Par défaut, cette boîte de dialogue s’affiche sur l’écran gauche pour les configurations de gauche à droite et sur l’écran de droite pour les configurations de droite à gauche :

showDialog(
    context: context,
    builder: (_) => AlertDialog(
        title: Text("Hinge Aware Dialog"),
        content: Text("Going on the left screen"),
    ),
);

Boîte de dialogue Flutter surface Duo sur l’écran gauche

Nous pouvons forcer la boîte de dialogue à s’afficher sur l’écran de droite à l’aide du anchorPoint paramètre . Cela fonctionne comme une cible que nous pouvons utiliser pour sélectionner l’écran souhaité :

showDialog(
    context: context,
    builder: (_) => AlertDialog(
        title: Text("Hinge Aware Dialog"),
        content: Text("Going on the right screen"),
    ),
    anchorPoint: Offset(1000, 1000),
);

Boîte de dialogue Flutter du Surface Duo sur l’écran droit

Itinéraires personnalisés

Vous pouvez avoir vos propres classes de routage modales ou contextuelles dans votre application, que vous souhaitez rendre compatible avec la charnière. Utilisez le DisplayFeatureSubScreen widget pour encapsuler votre itinéraire modal. Ajoutez-le en haut de la disposition de votre itinéraire pour éviter la charnière. Ce widget prend également un anchorPoint paramètre :

class _MyRoute<T> extends PopupRoute<T> {
    @override
    Widget buildPage(BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation) {
        return DisplayFeatureSubScreen(
            child: _myPageLayout(), // the previous content of buildPage
            anchorPoint: Offset.infinite,
        );
    }
}