From 52a2d5c3eca8fbe1e15c0389607da58d29084e33 Mon Sep 17 00:00:00 2001 From: Elias Projahn Date: Sun, 3 May 2020 23:01:16 +0200 Subject: [PATCH] mobile: Use new API on selection screens --- mobile/lib/screens/home.dart | 61 +++++++++++++++++------------- mobile/lib/screens/person.dart | 69 ++++++++++++++++++---------------- mobile/lib/screens/work.dart | 43 ++++++++------------- 3 files changed, 88 insertions(+), 85 deletions(-) diff --git a/mobile/lib/screens/home.dart b/mobile/lib/screens/home.dart index 9cc04ae..3515075 100644 --- a/mobile/lib/screens/home.dart +++ b/mobile/lib/screens/home.dart @@ -3,18 +3,36 @@ import 'package:musicus_database/musicus_database.dart'; import '../backend.dart'; import '../editors/tracks.dart'; +import '../widgets/lists.dart'; import 'person.dart'; import 'settings.dart'; -class HomeScreen extends StatelessWidget { +class HomeScreen extends StatefulWidget { + @override + _HomeScreenState createState() => _HomeScreenState(); +} + +class _HomeScreenState extends State { + String _search; + @override Widget build(BuildContext context) { final backend = Backend.of(context); return Scaffold( appBar: AppBar( - title: Text('Musicus'), + title: TextField( + autofocus: true, + onChanged: (text) { + setState(() { + _search = text; + }); + }, + decoration: InputDecoration.collapsed( + hintText: 'Composers', + ), + ), actions: [ PopupMenuButton( icon: const Icon(Icons.more_vert), @@ -49,31 +67,22 @@ class HomeScreen extends StatelessWidget { ), ], ), - body: FutureBuilder>( - future: backend.db.getPersons(), - builder: (context, snapshot) { - if (snapshot.hasData) { - return ListView.builder( - itemCount: snapshot.data.length, - itemBuilder: (context, index) { - final person = snapshot.data[index]; - return ListTile( - title: Text('${person.lastName}, ${person.firstName}'), - onTap: () => Navigator.push( - context, - MaterialPageRoute( - builder: (context) => PersonScreen( - person: person, - ), - ), - ), - ); - }, - ); - } else { - return Container(); - } + body: PagedListView( + search: _search, + fetch: (page, search) async { + return await backend.db.getPersons(page, search); }, + builder: (context, person) => ListTile( + title: Text('${person.lastName}, ${person.firstName}'), + onTap: () => Navigator.push( + context, + MaterialPageRoute( + builder: (context) => PersonScreen( + person: person, + ), + ), + ), + ), ), ); } diff --git a/mobile/lib/screens/person.dart b/mobile/lib/screens/person.dart index 8431045..5702c3f 100644 --- a/mobile/lib/screens/person.dart +++ b/mobile/lib/screens/person.dart @@ -3,23 +3,42 @@ import 'package:musicus_database/musicus_database.dart'; import '../backend.dart'; import '../editors/person.dart'; +import '../widgets/lists.dart'; import 'work.dart'; -class PersonScreen extends StatelessWidget { +class PersonScreen extends StatefulWidget { final Person person; PersonScreen({ this.person, }); + @override + _PersonScreenState createState() => _PersonScreenState(); +} + +class _PersonScreenState extends State { + String _search; + @override Widget build(BuildContext context) { final backend = Backend.of(context); return Scaffold( appBar: AppBar( - title: Text('${person.firstName} ${person.lastName}'), + title: TextField( + autofocus: true, + onChanged: (text) { + setState(() { + _search = text; + }); + }, + decoration: InputDecoration.collapsed( + hintText: + 'Works by ${widget.person.firstName} ${widget.person.lastName}', + ), + ), actions: [ IconButton( icon: const Icon(Icons.edit), @@ -28,7 +47,7 @@ class PersonScreen extends StatelessWidget { context, MaterialPageRoute( builder: (context) => PersonEditor( - person: person, + person: widget.person, ), fullscreenDialog: true, ), @@ -37,36 +56,22 @@ class PersonScreen extends StatelessWidget { ), ], ), - body: FutureBuilder>( - future: backend.db.getWorks(person.id), - builder: (context, snapshot) { - if (snapshot.hasData) { - return ListView.builder( - itemCount: snapshot.data.length, - itemBuilder: (context, index) { - final work = snapshot.data[index].work; - - return ListTile( - title: Text(work.title), - onTap: () async { - final workInfo = await backend.db.getWorkInfo(work); - - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => WorkScreen( - workInfo: workInfo, - ), - ), - ); - }, - ); - }, - ); - } else { - return Container(); - } + body: PagedListView( + search: _search, + fetch: (page, search) async { + return await backend.db.getWorks(widget.person.id, page, search); }, + builder: (context, workInfo) => ListTile( + title: Text(workInfo.work.title), + onTap: () => Navigator.push( + context, + MaterialPageRoute( + builder: (context) => WorkScreen( + workInfo: workInfo, + ), + ), + ), + ), ), ); } diff --git a/mobile/lib/screens/work.dart b/mobile/lib/screens/work.dart index 179fb22..1635847 100644 --- a/mobile/lib/screens/work.dart +++ b/mobile/lib/screens/work.dart @@ -4,6 +4,7 @@ import 'package:musicus_database/musicus_database.dart'; import '../backend.dart'; import '../editors/work.dart'; import '../widgets/texts.dart'; +import '../widgets/lists.dart'; class WorkScreen extends StatelessWidget { final WorkInfo workInfo; @@ -36,34 +37,22 @@ class WorkScreen extends StatelessWidget { ), ], ), - body: FutureBuilder>( - future: backend.db.getRecordings(workInfo.work.id), - builder: (context, snapshot) { - if (snapshot.hasData) { - return ListView.builder( - itemCount: snapshot.data.length, - itemBuilder: (context, index) { - final recordingInfo = snapshot.data[index]; - final recording = recordingInfo.recording; - - return ListTile( - title: PerformancesText( - performanceInfos: recordingInfo.performances, - ), - onTap: () async { - final tracks = backend.ml.tracks[recording.id]; - tracks.sort( - (t1, t2) => t1.track.index.compareTo(t2.track.index)); - - backend.player.addTracks(backend.ml.tracks[recording.id]); - }, - ); - }, - ); - } else { - return Container(); - } + body: PagedListView( + fetch: (page, _) async { + return await backend.client.getRecordings(workInfo.work.id, page); }, + builder: (context, recordingInfo) => ListTile( + title: PerformancesText( + performanceInfos: recordingInfo.performances, + ), + onTap: () { + final tracks = backend.ml.tracks[recordingInfo.recording.id]; + tracks.sort((t1, t2) => t1.track.index.compareTo(t2.track.index)); + + backend.player + .addTracks(backend.ml.tracks[recordingInfo.recording.id]); + }, + ), ), ); }