diff --git a/lib/routes/route_generator.dart b/lib/routes/route_generator.dart index 2716aaf..43bfd51 100644 --- a/lib/routes/route_generator.dart +++ b/lib/routes/route_generator.dart @@ -142,7 +142,8 @@ class RouteGenerator { return _createRoute( ChangeNotifierProvider( create: (context) => HashtagState(), - child: Hashtag(tag: settings.arguments as Tag), + child: + Hashtag(pageData: settings.arguments as Map), ), ); case Routes.filteredBookmarks: diff --git a/lib/views/home/hashtag/hashtag.dart b/lib/views/home/hashtag/hashtag.dart index 91b2060..c12e92e 100644 --- a/lib/views/home/hashtag/hashtag.dart +++ b/lib/views/home/hashtag/hashtag.dart @@ -13,18 +13,20 @@ import 'package:flutter_spinkit/flutter_spinkit.dart'; import 'package:provider/provider.dart'; class Hashtag extends StatefulWidget { - final Tag tag; - const Hashtag({Key? key, required this.tag}) : super(key: key); + final Map pageData; + const Hashtag({Key? key, required this.pageData}) : super(key: key); @override _HashtagState createState() => _HashtagState(); } class _HashtagState extends State { + Tag get _tag => widget.pageData['tag']; + @override void initState() { final state = context.read(); - state.id = widget.tag.id; + state.id = _tag.id; Future.delayed(Duration.zero, () => state.getTagItems(page: 1)); super.initState(); } @@ -32,7 +34,7 @@ class _HashtagState extends State { @override Widget build(BuildContext context) { return DidvanScaffold( - appBarData: AppBarData(title: '#' + widget.tag.label, hasBack: true), + appBarData: AppBarData(title: '#' + _tag.label, hasBack: true), slivers: [ Consumer( builder: (context, state, child) => SliverStateHandler( @@ -57,25 +59,29 @@ class _HashtagState extends State { case 'radar': return RadarOverview( radar: item, + onMarkChanged: (_, value, __) => + _changeMark(item.id, value, type), onCommentsChanged: (_, count) => item.comments = count, - onMarkChanged: (_, value, __) => item.marked = value, ); case 'news': return NewsOverview( news: item, - onMarkChanged: (_, value, __) => item.marked = value, + onMarkChanged: (_, value, __) => + _changeMark(item.id, value, type), ); case 'podcast': return PodcastOverview( podcast: item, - onMarkChanged: (_, value, __) => item.marked = value, + onMarkChanged: (_, value, __) => + _changeMark(item.id, value, type), studioRequestArgs: const StudioRequestArgs(page: 0, type: 'podcast'), ); case 'video': return VideoOverview( video: item, - onMarkChanged: (_, value, __) => item.marked = value, + onMarkChanged: (_, value, __) => + _changeMark(item.id, value, type), studioRequestArgs: const StudioRequestArgs(page: 0, type: 'video'), ); @@ -90,4 +96,15 @@ class _HashtagState extends State { ], ); } + + void _changeMark(int id, bool value, String type) { + final state = context.read(); + state.items + .firstWhere((element) => element.id == id && element.type == type) + .marked = value; + state.update(); + if (type == widget.pageData['type']) { + widget.pageData['onMarkChanged'](id, value); + } + } } diff --git a/lib/views/home/news/news_details/news_details.dart b/lib/views/home/news/news_details/news_details.dart index aede351..3becf7e 100644 --- a/lib/views/home/news/news_details/news_details.dart +++ b/lib/views/home/news/news_details/news_details.dart @@ -57,6 +57,8 @@ class _NewsDetailsState extends State { scrollController: _scrollController, items: state.news, currentIndex: state.currentIndex, + onMarkChanged: (id, value) => + widget.pageData['onMarkChanged'](id, value), ), ), Positioned( diff --git a/lib/views/home/radar/radar_details/radar_details.dart b/lib/views/home/radar/radar_details/radar_details.dart index f3a4fc3..c371e5f 100644 --- a/lib/views/home/radar/radar_details/radar_details.dart +++ b/lib/views/home/radar/radar_details/radar_details.dart @@ -57,6 +57,8 @@ class _RadarDetailsState extends State { scrollController: _scrollController, items: state.radars, currentIndex: state.currentIndex, + onMarkChanged: (id, value) => + widget.pageData['onMarkChanged']?.call(id, value), ), ), Positioned( diff --git a/lib/views/home/studio/studio_details/studio_details.mobile.dart b/lib/views/home/studio/studio_details/studio_details.mobile.dart index b43ff6a..789cf0e 100644 --- a/lib/views/home/studio/studio_details/studio_details.mobile.dart +++ b/lib/views/home/studio/studio_details/studio_details.mobile.dart @@ -219,6 +219,7 @@ class _StudioDetailsState extends State { children: [ StudioDetailsWidget( scrollController: _scrollController, + onMarkChanged: widget.pageData['onMarkChanged'], ), ], ), diff --git a/lib/views/home/studio/studio_details/studio_details.web.dart b/lib/views/home/studio/studio_details/studio_details.web.dart index 38a2579..b8d37ca 100644 --- a/lib/views/home/studio/studio_details/studio_details.web.dart +++ b/lib/views/home/studio/studio_details/studio_details.web.dart @@ -150,6 +150,7 @@ class _StudioDetailsState extends State { children: [ StudioDetailsWidget( scrollController: _scrollController, + onMarkChanged: widget.pageData['onMarkChanged'], ), ], ), diff --git a/lib/views/home/studio/studio_details/widgets/studio_details_widget.dart b/lib/views/home/studio/studio_details/widgets/studio_details_widget.dart index c02c0a4..4344f27 100644 --- a/lib/views/home/studio/studio_details/widgets/studio_details_widget.dart +++ b/lib/views/home/studio/studio_details/widgets/studio_details_widget.dart @@ -21,8 +21,10 @@ import 'package:url_launcher/url_launcher.dart'; class StudioDetailsWidget extends StatelessWidget { final ScrollController? scrollController; final VoidCallback? onCommentsTabSelected; + final void Function(int id, bool value) onMarkChanged; const StudioDetailsWidget({ Key? key, + required this.onMarkChanged, this.onCommentsTabSelected, this.scrollController, }) : super(key: key); @@ -87,7 +89,11 @@ class StudioDetailsWidget extends StatelessWidget { for (var i = 0; i < state.studio.tags.length; i++) - TagItem(tag: state.studio.tags[i]), + TagItem( + tag: state.studio.tags[i], + onMarkChanged: onMarkChanged, + type: isVideo ? 'video' : 'podcast', + ), ], ), const SizedBox(height: 20), diff --git a/lib/views/home/widgets/tag_item.dart b/lib/views/home/widgets/tag_item.dart index 1265361..56d14ef 100644 --- a/lib/views/home/widgets/tag_item.dart +++ b/lib/views/home/widgets/tag_item.dart @@ -9,18 +9,26 @@ import 'package:flutter/material.dart'; class TagItem extends StatelessWidget { final Tag tag; + final void Function(int id, bool value) onMarkChanged; + final String type; const TagItem({ Key? key, required this.tag, + required this.onMarkChanged, + required this.type, }) : super(key: key); @override Widget build(BuildContext context) { return InkWrapper( borderRadius: DesignConfig.lowBorderRadius, - onPressed: () => - Navigator.of(context).pushNamed(Routes.hashtag, arguments: tag), + onPressed: () => Navigator.of(context).pushNamed(Routes.hashtag, + arguments: { + 'tag': tag, + 'onMarkChanged': onMarkChanged, + 'type': type + }), child: Container( padding: const EdgeInsets.symmetric( vertical: 4, diff --git a/lib/views/widgets/didvan/bnb.dart b/lib/views/widgets/didvan/bnb.dart index 002dea5..deee1bb 100644 --- a/lib/views/widgets/didvan/bnb.dart +++ b/lib/views/widgets/didvan/bnb.dart @@ -338,6 +338,8 @@ class _PlayerNavBar extends StatelessWidget { sheetKey.currentState?.expand, ); }, + onMarkChanged: (id, value) => + context.read().changeMark(id, value, true), ), ), ), diff --git a/lib/views/widgets/didvan/page_view.dart b/lib/views/widgets/didvan/page_view.dart index fd3a8e9..a7cb236 100644 --- a/lib/views/widgets/didvan/page_view.dart +++ b/lib/views/widgets/didvan/page_view.dart @@ -21,6 +21,7 @@ class DidvanPageView extends StatefulWidget { final int initialIndex; final int currentIndex; final bool isRadar; + final void Function(int id, bool value) onMarkChanged; final ScrollController scrollController; final void Function(int index) onPageChanged; @@ -32,6 +33,7 @@ class DidvanPageView extends StatefulWidget { required this.onPageChanged, required this.isRadar, required this.currentIndex, + required this.onMarkChanged, }) : super(key: key); @override @@ -119,7 +121,11 @@ class _DidvanPageViewState extends State { runSpacing: 8, children: [ for (var i = 0; i < item.tags.length; i++) - TagItem(tag: item.tags[i]), + TagItem( + tag: item.tags[i], + onMarkChanged: widget.onMarkChanged, + type: widget.isRadar ? 'radar' : 'news', + ), ], ), ),