Condividi tramite


Route popup in grado di riconoscimento della cerniera flutter

Quando l'applicazione è estesa in Surface Duo, le finestre di dialogo vengono visualizzate nella prima schermata, ovvero la schermata sinistra per le configurazioni da sinistra a destra. Il parametro anchorPoint facoltativo nel showDialog metodo consente di eseguire l'override di questo comportamento. I menu popup evitano la cerniera per impostazione predefinita. Se il codice include route modali personalizzate, è possibile eseguirne il wrapping con DisplayFeatureSubScreen per evitare la sovrapposizione della cerniera.

Per impostazione predefinita, questa finestra di dialogo viene visualizzata nella schermata sinistra per le configurazioni da sinistra a destra e la schermata destra per le configurazioni da destra a sinistra:

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

Finestra di dialogo Flutter di Surface Duo nella schermata sinistra

È possibile forzare il dialogo a passare alla schermata destra usando il anchorPoint parametro . Queste funzioni come una destinazione che è possibile usare per selezionare la schermata desiderata:

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

Finestra di dialogo Flutter di Surface Duo sullo schermo destro

Route personalizzate

Nella tua app potrebbero essere presenti classi di route modali o popup personalizzate, che vuoi rendere compatibile con la cerniera. Usare il widget per eseguire il DisplayFeatureSubScreen wrapping della route modale. Aggiungerlo nella parte superiore del layout della route per evitare la cerniera. Questo widget accetta anche un anchorPoint parametro:

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,
        );
    }
}