【アプリ開発進捗】#6 フォルダのリスト表示
こんな感じになりました。
やったこと
リスト表示用ウィジェットの共通化
フォルダリストウィジェットの作成
複数選択時に、フォルダの場合はフォルダのみ、メモの場合はメモのみ選択可能にする処理を追加
操作メニューの改良
学んだこと
ジェネリッククラスのインスタンス化
ウィジェットの位置などの取得方法
Setについて
ジェネリッククラスのインスタンス化
C#みたいに、ジェネリックで指定した型をそのままコンストラクタで呼び出すことはできないっぽい
こういうの↓
class ItemFactory<T> where T : new()
{
public T GetNewItem()
{
return new T();
}
}
(引用:https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/new-constraint)
なので、ファクトリメソッドを使って呼び出すっぽい
Function()でファクトリメソッドを参照して呼び出す感じです。
typedef ModelCreator<T extends ModelCommon> = T Function();
class ModelController<T extends ModelCommon, U extends ModelDataController<T>> {
ModelCreator<T> modelCreator;
// ...
}
/// モデルの新規作成
Future<void> create({Function(T)? onSubmitted}) async {
final model = modelCreator.call();
// ...
}
コンストラクタはこんな感じで呼び出します。
ここのmodelCreatorってのが、ファクトリメソッドにあたる引数です。
ここにそのまま、コンストラクタを呼び出したりすればインスタンス化できます。
// メモ操作クラス
memoController = ModelController(
modelName: "メモ",
context: context,
modelCreator: () => Memo(),
modelDataController: MemoDataController(),
);
参考↓
ウィジェットの位置の取得方法
メニューを表示するshowMenu()で位置の引数が必要になりました。
以下の記事を参考にしました。
final GlobalKey globalKey = GlobalKey();
return IconButton(
icon: const Icon(Icons.more_vert),
key: globalKey,
onPressed: _enabled
? () {
RenderBox renderBox =
globalKey.currentContext!.findRenderObject() as RenderBox;
Offset offset = renderBox.localToGlobal(Offset.zero);
final position =
RelativeRect.fromLTRB(offset.dx, offset.dy, 0, 0);
showMenu(context: context, position: position, items: [
今はとりあえずおまじないで済ませてます…。
Setについて
選択中のアイテムのコレクションをSetで使用しました。
初期化の方法が若干違うみたい
late List<T> _modelList = [];
final Set<T> _selectedModelList = {};
(通常のコレクションもSetの方がよさそうですが、今更全部置き換えるのがめんどいので、とりあえずそのままでいきます)
今後
フォルダを開く処理
新規作成時に、現在のフォルダを親として設定する処理
いただいたサポートは、僕が幸せに生きるための糧とさせていただきます☺️☺️☺️