Flutter rozmiar ekranu


89

Stworzyłem nową aplikację na flutterze i miałem problemy z rozmiarami ekranu podczas przełączania się między różnymi urządzeniami.

Stworzyłem aplikację przy użyciu rozmiaru ekranu Pixel 2XL, a ponieważ miałem kontenery z elementem podrzędnym ListView, poproszono mnie o podanie wysokości i szerokości kontenera.

Więc kiedy przełączam urządzenie na nowe urządzenie, pojemnik jest za długi i wyświetla błąd.

Jak mogę to zrobić, aby aplikacja była zoptymalizowana dla wszystkich ekranów?



1
> Miałem kontenery z elementem potomnym ListView, proszono mnie o podanie wysokości i szerokości kontenera. możesz wyjaśnić? Możesz utworzyć widok listy, który po prostu zajmuje całą przestrzeń. Czy możesz udostępnić swój układ?
— wasyl

Odpowiedzi:


239

Możesz użyć:

  • double width = MediaQuery.of(context).size.width;
  • double height = MediaQuery.of(context).size.height;

Aby uzyskać wysokość tylko SafeArea (dla iOS 11 i nowszych):

  • var padding = MediaQuery.of(context).padding;
  • double newheight = height - padding.top - padding.bottom;

3
Jak uzyskać rozmiar aplikacji bez bezpiecznego obszaru
— user7856586

43

Zdobycie widthjest łatwe, ale heightmoże być trudne , oto sposoby radzenia sobieheight

// Full screen width and height
double width = MediaQuery.of(context).size.width;
double height = MediaQuery.of(context).size.height;

// Height (without SafeArea)
var padding = MediaQuery.of(context).padding;
double height1 = height - padding.top - padding.bottom;

// Height (without status bar)
double height2 = height - padding.top;

// Height (without status and toolbar)
double height3 = height - padding.top - kToolbarHeight;

1
Świetny! Właśnie tego chciałem. To szalone, że pominąłem obliczenie wysokości bezpiecznego obszaru, aby narysować moje widoki. Przez cały ten czas zastanawiałem się, co się dzieje! : D Pozdrawiam!
— Rohit TP,

17

Poniższy kod czasami nie zwraca prawidłowego rozmiaru ekranu:

MediaQuery.of(context).size

Testowałem na SAMSUNG SM-T580, który zwraca {width: 685.7, height: 1097.1}zamiast rzeczywistej rozdzielczości 1920x1080.

Proszę użyć:

import 'dart:ui';

window.physicalSize;

13
Wygląda na to, że MediaQuery.of(context).sizezwraca logiczne piksele. Ale to samo będzie używane przez inne widżety Flutter. Więc w sumie otrzymasz proporcjonalny rozmiar, jeśli tego potrzebujesz. Jeśli potrzebujesz dokładnej wartości piksela urządzenia można zrobić coś takiego, na przykład o szerokości: MediaQuery.of(context).size.width * MediaQuery.of(context).devicePixelRatio. Właśnie napisałem artykuł na ten temat, na wypadek gdyby więcej ludzi szukało
— Miha

5

MediaQuery.of(context).size.widthi MediaQuery.of(context).size.heightdziała świetnie, ale za każdym razem trzeba pisać wyrażenia takie jak szerokość / 20, aby ustawić określoną wysokość i szerokość.

Stworzyłem nową aplikację na flutterze i miałem problemy z rozmiarami ekranu podczas przełączania się między różnymi urządzeniami.

Tak, dostępna flutter_screenutil wtyczka umożliwiająca dostosowanie rozmiaru ekranu i czcionki. Pozwól, aby Twój interfejs użytkownika wyświetlał rozsądny układ na różnych rozmiarach ekranu!

Stosowanie:

Dodaj zależność :

Przed instalacją sprawdź najnowszą wersję.

dependencies:
  flutter:
    sdk: flutter
  # add flutter_ScreenUtil
  flutter_screenutil: ^0.4.2

Dodaj następujące importy do swojego kodu Dart:

import 'package:flutter_screenutil/flutter_screenutil.dart';

Zainicjuj i ustaw rozmiar dopasowania i rozmiar czcionki zgodnie ze skalą zgodnie z opcją dostępności „rozmiar czcionki” systemu

//fill in the screen size of the device in the design

//default value : width : 1080px , height:1920px , allowFontScaling:false
ScreenUtil.instance = ScreenUtil()..init(context);

//If the design is based on the size of the iPhone6 ​​(iPhone6 ​​750*1334)
ScreenUtil.instance = ScreenUtil(width: 750, height: 1334)..init(context);

//If you wang to set the font size is scaled according to the system's "font size" assist option
ScreenUtil.instance = ScreenUtil(width: 750, height: 1334, allowFontScaling: true)..init(context);

