fix: long list scaffold
This commit is contained in:
parent
af52d55af9
commit
17b6fd5d78
|
@ -166,7 +166,7 @@ class GithubNotificationItemSubject {
|
|||
int? _number;
|
||||
int? get number {
|
||||
if (_number == null) {
|
||||
_number = int.parse(url?.split('/')?.last ?? '0');
|
||||
_number = int.parse(url?.split('/').last ?? '0');
|
||||
}
|
||||
return _number;
|
||||
}
|
||||
|
|
|
@ -9,17 +9,17 @@ import '../widgets/link.dart';
|
|||
import '../widgets/error_reload.dart';
|
||||
|
||||
class LongListPayload<T, K> {
|
||||
T? header;
|
||||
int? totalCount;
|
||||
String? cursor;
|
||||
List<K>? leadingItems;
|
||||
T header;
|
||||
int totalCount;
|
||||
String cursor;
|
||||
List<K> leadingItems;
|
||||
List<K>? trailingItems;
|
||||
|
||||
LongListPayload({
|
||||
this.header,
|
||||
this.totalCount,
|
||||
this.cursor,
|
||||
this.leadingItems,
|
||||
required this.header,
|
||||
required this.totalCount,
|
||||
required this.cursor,
|
||||
required this.leadingItems,
|
||||
this.trailingItems,
|
||||
});
|
||||
}
|
||||
|
@ -51,12 +51,12 @@ class LongListStatefulScaffold<T, K> extends StatefulWidget {
|
|||
}
|
||||
|
||||
class _LongListStatefulScaffoldState<T, K>
|
||||
extends State<LongListStatefulScaffold<T?, K>> {
|
||||
extends State<LongListStatefulScaffold<T, K>> {
|
||||
late bool loading;
|
||||
bool loadingMore = false;
|
||||
String error = '';
|
||||
|
||||
LongListPayload<T?, K>? payload;
|
||||
LongListPayload<T, K>? payload;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
|
@ -94,7 +94,7 @@ class _LongListStatefulScaffoldState<T, K>
|
|||
await widget.onLoadMore(payload!.cursor);
|
||||
payload!.totalCount = _payload.totalCount;
|
||||
payload!.cursor = _payload.cursor;
|
||||
payload!.leadingItems!.addAll(_payload.leadingItems!);
|
||||
payload!.leadingItems.addAll(_payload.leadingItems);
|
||||
} finally {
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
|
@ -113,11 +113,11 @@ class _LongListStatefulScaffoldState<T, K>
|
|||
|
||||
int realIndex = index ~/ 2;
|
||||
|
||||
if (realIndex < payload!.leadingItems!.length) {
|
||||
return widget.itemBuilder(payload!.leadingItems![realIndex]);
|
||||
} else if (realIndex == payload!.leadingItems!.length) {
|
||||
var count = payload!.totalCount! -
|
||||
payload!.leadingItems!.length +
|
||||
if (realIndex < payload!.leadingItems.length) {
|
||||
return widget.itemBuilder(payload!.leadingItems[realIndex]);
|
||||
} else if (realIndex == payload!.leadingItems.length) {
|
||||
var count = payload!.totalCount -
|
||||
payload!.leadingItems.length +
|
||||
payload!.trailingItems!.length;
|
||||
return Container(
|
||||
padding: CommonStyle.padding,
|
||||
|
@ -150,13 +150,13 @@ class _LongListStatefulScaffoldState<T, K>
|
|||
);
|
||||
} else {
|
||||
return widget.itemBuilder(payload!
|
||||
.trailingItems![realIndex - payload!.leadingItems!.length - 1]);
|
||||
.trailingItems![realIndex - payload!.leadingItems.length - 1]);
|
||||
}
|
||||
}
|
||||
|
||||
int get _itemCount {
|
||||
int count = payload!.leadingItems!.length + payload!.trailingItems!.length;
|
||||
if (payload!.totalCount! > count) {
|
||||
int count = payload!.leadingItems.length + payload!.trailingItems!.length;
|
||||
if (payload!.totalCount > count) {
|
||||
count++;
|
||||
}
|
||||
return 2 * count; // including bottom border
|
||||
|
|
|
@ -25,7 +25,7 @@ class _GeSearchScreenState extends State<GeSearchScreen> {
|
|||
List<List> _payloads = [[], [], []];
|
||||
|
||||
TextEditingController? _controller;
|
||||
String get _keyword => _controller!.text?.trim() ?? '';
|
||||
String get _keyword => _controller!.text.trim();
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
|
|
|
@ -87,7 +87,7 @@ class GhIssueScreen extends StatelessWidget {
|
|||
);
|
||||
}
|
||||
|
||||
Future<GIssueData_repository?> _queryIssue(BuildContext context,
|
||||
Future<GIssueData_repository> _queryIssue(BuildContext context,
|
||||
{String? cursor}) async {
|
||||
final req = GIssueReq((b) {
|
||||
b.vars.owner = owner;
|
||||
|
@ -97,7 +97,7 @@ class GhIssueScreen extends StatelessWidget {
|
|||
});
|
||||
OperationResponse<GIssueData, GIssueVars?> res =
|
||||
await context.read<AuthModel>().gqlClient!.request(req).first;
|
||||
return res.data!.repository;
|
||||
return res.data!.repository!;
|
||||
}
|
||||
|
||||
@override
|
||||
|
@ -257,15 +257,14 @@ class GhIssueScreen extends StatelessWidget {
|
|||
},
|
||||
itemBuilder: (p) => TimelineItem(p),
|
||||
onRefresh: () async {
|
||||
final res =
|
||||
await (_queryIssue(context) as Future<GIssueData_repository>);
|
||||
final res = await _queryIssue(context);
|
||||
if (res.issueOrPullRequest!.G__typename == 'Issue') {
|
||||
final issue = res.issueOrPullRequest
|
||||
as GIssueData_repository_issueOrPullRequest__asIssue;
|
||||
return LongListPayload(
|
||||
header: res,
|
||||
totalCount: issue.timelineItems.totalCount,
|
||||
cursor: issue.timelineItems.pageInfo.endCursor,
|
||||
cursor: issue.timelineItems.pageInfo.endCursor!,
|
||||
leadingItems: issue.timelineItems.nodes!.toList(),
|
||||
trailingItems: [],
|
||||
);
|
||||
|
@ -275,22 +274,21 @@ class GhIssueScreen extends StatelessWidget {
|
|||
return LongListPayload(
|
||||
header: res,
|
||||
totalCount: pr.timelineItems.totalCount,
|
||||
cursor: pr.timelineItems.pageInfo.endCursor,
|
||||
cursor: pr.timelineItems.pageInfo.endCursor!,
|
||||
leadingItems: pr.timelineItems.nodes!.toList(),
|
||||
trailingItems: [],
|
||||
);
|
||||
}
|
||||
},
|
||||
onLoadMore: (_cursor) async {
|
||||
final res = await (_queryIssue(context, cursor: _cursor)
|
||||
as Future<GIssueData_repository>);
|
||||
final res = await _queryIssue(context, cursor: _cursor);
|
||||
if (res.issueOrPullRequest!.G__typename == 'Issue') {
|
||||
final issue = res.issueOrPullRequest
|
||||
as GIssueData_repository_issueOrPullRequest__asIssue;
|
||||
return LongListPayload(
|
||||
header: res,
|
||||
totalCount: issue.timelineItems.totalCount,
|
||||
cursor: issue.timelineItems.pageInfo.endCursor,
|
||||
cursor: issue.timelineItems.pageInfo.endCursor!,
|
||||
leadingItems: issue.timelineItems.nodes!.toList(),
|
||||
);
|
||||
} else {
|
||||
|
@ -299,7 +297,7 @@ class GhIssueScreen extends StatelessWidget {
|
|||
return LongListPayload(
|
||||
header: res,
|
||||
totalCount: pr.timelineItems.totalCount,
|
||||
cursor: pr.timelineItems.pageInfo.endCursor,
|
||||
cursor: pr.timelineItems.pageInfo.endCursor!,
|
||||
leadingItems: pr.timelineItems.nodes!.toList(),
|
||||
);
|
||||
}
|
||||
|
|
|
@ -270,7 +270,7 @@ class GhRepoScreen extends StatelessWidget {
|
|||
leftIconData: Octicons.history,
|
||||
text: Text(AppLocalizations.of(context)!.commits),
|
||||
rightWidget: Text(
|
||||
((ref.target as GRepoCommit).history?.totalCount ?? 0)
|
||||
((ref.target as GRepoCommit).history.totalCount)
|
||||
.toString()),
|
||||
url: '/github/$owner/$name/commits/${ref.name}',
|
||||
),
|
||||
|
|
|
@ -25,7 +25,7 @@ class _GhSearchScreenState extends State<GhSearchScreen> {
|
|||
|
||||
TextEditingController? _controller;
|
||||
|
||||
String get _keyword => _controller!.text?.trim() ?? '';
|
||||
String get _keyword => _controller!.text.trim();
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
|
|
|
@ -26,7 +26,7 @@ class _GlSearchScreenState extends State<GlSearchScreen> {
|
|||
|
||||
TextEditingController? _controller;
|
||||
|
||||
String get _keyword => _controller!.text?.trim() ?? '';
|
||||
String get _keyword => _controller!.text.trim();
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
|
|
Loading…
Reference in New Issue