From db9f6a0eb4e7b7b4abf75e952d4dea8ab4fb06a3 Mon Sep 17 00:00:00 2001 From: Elias Projahn Date: Sun, 5 Apr 2020 20:11:11 +0200 Subject: [PATCH] Extract work tile from recording editor --- lib/editors/recording.dart | 23 ++++--------------- lib/widgets/work_tile.dart | 47 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 19 deletions(-) create mode 100644 lib/widgets/work_tile.dart diff --git a/lib/editors/recording.dart b/lib/editors/recording.dart index 8fbf5bf..621a4ee 100644 --- a/lib/editors/recording.dart +++ b/lib/editors/recording.dart @@ -4,6 +4,7 @@ import '../backend.dart'; import '../database.dart'; import '../selectors/performer.dart'; import '../selectors/work.dart'; +import '../widgets/work_tile.dart'; class RecordingEditor extends StatefulWidget { final Recording recording; @@ -69,25 +70,9 @@ class _RecordingEditorState extends State { body: ListView( children: [ work != null - ? StreamBuilder>( - stream: backend.db.composersByWork(work.id).watch(), - builder: (context, snapshot) { - if (snapshot.hasData) { - return ListTile( - title: Text(work.title), - subtitle: Text(snapshot.data - .map((p) => '${p.firstName} ${p.lastName}') - .join(', ')), - onTap: selectWork, - ); - } else { - return ListTile( - title: Text(work.title), - subtitle: Text('…'), - onTap: selectWork, - ); - } - }, + ? WorkTile( + workId: work.id, + onTap: selectWork, ) : ListTile( title: Text('Work'), diff --git a/lib/widgets/work_tile.dart b/lib/widgets/work_tile.dart new file mode 100644 index 0000000..386caba --- /dev/null +++ b/lib/widgets/work_tile.dart @@ -0,0 +1,47 @@ +import 'package:flutter/material.dart'; + +import '../backend.dart'; +import '../database.dart'; + +class WorkTile extends StatelessWidget { + final int workId; + final void Function() onTap; + + WorkTile({ + this.workId, + this.onTap, + }); + + @override + Widget build(BuildContext context) { + final backend = Backend.of(context); + + return StreamBuilder( + stream: backend.db.workById(workId).watchSingle(), + builder: (context, snapshot) { + final titleText = snapshot.data?.title ?? '...'; + + return StreamBuilder>( + stream: backend.db.composersByWork(workId).watch(), + builder: (context, snapshot) { + if (snapshot.hasData) { + return ListTile( + title: Text(titleText), + subtitle: Text(snapshot.data + .map((p) => '${p.firstName} ${p.lastName}') + .join(', ')), + onTap: onTap ?? null, + ); + } else { + return ListTile( + title: Text(titleText), + subtitle: Text('...'), + onTap: onTap ?? null, + ); + } + }, + ); + }, + ); + } +}