[過去ログ] Flutterやろうよ!!! 2 (1002レス)
上下前次1-新
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
44: デフォルトの名無しさん (ワッチョイ 9701-95wZ) [] 2021/02/06(土)15:25 ID:F0c/bXFP0(1/9)
>>42-43
Dart言語で、ListView.builder()の、itemBuilderに渡す関数を、_HogeHogeState
クラスのメンバ変数(例:int _listMode)の値で切り替えたいんだけど、Dartで一番
スマートに記述するには、どう書けばいいの?
できれば、関数ポインタの配列を定義して、_listModeをインデックスとして、
アクセスしたいんだが?
C/C++で普通にできることができなくて、なんかイラつく。
46: デフォルトの名無しさん (ワッチョイ 9701-95wZ) [] 2021/02/06(土)15:41 ID:F0c/bXFP0(2/9)
ちなみに抜粋して書くと、今は、
Widget _getlistview() {
switch(_listMode)
{
case 0:
return ListView.builder(
itemBuilder: _buildSimpleListItem,
// 中略
break;
case 1:
return ListView.builder(
itemBuilder: _buildIconListItem,
// 中略
break;
}
}
Widget build(BuildContext context){
log("*** _DemoPage3State::build() ***");
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: _getlistview(),
);
}
って書いてる。 itemBuilder部分に、switch文の条件分岐を入れようとしたら、
エラーになった。
47(1): デフォルトの名無しさん (ワッチョイ 9701-95wZ) [] 2021/02/06(土)15:42 ID:F0c/bXFP0(3/9)
>>45
アクセス部分はそうだけど、知りたいのは、widgets[]の初期化部分なんだが?
49(3): デフォルトの名無しさん (ワッチョイ 9701-95wZ) [] 2021/02/06(土)15:53 ID:F0c/bXFP0(4/9)
>>48
そんなん、中身固定の初心者向けのサンプルレベルやん。
やりたいのは、ListViewの見せ方を動的に変えたいってことだよ。
final var widgets[] = {
_buildSimpleListItem,
_buildIconListItem,
// 以下略
};
Widget _buildSimpleListItem(int indexItem) {
return Text(_listItems[indexItem]);
};
Widget _buildIconListItem(int indexItem) {
return ListTile{
leading: icon,
title:Text(_listItems[indexItem]);
);
};
てな書き方でいけるんだっけ?
52(1): デフォルトの名無しさん (ワッチョイ 9701-95wZ) [] 2021/02/06(土)16:11 ID:F0c/bXFP0(5/9)
>>50-51
全く理解してないことが良く判った。
リストに表示する中身を、_listItems (例: List<String>) で保持して、_listMode
は、同じPage内に配置した DropdownButton 等と紐付いていて、選択を切り替え
た時点でsetState()してページ内のListViewの見せ方を変えたいの。
一応、やりたいこと自体は、糞な書き方でできることは確認してる。 説明の
都合上、ScaffoldのbodyはListViewだけにしてるけど、実際はもっと複雑。
55(6): デフォルトの名無しさん (ワッチョイ 9701-95wZ) [] 2021/02/06(土)16:41 ID:F0c/bXFP0(6/9)
>>53
例えば、ListView.builderを1つにして、
body: ListView.builder(
itemBuilder: _getlistItem,
// 略
);
Widget _getlistItem(int indexItem) {
switch(_listMode)
{
case 0:
return Text(_listItems[indexItem]);
// 中略
break;
case 1:
return ListTile{
leading: icon,
title:Text(_listItems[indexItem]));
break;
}
と、itemBuilderに渡す関数も共通化して、その関数内でswitch〜caseで分岐して、
返すWidgetを変えてもいいんだが、本当にやりたいのは、switch〜caseを書く
のではなく、Widgetを返す関数配列にしたいってこと。
57(1): デフォルトの名無しさん (ワッチョイ 9701-95wZ) [] 2021/02/06(土)16:47 ID:F0c/bXFP0(7/9)
>>54
だから、widgets[][]を、どこで初期化するの?
中身はファイル名の一覧とか可変が前提だよ。
それと、使うWidgetは、表示スタイルによってどれか1つで済むのに、二重のfor
ループを廻して、毎回全部を作りなおすのか? 間違いではないが、糞プログラマ
認定だな。
58: デフォルトの名無しさん (ワッチョイ 9701-95wZ) [] 2021/02/06(土)16:49 ID:F0c/bXFP0(8/9)
>>56
なぜ、ListView.builderを使うのか、理解していないことが良く判った。
69: デフォルトの名無しさん (ワッチョイ 9701-95wZ) [] 2021/02/06(土)22:06 ID:F0c/bXFP0(9/9)
>>68
とりあえず、>>49のwidgets[]は、型は便宜上varとしているが、Widgetを返す
関数を保持されることを意図したつもり。
Widget _buildSimpleListItem(int indexItem)や、Widget _buildIconListItem
(int indexItem)は、Widgetを返す関数の実装。
配列要素である関数自体は変わらないが定数ではないからconstではなく、final を
付けてみたが、final付けるとエラーになるかも。
ListView.builder()は、itemBuilderに渡す関数を.builder内部で繰り返し呼び出して、
Widgetを作るので、わざわざwidgets[][]なんて持つ必要がないという理解。
当然、ListView.builder()はHogeHogePageのbuild内で呼び出しているので、
_listModeと紐付いたDropdownButtonのonChanged: で、
(value) => setState(() { _listMode = menu.indexOf(value); } ),
てな感じで更新を掛ける。
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 1.650s*