From 368026fab89f45f009581756c56beca1579ee03b Mon Sep 17 00:00:00 2001 From: Ming Ming Date: Wed, 13 Dec 2023 23:05:40 +0800 Subject: [PATCH] Add pull to refresh to people browser --- app/lib/widget/people_browser.dart | 55 +++++++++++-------- app/lib/widget/people_browser.g.dart | 7 +++ app/lib/widget/people_browser/bloc.dart | 6 ++ .../widget/people_browser/state_event.dart | 8 +++ 4 files changed, 53 insertions(+), 23 deletions(-) diff --git a/app/lib/widget/people_browser.dart b/app/lib/widget/people_browser.dart index 3e6931d9..aef37d7a 100644 --- a/app/lib/widget/people_browser.dart +++ b/app/lib/widget/people_browser.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:collection/collection.dart'; import 'package:copy_with/copy_with.dart'; import 'package:flutter/material.dart'; @@ -95,30 +97,37 @@ class _WrappedPeopleBrowserState extends State<_WrappedPeopleBrowser> child: Scaffold( body: Stack( children: [ - CustomScrollView( - slivers: [ - const _AppBar(), - SliverToBoxAdapter( - child: _BlocBuilder( - buildWhen: (previous, current) => - previous.isLoading != current.isLoading, - builder: (context, state) => state.isLoading - ? const LinearProgressIndicator() - : const SizedBox(height: 4), + RefreshIndicator( + onRefresh: () async { + _bloc.add(const _Reload()); + await _bloc.stream.first; + }, + child: CustomScrollView( + slivers: [ + const _AppBar(), + SliverToBoxAdapter( + child: _BlocBuilder( + buildWhen: (previous, current) => + previous.isLoading != current.isLoading, + builder: (context, state) => state.isLoading + ? const LinearProgressIndicator() + : const SizedBox(height: 4), + ), ), - ), - _ContentList( - onTap: (_, item) { - Navigator.pushNamed( - context, - CollectionBrowser.routeName, - arguments: CollectionBrowserArguments( - CollectionBuilder.byPerson(_bloc.account, item.person), - ), - ); - }, - ), - ], + _ContentList( + onTap: (_, item) { + Navigator.pushNamed( + context, + CollectionBrowser.routeName, + arguments: CollectionBrowserArguments( + CollectionBuilder.byPerson( + _bloc.account, item.person), + ), + ); + }, + ), + ], + ), ), ], ), diff --git a/app/lib/widget/people_browser.g.dart b/app/lib/widget/people_browser.g.dart index e06c0cf3..fedb6c9d 100644 --- a/app/lib/widget/people_browser.g.dart +++ b/app/lib/widget/people_browser.g.dart @@ -88,6 +88,13 @@ extension _$_LoadPersonsToString on _LoadPersons { } } +extension _$_ReloadToString on _Reload { + String _$toString() { + // ignore: unnecessary_string_interpolations + return "_Reload {}"; + } +} + extension _$_TransformItemsToString on _TransformItems { String _$toString() { // ignore: unnecessary_string_interpolations diff --git a/app/lib/widget/people_browser/bloc.dart b/app/lib/widget/people_browser/bloc.dart index 56a9d59f..bb06df79 100644 --- a/app/lib/widget/people_browser/bloc.dart +++ b/app/lib/widget/people_browser/bloc.dart @@ -7,6 +7,7 @@ class _Bloc extends Bloc<_Event, _State> with BlocLogger { required this.personsController, }) : super(_State.init()) { on<_LoadPersons>(_onLoad); + on<_Reload>(_onReload); on<_TransformItems>(_onTransformItems); } @@ -31,6 +32,11 @@ class _Bloc extends Bloc<_Event, _State> with BlocLogger { ); } + void _onReload(_Reload ev, Emitter<_State> emit) { + _log.info(ev); + unawaited(personsController.reload()); + } + Future _onTransformItems( _TransformItems ev, Emitter<_State> emit) async { _log.info("[_onTransformItems] $ev"); diff --git a/app/lib/widget/people_browser/state_event.dart b/app/lib/widget/people_browser/state_event.dart index 464f5b43..b2b68160 100644 --- a/app/lib/widget/people_browser/state_event.dart +++ b/app/lib/widget/people_browser/state_event.dart @@ -37,6 +37,14 @@ class _LoadPersons implements _Event { String toString() => _$toString(); } +@toString +class _Reload implements _Event { + const _Reload(); + + @override + String toString() => _$toString(); +} + /// Transform the [Person] list (e.g., filtering, sorting, etc) @toString class _TransformItems implements _Event {