bookmark bug fixed

This commit is contained in:
MohammadTaha Basiri 2022-01-29 15:58:15 +03:30
parent c282921b2b
commit 8d84f0df47
10 changed files with 67 additions and 68 deletions

View File

@ -2,6 +2,7 @@ import 'dart:async';
import 'package:didvan/constants/app_icons.dart'; import 'package:didvan/constants/app_icons.dart';
import 'package:didvan/models/enums.dart'; import 'package:didvan/models/enums.dart';
import 'package:didvan/models/requests/news.dart';
import 'package:didvan/models/view/action_sheet_data.dart'; import 'package:didvan/models/view/action_sheet_data.dart';
import 'package:didvan/pages/home/news/news_state.dart'; import 'package:didvan/pages/home/news/news_state.dart';
import 'package:didvan/pages/home/widgets/news_overview.dart'; import 'package:didvan/pages/home/widgets/news_overview.dart';
@ -60,7 +61,13 @@ class _NewsState extends State<News> {
final news = state.news[index]; final news = state.news[index];
return NewsOverview( return NewsOverview(
news: news, news: news,
onMarkChanged: (value) => state.onMarkChanged(news.id, value), onMarkChanged: (id, value) => state.onMarkChanged(id, value),
newsRequestArgs: NewsRequestArgs(
page: state.page,
endDate: state.endDate,
startDate: state.startDate,
search: state.search,
),
); );
}, },
enableEmptyState: state.news.isEmpty, enableEmptyState: state.news.isEmpty,

View File

@ -1,3 +1,5 @@
// ignore_for_file: prefer_const_constructors
import 'dart:async'; import 'dart:async';
import 'dart:math'; import 'dart:math';
@ -5,6 +7,7 @@ import 'package:didvan/config/design_config.dart';
import 'package:didvan/config/theme_data.dart'; import 'package:didvan/config/theme_data.dart';
import 'package:didvan/constants/app_icons.dart'; import 'package:didvan/constants/app_icons.dart';
import 'package:didvan/models/enums.dart'; import 'package:didvan/models/enums.dart';
import 'package:didvan/models/requests/radar.dart';
import 'package:didvan/models/view/action_sheet_data.dart'; import 'package:didvan/models/view/action_sheet_data.dart';
import 'package:didvan/pages/home/radar/radar_state.dart'; import 'package:didvan/pages/home/radar/radar_state.dart';
import 'package:didvan/pages/home/radar/widgets/categories_gird.dart'; import 'package:didvan/pages/home/radar/widgets/categories_gird.dart';
@ -132,9 +135,18 @@ class _RadarState extends State<Radar> {
final radar = state.radars[index]; final radar = state.radars[index];
return RadarOverview( return RadarOverview(
radar: radar, radar: radar,
onMarkChanged: (value) => state.changeMark(radar.id, value), onMarkChanged: (id, value) => state.changeMark(id, value),
onCommentsChanged: (count) => onCommentsChanged: (id, count) =>
state.onCommentsChanged(radar.id, count), state.onCommentsChanged(id, count),
radarRequestArgs: RadarRequestArgs(
page: state.page,
categories:
List.from(state.selectedCats.map((cat) => cat.id)),
endDate: state.endDate,
isSingleItem: false,
search: state.search,
startDate: state.startDate,
),
); );
}, },
childCount: state.radars.length, childCount: state.radars.length,
@ -145,9 +157,9 @@ class _RadarState extends State<Radar> {
), ),
], ],
), ),
if (state.appState != AppState.failed) const CategoriesRow1(), if (state.appState != AppState.failed) CategoriesRow1(),
if (state.appState != AppState.failed) const CategoriesRow2(), if (state.appState != AppState.failed) CategoriesRow2(),
if (state.appState != AppState.failed) const CategoriesList(), if (state.appState != AppState.failed) CategoriesList(),
], ],
), ),
); );

View File

@ -59,9 +59,15 @@ class _RadarDetailsState extends State<RadarDetails> {
state.currentRadar.id, state.currentRadar.id,
value, value,
), ),
onCommentsChanged: state.onCommentsChanged,
categories: state.currentRadar.categories, categories: state.currentRadar.categories,
scrollController: _scrollController, scrollController: _scrollController,
onCommentsChanged: (count) {
state.onCommentsChanged(count);
widget.pageData['onCommentsChanged'](
state.currentRadar.id,
count,
);
},
), ),
), ),
], ],

