修正方法がわからないレンダリング例外が表示されます。 3行の列を作成しようとしています。
行[画像]
行[テキストフィールド]
行[ボタン]
コンテナをビルドするための私のコードは次のとおりです。
Container buildEnterAppContainer(BuildContext context) {
var container = new Container(
padding: const EdgeInsets.all(8.0),
child: new Column(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
buildImageRow(context),
buildAppEntryRow(context),
buildButtonRow(context)
],
),
);
return container;
}
テキストコンテナのbuildAppEntryRowコード
Widget buildAppEntryRow(BuildContext context) {
return new Row(
children: <Widget>[
new TextField(
decoration: const InputDecoration(helperText: "Enter App ID"),
style: Theme.of(context).textTheme.body1,
)
],
);
}
実行すると、次の例外が発生します。
I/flutter ( 7674): BoxConstraints forces an infinite width.
I/flutter ( 7674): These invalid constraints were provided to RenderStack's layout() function by the following
I/flutter ( 7674): function, which probably computed the invalid constraints in question:
I/flutter ( 7674): RenderConstrainedBox.performLayout (package:flutter/src/rendering/proxy_box.Dart:256:13)
I/flutter ( 7674): The offending constraints were:
I/flutter ( 7674): BoxConstraints(w=Infinity, 0.0<=h<=Infinity)
BuildAppEntryRowをこのような代わりにTextFieldに変更すると
Widget buildAppEntryRow2(BuildContext context) {
return new TextField(
decoration: const InputDecoration(helperText: "Enter App ID"),
style: Theme.of(context).textTheme.body1,
);
}
例外はもうありません。行のサイズを計算できない原因となっている行の実装には何が欠けていますか?
(将来的にRow
の横に他のウィジェットを配置したいので、TextField
を使用していると思います。)
Row
ウィジェットは、柔軟性のない子の固有のサイズを判別するため、柔軟性のある子用に残されたスペースを把握します。ただし、TextField
には固有の幅がありません。親コンテナの幅いっぱいにサイズを変更する方法のみを知っています。 Flexible
またはExpanded
でラップして、Row
が残りのスペースを占有することを期待していることをTextField
に伝えてください。
new Row(
children: <Widget>[
new Flexible(
child: new TextField(
decoration: const InputDecoration(helperText: "Enter App ID"),
style: Theme.of(context).textTheme.body1,
),
),
],
),
行内でTextfieldを使用するには、Flexibleを使用する必要があります。
new Row(
children: <Widget>[
new Text("hi there"),
new Container(
child:new Flexible(
child: new TextField( ),
),//flexible
),//container
],//widget
),//row
簡単な解決策は、Text()
の中にContainer()
をラップすることです。したがって、コードは次のようになります。
Container(
child: TextField()
)
ここでは、コンテナの幅と高さの属性も取得して、テキストフィールドのルックアンドフィールを調整します。コンテナ内にテキストフィールドをラップする場合は、Flexible
を使用する必要はありません。
@Asif Shirazが言及したように、私は同じ問題を抱えており、これを柔軟な列にラッピングすることでこれを解決しました、このように、
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Flutter Demo',
theme: new ThemeData(
primarySwatch: Colors.blue,
),
home: new Scaffold(
body: Row(
children: <Widget>[
Flexible(
child: Column(
children: <Widget>[
Container(
child: TextField(),
)
//container
],
))
],
mainAxisAlignment: MainAxisAlignment.spaceBetween,
),
));
}
}
TextField
は水平方向に拡張し、Row
も拡張するため、このエラーが発生します。そのため、TextField
の幅を制限する必要があります。これには多くの方法があります。
Expanded
を使用
Row(
children: <Widget>[
Expanded(child: TextField()),
OtherWidget(),
],
)
Flexible
を使用
Row(
children: <Widget>[
Flexible(child: TextField()),
OtherWidget(),
],
)
Container
またはSizedBox
でラップし、width
を指定します
Row(
children: <Widget>[
SizedBox(width: 100, child: TextField()),
OtherWidget(),
],
)