W systemie Android match_parent
i wrap_content
służą do automatycznej zmiany rozmiaru widżetów w stosunku do ich rodzica w stosunku do zawartości, którą zawiera widżet.
We Flutterze wydaje się, że domyślnie wszystkie widżety są ustawione na wrap_content
, jak bym to zmienił tak, aby mógł wypełnić jego width
i height
jego rodzica?
Link do oryginalnego artykułu
źródło
crossAxisAlignment
pole w wierszach i kolumnach, które można ustawićCrossAxisAlignment.stretch
na rozszerzenie w poziomie na przykład w kolumnieKrótka odpowiedź brzmi: rodzic nie ma rozmiaru, dopóki dziecko nie ma rozmiaru.
Sposób działania układu we Flutterze polega na tym, że każdy widżet zapewnia ograniczenia każdemu ze swoich elementów podrzędnych, na przykład „możesz mieć taką szerokość, musisz być tak wysoki, musisz mieć przynajmniej taką szerokość” lub cokolwiek (konkretnie uzyskaj minimalną szerokość, maksymalną szerokość, minimalną wysokość i maksymalną wysokość). Każde dziecko przyjmuje te ograniczenia, robi coś i wybiera rozmiar (szerokość i wysokość), który pasuje do tych ograniczeń. Następnie, gdy każde dziecko zrobi swoje, widżet może wybrać swój własny rozmiar.
Niektóre widżety starają się być tak duże, jak pozwala na to rodzic. Niektóre widżety starają się być tak małe, jak pozwala na to rodzic. Niektóre widżety próbują dopasować określony „naturalny” rozmiar (np. Tekst, obrazy).
Niektóre widżety informują dzieci, że mogą mieć dowolny rozmiar. Niektórzy dają swoim dzieciom te same ograniczenia, które dostali od rodziców.
źródło
PageView
wewnątrz aColumn
, z innymColumn
wewnątrz prądupage
, pojawia się błąd renderowania, ale mogę go naprawić, zawijającPageView
wnętrze aExpanded
lubFlexible
. Problem w tym, że te 2 opcje tylko poszerzają ich dziecko. Dlaczego nie ma powiązanego widżetu, który można by zmniejszyć i dopasować, takiego jak „zawijanie treści”, do rozwiązywania tego rodzaju problemów z renderowaniem?W rzeczywistości jest kilka dostępnych opcji:
Możesz użyć SizedBox.expand, aby dopasować widżet do wymiarów nadrzędnych, lub SizedBox (width: double.infinity), aby dopasować tylko szerokość, lub SizedBox (heigth: double.infinity), aby dopasować tylko wysokość.
Jeśli chcesz zachować zachowanie wrap_content, zależy to od używanego widżetu nadrzędnego, na przykład jeśli umieścisz przycisk w kolumnie, będzie on zachowywał się jak wrap_content i aby używać go jak match_parent, możesz owinąć przycisk widżetem Expanded lub polem o rozmiarze.
W widoku ListView przycisk otrzymuje zachowanie match_parent i aby uzyskać zachowanie wrap_content, można go opakować widżetem Flex, takim jak Row.
Użycie widżetu Expanded powoduje, że element podrzędny Row, Column lub Flex rozszerza się, aby wypełnić dostępne miejsce na głównej osi (np. Poziomo w przypadku wiersza lub pionowo w przypadku kolumny). https://docs.flutter.io/flutter/widgets/Expanded-class.html
Użycie widżetu Elastyczny daje elementowi podrzędnemu Row, Column lub Flex elastyczność w rozszerzaniu w celu wypełnienia dostępnej przestrzeni na głównej osi (np. Poziomo dla wiersza lub pionowo dla kolumny), ale w przeciwieństwie do Expanded, Flexible nie wymagać od dziecka wypełnienia dostępnej przestrzeni. https://docs.flutter.io/flutter/widgets/F flexible-class.html
źródło
Proste obejście:
Jeśli kontener ma tylko jedno dziecko najwyższego poziomu, możesz określić właściwość wyrównania dla elementu podrzędnego i nadać mu dowolną dostępną wartość. wypełni całą przestrzeń w kontenerze.
Inny sposób:
źródło
BoxConstraints.expand(height: 100.0)
Działa świetnie jako Androidwidth="match_parent"
równoważnymSkorzystałem z tego rozwiązania, wysokość i szerokość ekranu musisz zdefiniować za pomocą MediaQuery:
źródło
źródło
Użyj widżetu
Wrap
.Aby uzyskać
Column
podobne zachowanie, spróbuj:Aby uzyskać
Row
podobne zachowanie, spróbuj:Więcej informacji: Wrap (Flutter Widget)
źródło
Użyj tej linii kodów wewnątrz kolumny. Dla wrap_content:
mainAxisSize: MainAxisSize.min
Dla match_parent:mainAxisSize: MainAxisSize.max
źródło
W rzeczywistości jest na to bardzo łatwy i zgrabny sposób.
Użyj
FractionallySizedBox
widżetu.Ten widżet jest również bardzo przydatny, gdy chcesz zmienić rozmiar swojego dziecka na ułamek rozmiaru jego rodzica.
źródło
Aby dziecko wypełniło swojego rodzica, po prostu zawiń je w FittedBox
źródło