View File

@ -9,7 +9,7 @@ class CategoriesRow1 extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final state = context.watch<RadarState>(); final state = context.read<RadarState>();
final isColapsed = state.isColapsed || state.searching || state.filtering; final isColapsed = state.isColapsed || state.searching || state.filtering;
final MediaQueryData d = MediaQuery.of(context); final MediaQueryData d = MediaQuery.of(context);
return AnimatedPositioned( return AnimatedPositioned(
@ -47,7 +47,7 @@ class CategoriesRow2 extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final state = context.watch<RadarState>(); final state = context.read<RadarState>();
final isColapsed = state.isColapsed || state.searching || state.filtering; final isColapsed = state.isColapsed || state.searching || state.filtering;
final MediaQueryData d = MediaQuery.of(context); final MediaQueryData d = MediaQuery.of(context);
return AnimatedPositioned( return AnimatedPositioned(

View File

@ -37,7 +37,7 @@ class _CategoriesListState extends State<CategoriesList> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final MediaQueryData d = MediaQuery.of(context); final MediaQueryData d = MediaQuery.of(context);
final state = context.watch<RadarState>(); final state = context.read<RadarState>();
final isColapsed = state.isColapsed || state.searching || state.filtering; final isColapsed = state.isColapsed || state.searching || state.filtering;
return Positioned( return Positioned(
top: 0, top: 0,

View File

@ -54,11 +54,9 @@ class _FilteredBookmarksState extends State<FilteredBookmarks> {
emptyState: const EmptyList(), emptyState: const EmptyList(),
builder: (context, state, index) => RadarOverview( builder: (context, state, index) => RadarOverview(
radar: state.filterdBookmarks[index], radar: state.filterdBookmarks[index],
onMarkChanged: (value) {}, onMarkChanged: (id, value) {},
onCommentsChanged: (count) => state.onCommentsChanged( onCommentsChanged: (id, count) =>
state.filterdBookmarks[index].id, state.onCommentsChanged(id, count),
count,
),
), ),
childCount: state.filterdBookmarks.length, childCount: state.filterdBookmarks.length,
onRetry: state.getBookmarks, onRetry: state.getBookmarks,

View File

@ -1,6 +1,5 @@
import 'package:didvan/models/news_overview.dart'; import 'package:didvan/models/news_overview.dart';
import 'package:didvan/models/requests/news.dart'; import 'package:didvan/models/requests/news.dart';
import 'package:didvan/pages/home/news/news_state.dart';
import 'package:didvan/routes/routes.dart'; import 'package:didvan/routes/routes.dart';
import 'package:didvan/utils/date_time.dart'; import 'package:didvan/utils/date_time.dart';
import 'package:didvan/widgets/bookmark_button.dart'; import 'package:didvan/widgets/bookmark_button.dart';
@ -9,30 +8,27 @@ import 'package:didvan/widgets/didvan/divider.dart';
import 'package:didvan/widgets/didvan/text.dart'; import 'package:didvan/widgets/didvan/text.dart';
import 'package:didvan/widgets/skeleton_image.dart'; import 'package:didvan/widgets/skeleton_image.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class NewsOverview extends StatelessWidget { class NewsOverview extends StatelessWidget {
final NewsOverviewData news; final NewsOverviewData news;
final void Function(bool value) onMarkChanged; final NewsRequestArgs? newsRequestArgs;
const NewsOverview( final void Function(int id, bool value) onMarkChanged;
{Key? key, required this.news, required this.onMarkChanged}) const NewsOverview({
: super(key: key); Key? key,
required this.news,
required this.onMarkChanged,
this.newsRequestArgs,
}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final state = context.read<NewsState>();
return DidvanCard( return DidvanCard(
onTap: () => Navigator.of(context).pushNamed( onTap: () => Navigator.of(context).pushNamed(
Routes.newsDetails, Routes.newsDetails,
arguments: { arguments: {
'state': state, 'onMarkChanged': onMarkChanged,
'id': news.id, 'id': news.id,
'args': NewsRequestArgs( 'args': newsRequestArgs,
page: state.page,
endDate: state.endDate,
search: state.search,
startDate: state.startDate,
)
}, },
), ),
child: Column( child: Column(
@ -80,8 +76,7 @@ class NewsOverview extends StatelessWidget {
), ),
BookmarkButton( BookmarkButton(
value: news.marked, value: news.marked,
onMarkChanged: onMarkChanged, onMarkChanged: (value) => onMarkChanged(news.id, value),
bigGestureSize: true,
), ),
], ],
), ),

View File

@ -14,8 +14,8 @@ import 'package:flutter/material.dart';
class RadarOverview extends StatelessWidget { class RadarOverview extends StatelessWidget {
final RadarOverviewData radar; final RadarOverviewData radar;
final void Function(int count) onCommentsChanged; final void Function(int id, int count) onCommentsChanged;
final void Function(bool value) onMarkChanged; final void Function(int id, bool value) onMarkChanged;
final RadarRequestArgs? radarRequestArgs; final RadarRequestArgs? radarRequestArgs;
const RadarOverview({ const RadarOverview({
Key? key, Key? key,
@ -100,7 +100,7 @@ class RadarOverview extends StatelessWidget {
children: [ children: [
BookmarkButton( BookmarkButton(
value: radar.marked, value: radar.marked,
onMarkChanged: onMarkChanged, onMarkChanged: (value) => onMarkChanged(radar.id, value),
), ),
const Spacer(), const Spacer(),
if (radar.comments != 0) DidvanText(radar.comments.toString()), if (radar.comments != 0) DidvanText(radar.comments.toString()),

View File

@ -104,15 +104,13 @@ class UserProvider extends CoreProvier {
final MapEntry? lastChange = final MapEntry? lastChange =
_radarMarkQueue.lastWhereOrNull((item) => item.key == id); _radarMarkQueue.lastWhereOrNull((item) => item.key == id);
if (lastChange == null) return; if (lastChange == null) return;
final service = RequestService(RequestHelper.markRadar(id));
if (lastChange.value) { if (lastChange.value) {
final service = RequestService(RequestHelper.markRadar(id)); await service.post();
if (value) { } else {
await service.post(); await service.delete();
} else {
await service.delete();
}
_radarMarkQueue.removeWhere((element) => element.key == id);
} }
_radarMarkQueue.removeWhere((element) => element.key == id);
}); });
} }
@ -122,15 +120,13 @@ class UserProvider extends CoreProvier {
final MapEntry? lastChange = final MapEntry? lastChange =
_newsMarkQueue.lastWhereOrNull((item) => item.key == id); _newsMarkQueue.lastWhereOrNull((item) => item.key == id);
if (lastChange == null) return; if (lastChange == null) return;
final service = RequestService(RequestHelper.markNews(id));
if (lastChange.value) { if (lastChange.value) {
final service = RequestService(RequestHelper.markNews(id)); await service.post();
if (value) { } else {
await service.post(); await service.delete();
} else {
await service.delete();
}
_newsMarkQueue.removeWhere((element) => element.key == id);
} }
_newsMarkQueue.removeWhere((element) => element.key == id);
}); });
} }
} }

View File

@ -81,16 +81,8 @@ class RouteGenerator {
); );
case Routes.radarDetails: case Routes.radarDetails:
return _createRoute( return _createRoute(
MultiProvider( ChangeNotifierProvider<RadarDetailsState>(
providers: [ create: (context) => RadarDetailsState(),
ChangeNotifierProvider<RadarDetailsState>(
create: (context) => RadarDetailsState(),
),
if ((settings.arguments as Map<String, dynamic>)['state'] != null)
ChangeNotifierProvider<RadarState>.value(
value: (settings.arguments as Map<String, dynamic>)['state'],
)
],
child: RadarDetails( child: RadarDetails(
pageData: settings.arguments as Map<String, dynamic>, pageData: settings.arguments as Map<String, dynamic>,
), ),
@ -98,15 +90,8 @@ class RouteGenerator {
); );
case Routes.newsDetails: case Routes.newsDetails:
return _createRoute( return _createRoute(
MultiProvider( ChangeNotifierProvider<NewsDetailsState>(
providers: [ create: (context) => NewsDetailsState(),
ChangeNotifierProvider<NewsDetailsState>(
create: (context) => NewsDetailsState(),
),
ChangeNotifierProvider<NewsState>.value(
value: (settings.arguments as Map<String, dynamic>)['state'],
)
],
child: NewsDetails( child: NewsDetails(
pageData: settings.arguments as Map<String, dynamic>, pageData: settings.arguments as Map<String, dynamic>,
), ),