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, + ); + } + }, + ); + }, + ); + } +}