1
0
mirror of https://github.com/nrop19/weiman_app.git synced 2025-08-03 07:15:45 +08:00
weiman_app/lib/activities/chapter/chapterTab.dart
2020-11-07 21:18:42 +00:00

262 lines
6.7 KiB
Dart
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:loading_more_list/loading_more_list.dart';
import 'package:provider/provider.dart';
import 'package:weiman/activities/chapter/image.dart';
import 'package:weiman/activities/chapter/viewerSwitcherWidget.dart';
import 'package:weiman/classes/chapter.dart';
import 'package:weiman/crawler/http18Comic.dart';
import 'package:weiman/db/book.dart';
import 'package:weiman/db/setting.dart';
import 'package:weiman/utils.dart';
import 'package:weiman/widgets/animatedLogo.dart';
class ChapterSourceList extends LoadingMoreBase<String> {
final Book book;
final Chapter chapter;
final Function onFirstLoaded;
bool firstLoad = true;
bool hasMore = true;
bool isMultiPage = false;
int page = 1;
ChapterSourceList({
this.book,
this.chapter,
this.onFirstLoaded,
});
@override
Future<bool> loadData([bool isloadMoreAction = false]) async {
final chapterContent = await Http18Comic.instance.getChapterContent(
book,
chapter,
page: page,
);
print(chapterContent.toString());
hasMore = chapterContent.hasNextPage;
this.addAll(chapterContent.images);
if (firstLoad) {
firstLoad = false;
isMultiPage = hasMore;
}
page++;
return true;
}
@override
Future<bool> refresh([bool notifyStateChanged = false]) {
firstLoad = true;
hasMore = true;
page = 1;
return super.refresh(notifyStateChanged);
}
}
class ChapterTab extends StatefulWidget {
final Book book;
final Chapter chapter;
final List<Widget> actions;
const ChapterTab({Key key, this.book, this.chapter, this.actions})
: super(key: key);
@override
_State createState() => _State();
}
class _State extends State<ChapterTab> {
ChapterSourceList sourceList;
ScrollController scrollController;
@override
initState() {
scrollController = ScrollController();
sourceList = ChapterSourceList(
book: widget.book,
chapter: widget.chapter,
);
widget.book.setHistory(widget.chapter);
super.initState();
// 隐藏/显示 状态栏
final setting = Provider.of<Setting>(context, listen: false);
final hide = setting.getHideOption();
if (hide == HideOption.auto) {
scrollController.addListener(() {
final isUp = scrollController.position.userScrollDirection ==
ScrollDirection.forward;
if (isUp)
showStatusBar();
else
hideStatusBar();
});
}
}
@override
dispose() {
widget.book.setHistory(widget.chapter);
scrollController?.dispose();
super.dispose();
}
Widget imageBuilder(ctx, String image, int index) {
index += 1;
bool reDraw = false;
try {
int cid = int.parse(widget.chapter.cid);
reDraw = cid >= 220980;
// print('创建图片 cid $cid reDraw $reDraw');
} catch (e) {}
return ImageWidget(
image: image,
index: index,
total: sourceList.length,
reSort: reDraw,
);
}
Widget indicatorBuilder(context, IndicatorStatus status) {
print('indicatorBuilder $status');
bool isSliver = true;
Widget widget;
switch (status) {
case IndicatorStatus.none:
widget = SizedBox();
break;
case IndicatorStatus.loadingMoreBusying:
widget = Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
AnimatedLogoWidget(width: 20, height: 30),
SizedBox(width: 10),
Text("正在读取")
],
);
widget = Container(
width: double.infinity,
height: kToolbarHeight,
child: widget,
alignment: Alignment.center,
);
break;
case IndicatorStatus.fullScreenBusying:
widget = Center(
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
AnimatedLogoWidget(width: 25, height: 30),
Text('读取中'),
],
),
);
if (isSliver) {
widget = SliverFillRemaining(
child: widget,
);
}
break;
case IndicatorStatus.error:
case IndicatorStatus.fullScreenError:
widget = Column(
mainAxisSize: MainAxisSize.min,
children: [
Text(
'读取失败\n你可能需要用梯子',
textAlign: TextAlign.center,
),
RaisedButton(
child: Text('再次重试'),
onPressed: sourceList.errorRefresh,
)
],
);
widget = Container(
width: double.infinity,
height: kToolbarHeight,
child: widget,
alignment: Alignment.center,
);
if (status == IndicatorStatus.fullScreenError) {
if (isSliver) {
widget = SliverFillRemaining(
child: widget,
);
} else {
widget = CustomScrollView(
slivers: <Widget>[
SliverFillRemaining(
child: widget,
)
],
);
}
}
break;
case IndicatorStatus.noMoreLoad:
widget = SizedBox();
break;
case IndicatorStatus.empty:
widget = Text(
'没有图片',
);
widget = Container(
width: double.infinity,
height: kToolbarHeight,
child: widget,
alignment: Alignment.center,
);
if (isSliver) {
widget = SliverToBoxAdapter(
child: widget,
);
} else {
widget = CustomScrollView(
slivers: <Widget>[
SliverFillRemaining(
child: widget,
)
],
);
}
break;
}
return widget;
}
@override
Widget build(BuildContext context) {
return CustomScrollView(
controller: scrollController,
slivers: [
SliverAppBar(
snap: true,
floating: true,
title: Text(widget.chapter.cname),
actions: [
ViewerSwitcherWidget(),
IconButton(
icon: Icon(Icons.vertical_align_top),
onPressed: () => scrollController.jumpTo(0.0),
),
...widget.actions,
],
),
LoadingMoreSliverList(
SliverListConfig(
sourceList: sourceList,
itemBuilder: imageBuilder,
addSemanticIndexes: true,
semanticIndexOffset: 10,
autoLoadMore: true,
indicatorBuilder: indicatorBuilder,
),
),
],
);
}
}