Posługiwać się:

//for example:
//rectangle
Container(
           width: ScreenUtil().setWidth(375),
           height: ScreenUtil().setHeight(200),
           ...
            ),

////If you want to display a square:
Container(
           width: ScreenUtil().setWidth(300),
           height: ScreenUtil().setWidth(300),
            ),

Proszę odnieść się zaktualizowaną dokumentację po więcej szczegółów

Uwaga: przetestowałem i używam tej wtyczki, która naprawdę działa świetnie na wszystkich urządzeniach, w tym na iPadzie

Mam nadzieję, że to komuś pomoże


jeśli używasz tej wtyczki, oznacza to, że możesz zdefiniować tylko 1 szerokość i wysokość, na przykład jeśli używasz iPhone'a 6 (iPhone6 ​​750 * 1334), musisz użyć tych wartości, ale jak to sprawi, że będzie responsywny na wszystkich różnych iPhone'ach ????
— GY22

ustawiasz swój projekt podstawowy tylko na podstawie jednego rozmiaru ekranu. Wtyczka dostosowuje się poprawnie do różnych rozmiarów ekranu
— Marc

1

Hej, możesz użyć tej klasy, aby uzyskać procentową szerokość i wysokość ekranu

import 'package:flutter/material.dart';
class Responsive{
  static width(double p,BuildContext context)
  {
    return MediaQuery.of(context).size.width*(p/100);
  }
  static height(double p,BuildContext context)
  {
    return MediaQuery.of(context).size.height*(p/100);
  }
}

i używać w ten sposób

Container(height: Responsive.width(100, context), width: Responsive.width(50, context),);

0

Jak uzyskać dostęp do rozmiaru ekranu, gęstości pikseli lub proporcji we flutter?

Możemy uzyskać dostęp do rozmiaru ekranu i innych, takich jak gęstość pikseli, współczynnik proporcji itp. Z pomocą MediaQuery.

syntex: MediaQuery.of (kontekst). rozmiar.wysokość


0

Po prostu zadeklaruj funkcję

Size screenSize() {
return MediaQuery.of(context).size;
}

Użyj jak poniżej

return Container(
      width: screenSize().width,
      height: screenSize().height,
      child: ...
 )

0

Zauważyliśmy, że korzystanie z MediaQueryklasy może być nieco kłopotliwe, a ponadto brakuje w niej kilku kluczowych informacji.

Tutaj mamy małą klasę pomocniczą Screen, której używamy we wszystkich naszych nowych projektach:

class Screen {
  static double get _ppi => (Platform.isAndroid || Platform.isIOS)? 150 : 96;
  static bool isLandscape(BuildContext c) => MediaQuery.of(c).orientation == Orientation.landscape;
  //PIXELS
  static Size size(BuildContext c) => MediaQuery.of(c).size;
  static double width(BuildContext c) => size(c).width;
  static double height(BuildContext c) => size(c).height;
  static double diagonal(BuildContext c) {
    Size s = size(c);
    return sqrt((s.width * s.width) + (s.height * s.height));
  }
  //INCHES
  static Size inches(BuildContext c) {
    Size pxSize = size(c);
    return Size(pxSize.width / _ppi, pxSize.height/ _ppi);
  }
  static double widthInches(BuildContext c) => inches(c).width;
  static double heightInches(BuildContext c) => inches(c).height;
  static double diagonalInches(BuildContext c) => diagonal(c) / _ppi;
}

Używać

bool isLandscape = Screen.isLandscape(context)
bool isLargePhone = Screen.diagonal(context) > 720;
bool isTablet = Screen.diagonalInches(context) >= 7;
bool isNarrow = Screen.widthInches(context) < 3.5;

Aby uzyskać więcej, zobacz: https://blog.gskinner.com/archives/2020/03/flutter-simplify-platform-detection-responsive-sizing.html


0

Korzystając z poniższej metody, możemy uzyskać fizyczną wysokość urządzenia. Dawny. 1080X1920

WidgetsBinding.instance.window.physicalSize.height
WidgetsBinding.instance.window.physicalSize.width

5
Chociaż ten kod może rozwiązać problem, w tym wyjaśnienie, jak i dlaczego to rozwiązuje problem, naprawdę pomogłoby poprawić jakość twojego posta i prawdopodobnie zaowocowałoby większą liczbą pozytywnych głosów. Pamiętaj, że odpowiadasz na pytanie do czytelników w przyszłości, a nie tylko osoba, która zapyta teraz. Proszę edytować swoje odpowiedzi, aby dodać wyjaśnień i dać wskazówkę co zastosować ograniczenia i założenia. Z recenzji
— podwójny sygnał dźwiękowy
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.