Skip to content

Commit 428e3ef

Browse files
committed
更新一些状态管理 demo
1 parent db0c5a4 commit 428e3ef

16 files changed

+404
-238
lines changed

lib/common/repositories/user_repository.dart

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,6 @@ class UserRepository {
106106
store.dispatch(UpdateUserAction(res.data));
107107
}
108108

109-
110109
///读取主题
111110
String? themeIndex = await LocalStorage.get(Config.THEME_COLOR);
112111
ref.read(appThemeStateProvider.notifier).pushTheme(themeIndex);
@@ -355,8 +354,8 @@ class UserRepository {
355354
/// 更新用户信息
356355
static updateUserRequest(params, Store store) async {
357356
String url = Address.getMyUserInfo();
358-
var res = await httpManager.netFetch(
359-
url, params, null, Options(method: "PATCH"));
357+
var res =
358+
await httpManager.netFetch(url, params, null, Options(method: "PATCH"));
360359
if (res != null && res.result) {
361360
var localResult = await getUserInfoLocal();
362361
User newUser = User.fromJson(res.data);
@@ -404,22 +403,20 @@ class UserRepository {
404403
return await next();
405404
}
406405

407-
static searchTrendUserRequest(String location,
408-
{String? cursor, ValueChanged? valueChanged}) async {
406+
static searchTrendUserRequest(String location, {String? cursor}) async {
409407
var result = await getTrendUser(location, cursor: cursor);
410408
if (result != null && result.data != null) {
411409
var endCursor = result.data!["search"]["pageInfo"]["endCursor"];
412410
var dataList = result.data!["search"]["user"];
413411
if (dataList == null || dataList.length == 0) {
414412
return DataResult(null, false);
415413
}
416-
var dataResult = [];
417-
valueChanged?.call(endCursor);
414+
List<SearchUserQL> dataResult = [];
418415
dataList.forEach((item) {
419416
var userModel = SearchUserQL.fromMap(item["user"]);
420417
dataResult.add(userModel);
421418
});
422-
return DataResult(dataResult, true);
419+
return DataResult((dataResult, endCursor), true);
423420
} else {
424421
return DataResult(null, false);
425422
}

lib/common/utils/common_utils.dart

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import 'package:gsy_github_app_flutter/common/local/local_storage.dart';
1212
import 'package:gsy_github_app_flutter/common/localization/default_localizations.dart';
1313
import 'package:gsy_github_app_flutter/common/net/address.dart';
1414
import 'package:gsy_github_app_flutter/provider/app_state_provider.dart';
15-
import 'package:gsy_github_app_flutter/redux/theme_redux.dart';
1615
import 'package:gsy_github_app_flutter/common/style/gsy_style.dart';
1716
import 'package:gsy_github_app_flutter/common/utils/navigator_utils.dart';
1817
import 'package:gsy_github_app_flutter/widget/gsy_flex_button.dart';
@@ -183,13 +182,6 @@ class CommonUtils {
183182
return fullName;
184183
}
185184

186-
static pushTheme(Store store, int index) {
187-
ThemeData themeData;
188-
List<Color> colors = getThemeListColor();
189-
themeData = getThemeData(colors[index]);
190-
store.dispatch(RefreshThemeDataAction(themeData));
191-
}
192-
193185
static getThemeData(Color color) {
194186
return ThemeData(
195187
useMaterial3: false,

lib/page/trend/trend_bloc.dart

Lines changed: 0 additions & 46 deletions
This file was deleted.

lib/page/trend/trend_page.dart

Lines changed: 45 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,24 @@
11
import 'dart:async';
22

33
import 'package:animations/animations.dart';
4+
import 'package:flutter/foundation.dart';
45
import 'package:flutter_riverpod/flutter_riverpod.dart';
6+
import 'package:gsy_github_app_flutter/db/provider/repos/trend_repository_db_provider.dart';
57
import 'package:gsy_github_app_flutter/page/repos/repository_detail_page.dart';
68
import 'package:flutter/material.dart';
79
import 'package:flutter/rendering.dart';
8-
import 'package:flutter_redux/flutter_redux.dart';
910
import 'package:fluttertoast/fluttertoast.dart';
1011
import 'package:gsy_github_app_flutter/common/localization/default_localizations.dart';
11-
import 'package:gsy_github_app_flutter/page/trend/trend_bloc.dart';
1212
import 'package:gsy_github_app_flutter/model/TrendingRepoModel.dart';
13+
import 'package:gsy_github_app_flutter/page/trend/trend_provider.dart';
1314
import 'package:gsy_github_app_flutter/page/trend/trend_user_page.dart';
1415
import 'package:gsy_github_app_flutter/provider/app_state_provider.dart';
15-
import 'package:gsy_github_app_flutter/redux/gsy_state.dart';
1616
import 'package:gsy_github_app_flutter/common/style/gsy_style.dart';
1717
import 'package:gsy_github_app_flutter/common/utils/navigator_utils.dart';
1818
import 'package:gsy_github_app_flutter/widget/gsy_card_item.dart';
1919
import 'package:gsy_github_app_flutter/widget/pull/nested/gsy_sliver_header_delegate.dart';
2020
import 'package:gsy_github_app_flutter/widget/pull/nested/nested_refresh.dart';
2121
import 'package:gsy_github_app_flutter/page/repos/widget/repos_item.dart';
22-
import 'package:redux/redux.dart';
2322

2423
/// 主页趋势tab页
2524
/// 目前采用纯 bloc 的 rxdart(stream) + streamBuilder
@@ -51,9 +50,6 @@ class TrendPageState extends ConsumerState<TrendPage>
5150
///滚动控制与监听
5251
final ScrollController scrollController = ScrollController();
5352

54-
///bloc
55-
final TrendBloc trendBloc = TrendBloc();
56-
5753
///显示刷新
5854
_showRefreshLoading() {
5955
Future.delayed(const Duration(seconds: 0), () {
@@ -97,7 +93,7 @@ class TrendPageState extends ConsumerState<TrendPage>
9793
}
9894

9995
///绘制头部可选item
100-
_renderHeader(Store<GSYState> store, Radius radius) {
96+
_renderHeader(Radius radius) {
10197
if (selectTime == null && selectType == null) {
10298
return Container();
10399
}
@@ -116,7 +112,7 @@ class TrendPageState extends ConsumerState<TrendPage>
116112
children: <Widget>[
117113
_renderHeaderPopItem(selectTime!.name, trendTimeList,
118114
(TrendTypeModel result) {
119-
if (trendBloc.isLoading) {
115+
if (trendLoadingState) {
120116
Fluttertoast.showToast(
121117
msg: GSYLocalizations.i18n(context)!.loading_text);
122118
return;
@@ -136,7 +132,7 @@ class TrendPageState extends ConsumerState<TrendPage>
136132
Container(height: 10.0, width: 0.5, color: GSYColors.white),
137133
_renderHeaderPopItem(selectType!.name, trendTypeList,
138134
(TrendTypeModel result) {
139-
if (trendBloc.isLoading) {
135+
if (trendLoadingState) {
140136
Fluttertoast.showToast(
141137
msg: GSYLocalizations.i18n(context)!.loading_text);
142138
return;
@@ -186,15 +182,17 @@ class TrendPageState extends ConsumerState<TrendPage>
186182
}
187183

188184
Future<void> requestRefresh() async {
189-
return trendBloc.requestRefresh(selectTime, selectType);
185+
var query = (selectTime?.value, selectType?.value);
186+
var _ = ref.refresh(trendFirstProvider(query));
187+
await ref.read(trendFirstProvider(query).future);
190188
}
191189

192190
@override
193191
bool get wantKeepAlive => true;
194192

195193
@override
196194
void didChangeDependencies() {
197-
if (!trendBloc.requested) {
195+
if (!trendRequestedState) {
198196
setState(() {
199197
selectTime = trendTime(context)[0];
200198
selectType = trendType(context)[0];
@@ -247,43 +245,44 @@ class TrendPageState extends ConsumerState<TrendPage>
247245
@override
248246
Widget build(BuildContext context) {
249247
super.build(context); // See AutomaticKeepAliveClientMixin.
250-
return StoreBuilder<GSYState>(
251-
builder: (context, store) {
252-
return Scaffold(
253-
backgroundColor: GSYColors.mainBackgroundColor,
254248

255-
///采用目前采用纯 bloc 的 rxdart(stream) + streamBuilder
256-
body: StreamBuilder<List<TrendingRepoModel>?>(
257-
stream: trendBloc.stream,
258-
builder: (context, snapShot) {
259-
///下拉刷新
260-
return NestedScrollViewRefreshIndicator(
261-
key: refreshIndicatorKey,
262-
onRefresh: requestRefresh,
249+
///展示非注解的 riverpod 并且配置先后顺序
250+
return Consumer(
251+
builder: (BuildContext context, WidgetRef ref, Widget? child) {
252+
final firstAsync =
253+
ref.watch(trendFirstProvider((selectTime?.value, selectType?.value)));
254+
final secondAsync = ref
255+
.watch(trendSecondProvider((selectTime?.value, selectType?.value)));
256+
var result = secondAsync.value?.data as List<TrendingRepoModel>? ??
257+
firstAsync.value?.data as List<TrendingRepoModel>?;
258+
259+
return Scaffold(
260+
backgroundColor: GSYColors.mainBackgroundColor,
261+
body: NestedScrollViewRefreshIndicator(
262+
key: refreshIndicatorKey,
263+
onRefresh: requestRefresh,
263264

264-
///嵌套滚动
265-
child: NestedScrollView(
266-
controller: scrollController,
265+
///嵌套滚动
266+
child: NestedScrollView(
267+
controller: scrollController,
268+
physics: const AlwaysScrollableScrollPhysics(),
269+
headerSliverBuilder: (context, innerBoxIsScrolled) {
270+
return _sliverBuilder(context, innerBoxIsScrolled);
271+
},
272+
body: (result == null || result.isEmpty)
273+
? _buildEmpty()
274+
: ListView.builder(
267275
physics: const AlwaysScrollableScrollPhysics(),
268-
headerSliverBuilder: (context, innerBoxIsScrolled) {
269-
return _sliverBuilder(context, innerBoxIsScrolled, store);
276+
itemBuilder: (context, index) {
277+
return _renderItem(result[index]);
270278
},
271-
body: (snapShot.data == null || snapShot.data!.isEmpty)
272-
? _buildEmpty()
273-
: ListView.builder(
274-
physics: const AlwaysScrollableScrollPhysics(),
275-
itemBuilder: (context, index) {
276-
return _renderItem(snapShot.data![index]);
277-
},
278-
itemCount: snapShot.data!.length,
279-
),
279+
itemCount: result.length,
280280
),
281-
);
282-
}),
283-
floatingActionButton: trendUserButton(),
284-
);
285-
},
286-
);
281+
),
282+
),
283+
floatingActionButton: trendUserButton(),
284+
);
285+
});
287286
}
288287

289288
trendUserButton() {
@@ -315,8 +314,7 @@ class TrendPageState extends ConsumerState<TrendPage>
315314
}
316315

317316
///嵌套可滚动头部
318-
List<Widget> _sliverBuilder(
319-
BuildContext context, bool innerBoxIsScrolled, Store store) {
317+
List<Widget> _sliverBuilder(BuildContext context, bool innerBoxIsScrolled) {
320318
return <Widget>[
321319
///动态头部
322320
SliverPersistentHeader(
@@ -341,7 +339,7 @@ class TrendPageState extends ConsumerState<TrendPage>
341339
child: Padding(
342340
padding:
343341
EdgeInsets.only(top: lr, bottom: 15, left: lr, right: lr),
344-
child: _renderHeader(store as Store<GSYState>, radius),
342+
child: _renderHeader(radius),
345343
),
346344
);
347345
}),

lib/page/trend/trend_provider.dart

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import 'package:gsy_github_app_flutter/common/repositories/data_result.dart';
2+
import 'package:gsy_github_app_flutter/common/repositories/repos_repository.dart';
3+
import 'package:riverpod_annotation/riverpod_annotation.dart';
4+
5+
///展示非注解 riverpod ,并且针对处理数据库 & 服务器数据请求,两个 provider 先后顺序
6+
7+
bool trendLoadingState = false;
8+
bool trendRequestedState = false;
9+
10+
final trendFirstProvider =
11+
FutureProvider.family<DataResult?, (String?, String?)>((ref, query) async {
12+
var (since, selectType) = query;
13+
trendLoadingState = true;
14+
var res = await ReposRepository.getTrendRequest(
15+
since: since, languageType: selectType);
16+
trendLoadingState = false;
17+
trendRequestedState = true;
18+
if (res != null && res.result) {
19+
return res;
20+
}
21+
return null;
22+
});
23+
24+
final trendSecondProvider =
25+
FutureProvider.family<DataResult?, (String?, String?)>((ref, query) async {
26+
trendLoadingState = true;
27+
final res = await ref.watch(trendFirstProvider(query).future);
28+
trendLoadingState = false;
29+
trendRequestedState = true;
30+
if (res != null && res.next != null) {
31+
var resNext = await res.next?.call();
32+
if (resNext != null && resNext.result) {
33+
return res;
34+
}
35+
}
36+
return null;
37+
});

0 commit comments

Comments
 (0)