Портрет / Пейзаж на экране в приложении флаттера - PullRequest
1 голос
/ 27 апреля 2020

Создание флаттера. Я хочу, чтобы одна страница отображалась в альбомной ориентации, а остальная часть приложения - в портретной. Я могу добиться этого, используя методы, которые я нашел здесь и в других местах, но это не очень хорошо работает. При первоначальном входе в ландшафтный экран возникает своего рода «дрожь», в то время как приложение, похоже, выясняет, что делать. Тогда это отображается нормально. Но при возвращении исходный экран сначала отображается в альбомной ориентации в течение значительного времени (почти секунды), а затем возникает еще одно «дрожание», прежде чем экран отображается в портретной ориентации. Упрощенный main.dart ниже. Что я делаю не так?


import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

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

class ScreenOne extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('screen one'),
      ),
      body: Column(
        children: <Widget>[
          Center(
            child: Text('some text'),
          ),
          RaisedButton(
            child: Text('Go to screen two'),
            onPressed: () {
              Navigator.pushNamed(
                context,
                'screenTwo',
              );
            },
          )
        ],
      ),
    );
  }
}

class ScreenTwo extends StatefulWidget {
  @override
  _ScreenTwoState createState() => _ScreenTwoState();
}

class _ScreenTwoState extends State<ScreenTwo> {
  @override
  void dispose() {
    SystemChrome.setPreferredOrientations([
      DeviceOrientation.portraitUp,
    ]);
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    if (MediaQuery.of(context).orientation != null) {
      SystemChrome.setPreferredOrientations([
        DeviceOrientation.landscapeLeft,
      ]);
    }
    return Scaffold(
      appBar: AppBar(
        title: Text('screen two'),
      ),
      body: Center(
        child: Text('other text'),
      ),
    );
  }
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: ScreenOne(),
      routes: {
        'screenTwo': (ctx) => ScreenTwo(),
      },
    );
  }
}

1 Ответ

1 голос
/ 27 апреля 2020

Измените ваш второй экран следующим образом

return WillPopScope(
      onWillPop: () {
        SystemChrome.setPreferredOrientations([
          DeviceOrientation.portraitUp,
        ]);
        Navigator.of(context).pop();
        //we need to return a future
        return Future.value(false);
      },
      child: Scaffold(
        appBar: AppBar(
          title: Text('screen two'),
        ),
        body: Center(
          child: Text('other text'),
        ),
      ),
    );
...