feat: extract provider, add android news screen

This commit is contained in:
Rongjian Zhang
2019-01-29 19:41:24 +08:00
parent 9ae00dff6d
commit 908d6df478
15 changed files with 339 additions and 418 deletions

View File

@@ -68,6 +68,10 @@ class EventItem extends StatelessWidget {
case 'ForkEvent':
return TextSpan(children: [
TextSpan(text: ' forked '),
createRepoLinkSpan(context, event.payload['forkee']['owner']['login'],
event.payload['forkee']['name']),
TextSpan(text: ' from '),
_buildRepo(context),
]);
default:
return TextSpan(
@@ -116,7 +120,7 @@ class EventItem extends StatelessWidget {
TextSpan _buildRepo(BuildContext context) {
String name = event.repo.name;
var arr = name.split('/');
return _buildLink(context, name, () => RepoScreen(arr[0], arr[1]));
return createRepoLinkSpan(context, arr[0], arr[1]);
}
TextSpan _buildIssue(BuildContext context) {

View File

@@ -0,0 +1,66 @@
import 'package:flutter/cupertino.dart';
import 'package:git_flux/utils/utils.dart';
typedef Future<void> Refresh();
typedef Widget BuildWithContent(
{List<Event> events, ScrollController controller, Refresh refresh});
class NewsProvider extends StatefulWidget {
final BuildWithContent build;
NewsProvider(this.build);
@override
NewsProviderState createState() => NewsProviderState();
}
class NewsProviderState extends State<NewsProvider> {
int page = 1;
bool loading = false;
List<Event> _events = [];
ScrollController _controller = ScrollController();
@override
void initState() {
super.initState();
_refresh();
_controller.addListener(() {
if (_controller.offset + 100 > _controller.position.maxScrollExtent &&
!_controller.position.outOfRange &&
!loading) {
_loadMore();
}
});
}
Future<void> _refresh() async {
setState(() {
loading = true;
});
page = 1;
var items = await fetchEvents(page);
setState(() {
loading = false;
_events = items;
});
}
_loadMore() async {
print('more');
setState(() {
loading = true;
});
page = page + 1;
var items = await fetchEvents(page);
setState(() {
loading = false;
_events.addAll(items);
});
}
@override
Widget build(context) {
return widget.build(
events: _events, controller: _controller, refresh: _refresh);
}
}

View File

@@ -1,5 +1,4 @@
export 'avatar.dart';
export 'event_item.dart';
export 'user_name.dart';
export 'timeline_item.dart';
export 'comment_item.dart';