画面サイズ(幅/高さ)に関連して要素のサイズを設定する簡単な(LayoutBuilder以外の)方法はありますか?たとえば、CardViewの幅を画面幅の65%に設定するにはどうすればよいですか。
build
メソッドの内部では実行できないので(明らかに)、ビルド後まで延期する必要があります。このようなロジックを配置するのに好ましい場所はありますか?
FractionallySizedBox
も役立つ場合があります。また、MediaQuery.of(context).size
から直接画面の幅を読み取り、それに基づいてサイズのボックスを作成することもできます
MediaQuery.of(context).size.width * 0.65
レイアウトが何であるかにかかわらず、本当に画面の一部としてサイズを調整したい場合。
これはもう少し明確かもしれません:
double width = MediaQuery.of(context).size.width;
double yourWidth = width * 0.65;
これで問題が解決することを願っています。
これは、言及されたいくつかのソリューションの実装を示す補足的な回答です。
ウィジェットが1つしかない場合は、FractionallySizedBox
ウィジェットを使用して、使用可能なスペースの割合を指定できます。ここで、緑のContainer
は、利用可能な幅の70%と利用可能な高さの30%を埋めるように設定されています。
Widget myWidget() {
return FractionallySizedBox(
widthFactor: 0.7,
heightFactor: 0.3,
child: Container(
color: Colors.green,
),
);
}
Expanded
ウィジェットを使用すると、ウィジェットは、行にある場合は水平方向に、列にある場合は垂直方向に使用可能なスペースを埋めることができます。 flex
プロパティを複数のウィジェットで使用して、ウィジェットに重みを付けることができます。ここで、緑のContainer
は幅の70%を占め、黄色のContainer
は幅の30%を占めます。
垂直に行う場合は、Row
をColumn
に置き換えてください。
Widget myWidget() {
return Row(
children: <Widget>[
Expanded(
flex: 7,
child: Container(
color: Colors.green,
),
),
Expanded(
flex: 3,
child: Container(
color: Colors.yellow,
),
),
],
);
}
参照用のmain.Dart
コードを以下に示します。
import 'package:flutter/material.Dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text("FractionallySizedBox"),
),
body: myWidget(),
),
);
}
}
// replace with example code above
Widget myWidget() {
return ...
}
Flexible を使用してColumn/Rowを作成するか、または必要な割合になるflex値を持つ子を展開できます。
AspectRatio ウィジェットも便利です。
MediaQuery.of(context).size.width
mediaQueryをウィジェットの現在のコンテキストで使用して、このdouble width = MediaQuery.of(context).size.width double height = MediaQuery.of(context).size.height
のような幅または高さを取得できます。その後、必要な割合で乗算できます
gridViewを使用している場合、Ian Hicksonのソリューションのようなものを使用できます。
crossAxisCount: MediaQuery.of(context).size.width <= 400.0 ? 3 : MediaQuery.of(context).size.width >= 1000.0 ? 5 : 4