提交 dcee668e authored 作者: yueweilu's avatar yueweilu

跳转逻辑

上级 54541654
...@@ -4,8 +4,10 @@ import 'package:flutter/material.dart'; ...@@ -4,8 +4,10 @@ import 'package:flutter/material.dart';
import 'package:flutter_book/theme.dart'; import 'package:flutter_book/theme.dart';
import 'package:flutter_book/utils/index.dart'; import 'package:flutter_book/utils/index.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:go_router/go_router.dart';
import '../../models/index.dart'; import '../../models/index.dart';
import '../../routes/index.dart';
part 'view.dart'; part 'view.dart';
part 'widgets/item.dart'; part 'widgets/item.dart';
\ No newline at end of file
...@@ -3,9 +3,13 @@ part of book_category; ...@@ -3,9 +3,13 @@ part of book_category;
class BookCategoryPage extends StatefulWidget { class BookCategoryPage extends StatefulWidget {
final List <ChapterModel> chapters; final List <ChapterModel> chapters;
final String bookId;
final BookDetailModel bookDetails;
const BookCategoryPage({ const BookCategoryPage({
Key? key, Key? key,
required this.chapters required this.chapters,
required this.bookId,
required this.bookDetails
}) : super(key: key); }) : super(key: key);
@override @override
...@@ -20,7 +24,7 @@ class _BookCategoryPageState extends State<BookCategoryPage> { ...@@ -20,7 +24,7 @@ class _BookCategoryPageState extends State<BookCategoryPage> {
Expanded( Expanded(
child: ListView.builder( child: ListView.builder(
itemBuilder:(BuildContext context, int index){ itemBuilder:(BuildContext context, int index){
return BuildItem(model: widget.chapters[index],); return BuildItem(model: widget.chapters[index],bookId: widget.bookId,bookDetails: widget.bookDetails,);
}, },
itemCount: widget.chapters.length, itemCount: widget.chapters.length,
), ),
......
...@@ -2,9 +2,13 @@ part of book_category; ...@@ -2,9 +2,13 @@ part of book_category;
class BuildItem extends StatefulWidget { class BuildItem extends StatefulWidget {
final ChapterModel model; final ChapterModel model;
final String bookId;
final BookDetailModel bookDetails;
const BuildItem({ const BuildItem({
Key? key, Key? key,
required this.model required this.model,
required this.bookId,
required this.bookDetails
}) : super(key: key); }) : super(key: key);
@override @override
...@@ -19,9 +23,13 @@ class _BuildItemState extends State<BuildItem> { ...@@ -19,9 +23,13 @@ class _BuildItemState extends State<BuildItem> {
/// 章节名称容器 /// 章节名称容器
GestureDetector( GestureDetector(
onTap: (){ onTap: (){
setState(() { // 如果章下面没有节 点击才会跳转
widget.model.selected = !widget.model.selected; if (widget.model.children!.isEmpty){
}); context.pushNamed(Routes.web,queryParameters: {'book_id': widget.bookDetails.bookId.toString(),'chapter_id': widget.model.id.toString(),'chapter_name':widget.model.name.toString()},extra: widget.bookDetails);
}
// setState(() {
// widget.model.selected = !widget.model.selected;
// });
}, },
child: Container( child: Container(
padding: EdgeInsets.symmetric(horizontal: 15.w), padding: EdgeInsets.symmetric(horizontal: 15.w),
...@@ -49,7 +57,19 @@ class _BuildItemState extends State<BuildItem> { ...@@ -49,7 +57,19 @@ class _BuildItemState extends State<BuildItem> {
), ),
Transform.rotate( Transform.rotate(
angle: widget.model.selected?0:-90 * (3.141592653589793 / 180), angle: widget.model.selected?0:-90 * (3.141592653589793 / 180),
child: Image.asset('assets/images/down.png') child: GestureDetector(
onTap: (){
setState(() {
widget.model.selected = !widget.model.selected;
});
},
child: Container(
width: 20,
height: 20,
// color: Colors.red,
child: Image.asset('assets/images/down.png')
),
)
) )
], ],
...@@ -63,7 +83,13 @@ class _BuildItemState extends State<BuildItem> { ...@@ -63,7 +83,13 @@ class _BuildItemState extends State<BuildItem> {
shrinkWrap: true, shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
itemBuilder: (BuildContext context, int index){ itemBuilder: (BuildContext context, int index){
return _buildSection(widget.model.children![index]); ChapterModel model = widget.model.children![index];
return GestureDetector(
onTap: (){
context.pushNamed(Routes.web,queryParameters: {'book_id': widget.bookDetails.bookId.toString(),'chapter_id':model.id.toString(),'chapter_name':model.name.toString()},extra: widget.bookDetails);
},
child: _buildSection(model)
);
}, },
itemCount: widget.model.children!.length, itemCount: widget.model.children!.length,
) )
......
...@@ -75,7 +75,7 @@ class _BookDetailPageState extends State<BookDetailPage> with SingleTickerProvid ...@@ -75,7 +75,7 @@ class _BookDetailPageState extends State<BookDetailPage> with SingleTickerProvid
child: TabBarView( child: TabBarView(
controller: controller.tabController, controller: controller.tabController,
children: [ children: [
BookCategoryPage(chapters: controller.chapters,), BookCategoryPage(chapters: controller.chapters,bookId: controller.bookId,bookDetails: controller.bookDetails,),
Container( Container(
padding: EdgeInsets.only(left: 15.w,right: 15.w,top:12.w), padding: EdgeInsets.only(left: 15.w,right: 15.w,top:12.w),
color: Colors.white, color: Colors.white,
...@@ -128,7 +128,7 @@ class _BookDetailPageState extends State<BookDetailPage> with SingleTickerProvid ...@@ -128,7 +128,7 @@ class _BookDetailPageState extends State<BookDetailPage> with SingleTickerProvid
// 1免费 0 不免费 // 1免费 0 不免费
if(controller.bookDetails.isFree == 1){ if(controller.bookDetails.isFree == 1){
context.pushNamed(Routes.web,queryParameters: {'book_id': controller.bookDetails.bookId.toString(),'chapter_id': controller.bookDetails.chapterId.toString(),'chapter_name':controller.bookDetails.chapterName.toString}); context.pushNamed(Routes.web,queryParameters: {'book_id': controller.bookDetails.bookId.toString(),'chapter_id': controller.bookDetails.chapterId.toString(),'chapter_name':controller.bookDetails.chapterName.toString()},extra: controller.bookDetails);
} }
else { else {
// 没有购买 // 没有购买
...@@ -154,11 +154,11 @@ class _BookDetailPageState extends State<BookDetailPage> with SingleTickerProvid ...@@ -154,11 +154,11 @@ class _BookDetailPageState extends State<BookDetailPage> with SingleTickerProvid
} }
} }
else{ else{
context.pushNamed(Routes.web,queryParameters: {'book_id': controller.bookDetails.bookId.toString(),'chapter_id': controller.bookDetails.chapterId.toString(),'chapter_name':controller.bookDetails.chapterName.toString()}); context.pushNamed(Routes.web,queryParameters: {'book_id': controller.bookDetails.bookId.toString(),'chapter_id': controller.bookDetails.chapterId.toString(),'chapter_name':controller.bookDetails.chapterName.toString()},extra: controller.bookDetails);
} }
} }
else{ else{
context.pushNamed(Routes.web,queryParameters: {'book_id': controller.bookDetails.bookId.toString(),'chapter_id': controller.bookDetails.chapterId.toString(),'chapter_name':controller.bookDetails.chapterName.toString()}); context.pushNamed(Routes.web,queryParameters: {'book_id': controller.bookDetails.bookId.toString(),'chapter_id': controller.bookDetails.chapterId.toString(),'chapter_name':controller.bookDetails.chapterName.toString()},extra: controller.bookDetails);
} }
} }
}, },
......
...@@ -45,6 +45,7 @@ class BookInfoPage extends StatelessWidget { ...@@ -45,6 +45,7 @@ class BookInfoPage extends StatelessWidget {
Container( Container(
margin: EdgeInsets.symmetric(vertical: 10.w), margin: EdgeInsets.symmetric(vertical: 10.w),
child: Row( child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
Column( Column(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
...@@ -71,17 +72,24 @@ class BookInfoPage extends StatelessWidget { ...@@ -71,17 +72,24 @@ class BookInfoPage extends StatelessWidget {
height: 90, height: 90,
// color: Colors.green, // color: Colors.green,
child: Column( child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,
children: List.generate(model.ratingList!.length, (index){ mainAxisAlignment: MainAxisAlignment.center,
return _buildProgrss(5- index.toDouble(), model.ratingList![index].toDouble()/model.ratingCount!); children: [
}).toList() Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.end,
children: List.generate(model.ratingList!.length, (index){
return _buildProgrss(5- index.toDouble(), model.ratingList![index].toDouble()/model.ratingCount!);
}).toList()
),
Text('${model.ratingCount}个评分',style: TextStyle(fontSize: 9.w,height: 1.4,color: Colours.c9),)
],
), ),
), ),
) ),
], ],
), ),
) ),
], ],
), ),
Container(height: 1,width: double.infinity,color: Colours.cF2,), Container(height: 1,width: double.infinity,color: Colours.cF2,),
...@@ -90,19 +98,26 @@ class BookInfoPage extends StatelessWidget { ...@@ -90,19 +98,26 @@ class BookInfoPage extends StatelessWidget {
Column( Column(
mainAxisAlignment: MainAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: ['书名','作者','分类','出品方','出版社','上架时间'].map((item){ children: [
{'name':'书名','value':model.bookName},
{'name':'作者','value':model.authors},
{'name':'分类','value':model.categoryName},
{'name':'出品方','value':model.producersName},
{'name':'出版社','value':model.pressName},
{'name':'上架时间','value':Tools.dateFromMS(model.onsaleTime!.toInt(),pattern:'yyyy年MM月dd日' )},
].map((item){
return Row( return Row(
children: [ children: [
Container( Container(
// color: Colors.cyan, // color: Colors.cyan,
alignment: Alignment.centerRight, alignment: Alignment.centerRight,
width: 50, width: 50,
child: Text(item,style: const TextStyle(fontSize: 11,height: 2.1,color: Colours.c3),), child: Text(item['name'].toString(),style: const TextStyle(fontSize: 11,height: 2.1,color: Colours.c3),),
), ),
Gaps.hGaps20, Gaps.hGaps20,
Container( Container(
alignment: Alignment.centerLeft, alignment: Alignment.centerLeft,
child: Text(item,style: const TextStyle(fontSize: 11,height: 2.1,color: Colours.c9),textAlign: TextAlign.end,), child: Text(item['value'].toString(),style: const TextStyle(fontSize: 11,height: 2.1,color: Colours.c9),textAlign: TextAlign.end,),
), ),
], ],
); );
......
...@@ -3,9 +3,10 @@ part of web; ...@@ -3,9 +3,10 @@ part of web;
class ReadController extends FullLifeCycleController with GetSingleTickerProviderStateMixin{ class ReadController extends FullLifeCycleController with GetSingleTickerProviderStateMixin{
final String bookId; final String bookId;
final String chapterId; String chapterId;
final String chapterName; String chapterName;
ReadController({required this.bookId, required this.chapterId,required this.chapterName}); final BookDetailModel bookDetailModel;
ReadController({required this.bookId, required this.chapterId,required this.chapterName,required this.bookDetailModel});
// 目录 // 目录
List <ChapterModel> chapters = []; List <ChapterModel> chapters = [];
...@@ -84,6 +85,13 @@ class ReadController extends FullLifeCycleController with GetSingleTickerProvide ...@@ -84,6 +85,13 @@ class ReadController extends FullLifeCycleController with GetSingleTickerProvide
update(); update();
} }
// 选择了某个章节
void selectChapter(ChapterModel model) {
chapterName = model.name??'';
chapterId = model.id.toString();
update();
}
// 初始化录音组件 // 初始化录音组件
Future<void> openTheRecorder() async { Future<void> openTheRecorder() async {
// 获取权限 // 获取权限
...@@ -326,8 +334,6 @@ class ReadController extends FullLifeCycleController with GetSingleTickerProvide ...@@ -326,8 +334,6 @@ class ReadController extends FullLifeCycleController with GetSingleTickerProvide
void chooseTool(ToolModel selectedModel){ void chooseTool(ToolModel selectedModel){
for (var model in tools) { for (var model in tools) {
// 如果当前遍历到的工具是选中的,并且不是点击的工具,则取消选中 // 如果当前遍历到的工具是选中的,并且不是点击的工具,则取消选中
......
part of web; part of web;
class DiscussController extends GetxController { class DiscussController extends GetxController {
final BookDetailModel bookDetailModel;
// 当前的章节id
final String chapterId;
DiscussController({required this.bookDetailModel,required this.chapterId});
List<DiscussModel> discuss = []; List<DiscussModel> discuss = [];
final EasyRefreshController refreshController = EasyRefreshController( final EasyRefreshController refreshController = EasyRefreshController(
controlFinishLoad: true, controlFinishLoad: true,
...@@ -32,8 +36,8 @@ class DiscussController extends GetxController { ...@@ -32,8 +36,8 @@ class DiscussController extends GetxController {
final result = await LibraryAPI.discussList( final result = await LibraryAPI.discussList(
page: _page, page: _page,
limit: _limit, limit: _limit,
bookId: '110', bookId: bookDetailModel.bookId.toString(),
chapterId: '1' chapterId: chapterId
); );
// 如果是刷新 清理数据 // 如果是刷新 清理数据
if (isRefresh) discuss.clear(); if (isRefresh) discuss.clear();
......
...@@ -40,4 +40,5 @@ part 'widgets/note.dart'; ...@@ -40,4 +40,5 @@ part 'widgets/note.dart';
part 'widgets/book.dart'; part 'widgets/book.dart';
part 'note_controller.dart'; part 'note_controller.dart';
part 'discuss_controller.dart'; part 'discuss_controller.dart';
part 'widgets/input_discuss.dart'; part 'widgets/input_discuss.dart';
\ No newline at end of file part 'widgets/item.dart';
\ No newline at end of file
part of web; part of web;
class NoteController extends GetxController { class NoteController extends GetxController {
final BookDetailModel bookDetailModel;
// 当前的章节id
final String chapterId;
NoteController({required this.bookDetailModel,required this.chapterId});
List<NoteModel> notes = []; List<NoteModel> notes = [];
final EasyRefreshController refreshController = EasyRefreshController( final EasyRefreshController refreshController = EasyRefreshController(
...@@ -34,8 +37,8 @@ class NoteController extends GetxController { ...@@ -34,8 +37,8 @@ class NoteController extends GetxController {
final result = await LibraryAPI.noteList( final result = await LibraryAPI.noteList(
page: _page, page: _page,
limit: _limit, limit: _limit,
bookId: '110', bookId: bookDetailModel.bookId.toString(),
chapterId: '1' chapterId: chapterId
); );
// 如果是刷新 清理数据 // 如果是刷新 清理数据
if (isRefresh) notes.clear(); if (isRefresh) notes.clear();
......
...@@ -4,11 +4,13 @@ class ReadPage extends StatefulWidget { ...@@ -4,11 +4,13 @@ class ReadPage extends StatefulWidget {
final String bookId; final String bookId;
final String chapterId; final String chapterId;
final String chapterName; final String chapterName;
final BookDetailModel bookDetailModel;
const ReadPage({ const ReadPage({
Key? key, Key? key,
required this.bookId, required this.bookId,
required this.chapterId, required this.chapterId,
required this.chapterName, required this.chapterName,
required this.bookDetailModel
}) : super(key: key); }) : super(key: key);
@override @override
...@@ -16,6 +18,7 @@ class ReadPage extends StatefulWidget { ...@@ -16,6 +18,7 @@ class ReadPage extends StatefulWidget {
} }
class _ReadPageState extends State<ReadPage> { class _ReadPageState extends State<ReadPage> {
late InAppWebViewController _webViewController;
@override @override
void initState() { void initState() {
...@@ -24,25 +27,25 @@ class _ReadPageState extends State<ReadPage> { ...@@ -24,25 +27,25 @@ class _ReadPageState extends State<ReadPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return GetBuilder<ReadController>( return GetBuilder<ReadController>(
init: ReadController(bookId: widget.bookId, chapterId: widget.chapterId,chapterName: widget.chapterName), init: ReadController(bookId: widget.bookId, chapterId: widget.chapterId,chapterName: widget.chapterName,bookDetailModel: widget.bookDetailModel),
builder: (readController) => Scaffold( builder: (readController) => Scaffold(
appBar: CustomAppBar( appBar: CustomAppBar(
title: Text(widget.chapterName), title: Text(readController.chapterName),
centerTitle: false, centerTitle: false,
actions: [ actions: [
GestureDetector( GestureDetector(
onTap: () { onTap: () {
readController.getBookDown(); readController.getBookDown();
}, },
child: Text( child: Text(
'离线阅读', '离线阅读',
style: TextStyle( style: TextStyle(
fontSize: 14.w, color: Colours.c3), fontSize: 14.w, color: Colours.c3),
)) ))
], ],
), ),
resizeToAvoidBottomInset: false, resizeToAvoidBottomInset: false,
floatingActionButton: readController.show?GestureDetector( floatingActionButton: readController.show&& !readController.toolModel.selected?GestureDetector(
onTap: (){ onTap: (){
readController.setShowChat(true); readController.setShowChat(true);
readController.noteTitle = '你好你问你你等您第五年对哦in我ID呢哦win地哦为内地那打卡你打困哪'; readController.noteTitle = '你好你问你你等您第五年对哦in我ID呢哦win地哦为内地那打卡你打困哪';
...@@ -56,11 +59,11 @@ class _ReadPageState extends State<ReadPage> { ...@@ -56,11 +59,11 @@ class _ReadPageState extends State<ReadPage> {
color: Colors.white, color: Colors.white,
child: Stack( child: Stack(
children: [ children: [
Container( // Container(
height: 40, // height: 40,
width: double.infinity, // width: double.infinity,
color: Colors.lightBlue, // color: Colors.lightBlue,
), // ),
InAppWebView( InAppWebView(
initialUrlRequest: URLRequest( initialUrlRequest: URLRequest(
url: Uri.parse('http://150.158.138.40:9200/read.html'), url: Uri.parse('http://150.158.138.40:9200/read.html'),
...@@ -68,11 +71,14 @@ class _ReadPageState extends State<ReadPage> { ...@@ -68,11 +71,14 @@ class _ReadPageState extends State<ReadPage> {
contextMenu: ContextMenu( contextMenu: ContextMenu(
options: ContextMenuOptions(hideDefaultSystemContextMenuItems: true), options: ContextMenuOptions(hideDefaultSystemContextMenuItems: true),
), ),
onWebViewCreated: (InAppWebViewController controller){
_webViewController = controller;
},
onLoadStop: (controller, url) { onLoadStop: (controller, url) {
// flutter 主动给 js 传参数 // flutter 主动给 js 传参数
Map<String, dynamic> param = { Map<String, dynamic> param = {
'book_id': widget.bookId, 'book_id': readController.bookId,
'chapter_id': widget.chapterId, 'chapter_id': readController.chapterId,
'token':UserStore.to.token 'token':UserStore.to.token
}; };
controller.evaluateJavascript(source: 'callbackInFlutterComponent("$param");'); controller.evaluateJavascript(source: 'callbackInFlutterComponent("$param");');
...@@ -232,57 +238,56 @@ class _ReadPageState extends State<ReadPage> { ...@@ -232,57 +238,56 @@ class _ReadPageState extends State<ReadPage> {
); );
} }
/// 目录、评论、笔记
Widget detail(ReadController controller,ToolModel model){
if(model.tag == 0){
return ReadCategoryPage(controller: controller,
onTap: (){
controller.chooseTool(model);
},
onTapChapter: (ChapterModel chapterModel){
print('-----------选择的章节-------------${chapterModel.name}--------');
// 配置选择的章节
controller.selectChapter(chapterModel);
// 取消选中 tool
controller.chooseTool(model);
// 选择了新的章节 刷新 webview
_webViewController.reload();
},
);
}
else if(model.tag == 1){
return ReadNotePage(onTap: (){
controller.chooseTool(model);
},bookDetailModel: controller.bookDetailModel,chapterId: controller.chapterId,);
}
else if(model.tag == 2){
return ReadDiscussPage(onTap: (){
controller.chooseTool(model);
},bookDetailModel: controller.bookDetailModel,chapterId:controller.chapterId,);
}
return const SizedBox();
}
/// 目录、评论、笔记 背景
Widget _showContent(ReadController controller,ToolModel model) { Widget _showContent(ReadController controller,ToolModel model) {
Console.log('++++++++++++++++++++++++${model.tag}'); Console.log('++++++++++++++++++++++++${model.tag}');
if (controller.show){ if (controller.show){
if (model.tag == 0){ if(model.selected){
return model.selected? Container( return Container(
color: const Color(0xFF000000).withOpacity(0.5), color: const Color(0xFF000000).withOpacity(0.5),
padding: EdgeInsets.only(top: MediaQuery.of(context).size.height * 0.2), padding: EdgeInsets.only(top: MediaQuery.of(context).size.height * 0.2),
child: ClipRRect( child: ClipRRect(
borderRadius: BorderRadius.only(topRight: Radius.circular(8.w),topLeft: Radius.circular(8.w)), borderRadius: BorderRadius.only(topRight: Radius.circular(8.w),topLeft: Radius.circular(8.w)),
child: Container( child: Container(
color: Colors.white, color: Colors.white,
child: ReadCategoryPage(controller: controller,onTap: (){ child: detail(controller, model)
controller.chooseTool(model);
},),
), ),
), ),
// child: ReadCategoryPage(), // child: ReadCategoryPage(),
):const SizedBox(); );
}
else if (model.tag == 1){
return model.selected? Container(
color: const Color(0xFF000000).withOpacity(0.5),
padding: EdgeInsets.only(top: MediaQuery.of(context).size.height * 0.2),
child: ClipRRect(
borderRadius: BorderRadius.only(topRight: Radius.circular(8.w),topLeft: Radius.circular(8.w)),
child: Container(
color: Colors.white,
child: ReadNotePage(onTap: (){
controller.chooseTool(model);
},),
),
),
// child: ReadCategoryPage(),
):const SizedBox();
} }
else if (model.tag == 2){ else{
return model.selected? Container( return const SizedBox();
color: const Color(0xFF000000).withOpacity(0.5),
padding: EdgeInsets.only(top: MediaQuery.of(context).size.height * 0.2),
child: ClipRRect(
borderRadius: BorderRadius.only(topRight: Radius.circular(8.w),topLeft: Radius.circular(8.w)),
child: Container(
color: Colors.white,
child: ReadDiscussPage(onTap: (){
controller.chooseTool(model);
},),
),
),
// child: ReadCategoryPage(),
):const SizedBox();
} }
} }
return const SizedBox(); return const SizedBox();
......
part of web; part of web;
class BuildBook extends StatelessWidget { class BuildBook extends StatelessWidget {
const BuildBook({Key? key}) : super(key: key); final BookDetailModel bookDetailModel;
const BuildBook({
Key? key,
required this.bookDetailModel
}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
...@@ -18,7 +22,7 @@ class BuildBook extends StatelessWidget { ...@@ -18,7 +22,7 @@ class BuildBook extends StatelessWidget {
CustomCard( CustomCard(
width: 72.w, width: 72.w,
height: 86.w, height: 86.w,
url: '', url: bookDetailModel.img??'',
), ),
Container( Container(
height: 87.w, height: 87.w,
...@@ -31,8 +35,8 @@ class BuildBook extends StatelessWidget { ...@@ -31,8 +35,8 @@ class BuildBook extends StatelessWidget {
Column( Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text('书名',style: TextStyle(fontSize: 14.w,height: 1.5,fontWeight: Fonts.medium,color: Colours.c3),), Text(bookDetailModel.bookName??'',style: TextStyle(fontSize: 14.w,height: 1.5,fontWeight: Fonts.medium,color: Colours.c3),),
Text('作者',style: TextStyle(fontSize: 12.w,height: 1.5,color: Colours.c6),), Text(bookDetailModel.authors??'',style: TextStyle(fontSize: 12.w,height: 1.5,color: Colours.c6),),
], ],
), ),
], ],
......
...@@ -3,10 +3,12 @@ part of web; ...@@ -3,10 +3,12 @@ part of web;
class ReadCategoryPage extends StatefulWidget { class ReadCategoryPage extends StatefulWidget {
final ReadController controller; final ReadController controller;
final void Function()? onTap; final void Function()? onTap;
final Function(ChapterModel chapterModel) onTapChapter;
const ReadCategoryPage({ const ReadCategoryPage({
Key? key, Key? key,
required this.controller, required this.controller,
required this.onTap, required this.onTap,
required this.onTapChapter
}) : super(key: key); }) : super(key: key);
@override @override
...@@ -60,15 +62,18 @@ class _ReadCategoryPageState extends State<ReadCategoryPage> { ...@@ -60,15 +62,18 @@ class _ReadCategoryPageState extends State<ReadCategoryPage> {
), ),
), ),
), ),
BuildBook(), BuildBook(bookDetailModel: widget.controller.bookDetailModel,),
// Expanded( Expanded(
// child: ListView.builder( child: ListView.builder(
// itemBuilder:(BuildContext context, int index){ itemBuilder:(BuildContext context, int index){
// return BuildItem(model: widget.controller.chapters[index],); return BuildItem(model: widget.controller.chapters[index],onTapChapter:(ChapterModel chapterModel){
// }, widget.onTapChapter(chapterModel);
// itemCount: widget.controller.chapters.length, widget.onTap;
// ), },);
// ), },
itemCount: widget.controller.chapters.length,
),
),
], ],
), ),
); );
......
...@@ -2,9 +2,14 @@ part of web; ...@@ -2,9 +2,14 @@ part of web;
class ReadDiscussPage extends StatefulWidget { class ReadDiscussPage extends StatefulWidget {
final void Function()? onTap; final void Function()? onTap;
final BookDetailModel bookDetailModel;
// 当前的章节id
final String chapterId;
const ReadDiscussPage({ const ReadDiscussPage({
Key? key, Key? key,
required this.onTap, required this.onTap,
required this.bookDetailModel,
required this.chapterId
}) : super(key: key); }) : super(key: key);
@override @override
...@@ -16,7 +21,7 @@ class _ReadDiscussPageState extends State<ReadDiscussPage> { ...@@ -16,7 +21,7 @@ class _ReadDiscussPageState extends State<ReadDiscussPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return GetBuilder<DiscussController>( return GetBuilder<DiscussController>(
init: DiscussController(), init: DiscussController(bookDetailModel: widget.bookDetailModel,chapterId: widget.chapterId),
builder:(controller) => Scaffold( builder:(controller) => Scaffold(
resizeToAvoidBottomInset: false, resizeToAvoidBottomInset: false,
body: Column( body: Column(
...@@ -58,7 +63,7 @@ class _ReadDiscussPageState extends State<ReadDiscussPage> { ...@@ -58,7 +63,7 @@ class _ReadDiscussPageState extends State<ReadDiscussPage> {
), ),
), ),
), ),
BuildBook(), BuildBook(bookDetailModel: widget.bookDetailModel,),
Expanded( Expanded(
child: ListView.builder( child: ListView.builder(
itemBuilder: (BuildContext context,int index){ itemBuilder: (BuildContext context,int index){
......
part of web;
class BuildItem extends StatefulWidget {
final ChapterModel model;
final Function(ChapterModel chapterModel) onTapChapter;
const BuildItem({
Key? key,
required this.model,
required this.onTapChapter
}) : super(key: key);
@override
State<BuildItem> createState() => _BuildItemState();
}
class _BuildItemState extends State<BuildItem> {
@override
Widget build(BuildContext context) {
return Column(
children: [
/// 章节名称容器
GestureDetector(
onTap: (){
if(widget.model.children!.isEmpty){
widget.onTapChapter(widget.model);
}
},
child: Container(
padding: EdgeInsets.symmetric(horizontal: 15.w),
height: 30.w,
color: Colors.white,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(widget.model.name??'',style: TextStyle(fontSize: 14.w,color: widget.model.seen ==0? Colours.c3:Colours.c9,fontWeight: Fonts.medium,height: 2),),
Gaps.hGaps5,
widget.model.isReading == 1? Container(
height: 17,
width: 17,
alignment: Alignment.center,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8.5.w),
border: Border.all(width:1,color: AppTheme.primary)
),
child: Text('试',style: TextStyle(fontSize: 12.w,color: AppTheme.primary),),
):const SizedBox(),
],
),
Transform.rotate(
angle: widget.model.selected?0:-90 * (3.141592653589793 / 180),
child: GestureDetector(
onTap: (){
setState(() {
widget.model.selected = !widget.model.selected;
});
},
child: SizedBox(
width: 20,
height: 20,
child: Image.asset('assets/images/down.png')
),
)
)
],
)
),
),
/// 节的名称容器
Visibility(
visible: widget.model.selected,
child: ListView.builder(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
itemBuilder: (BuildContext context, int index){
ChapterModel model = widget.model.children![index];
return GestureDetector(
onTap: (){
widget.onTapChapter(model);
},
child: _buildSection(model)
);
},
itemCount: widget.model.children!.length,
)
)
],
);
}
Widget _buildSection(ChapterModel model){
return Container(
color: Colors.white,
padding: const EdgeInsets.only(left: 60),
child: Text(model.name??'',style:TextStyle(fontSize: 12,color: model.seen ==0? Colours.c3:Colours.c9,height: 2),),
);
}
}
part of web; part of web;
class ReadNotePage extends StatefulWidget { class ReadNotePage extends StatefulWidget {
final BookDetailModel bookDetailModel;
// 当前的章节id
final String chapterId;
final void Function()? onTap; final void Function()? onTap;
const ReadNotePage({ const ReadNotePage({
Key? key, Key? key,
required this.onTap, required this.onTap,
required this.bookDetailModel,
required this.chapterId
}) : super(key: key); }) : super(key: key);
@override @override
...@@ -16,7 +21,7 @@ class _ReadNotePageState extends State<ReadNotePage> { ...@@ -16,7 +21,7 @@ class _ReadNotePageState extends State<ReadNotePage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return GetBuilder<NoteController>( return GetBuilder<NoteController>(
init: NoteController(), init: NoteController(bookDetailModel: widget.bookDetailModel,chapterId: widget.chapterId),
builder:(controller) =>Column( builder:(controller) =>Column(
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,
children: [ children: [
...@@ -56,7 +61,7 @@ class _ReadNotePageState extends State<ReadNotePage> { ...@@ -56,7 +61,7 @@ class _ReadNotePageState extends State<ReadNotePage> {
), ),
), ),
), ),
BuildBook(), BuildBook(bookDetailModel: widget.bookDetailModel,),
Expanded( Expanded(
child: ListView.builder( child: ListView.builder(
itemBuilder: (BuildContext context,int index){ itemBuilder: (BuildContext context,int index){
......
...@@ -187,6 +187,7 @@ abstract class Routes { ...@@ -187,6 +187,7 @@ abstract class Routes {
bookId: state.uri.queryParameters['book_id'].toString(), bookId: state.uri.queryParameters['book_id'].toString(),
chapterId: state.uri.queryParameters['chapter_id'].toString(), chapterId: state.uri.queryParameters['chapter_id'].toString(),
chapterName: state.uri.queryParameters['chapter_name'].toString(), chapterName: state.uri.queryParameters['chapter_name'].toString(),
bookDetailModel: state.extra as BookDetailModel,
) )
) )
), ),
......
...@@ -12,7 +12,7 @@ class OssTool { ...@@ -12,7 +12,7 @@ class OssTool {
void initOss(String bucketName) async { void initOss(String bucketName) async {
Client.init(ossEndpoint: 'zijingebook.com', bucketName:bucketName,authGetter: _authGetter); Client.init(ossEndpoint: 'https://oss-cn-beijing.aliyuncs.com', bucketName:bucketName,authGetter: _authGetter);
} }
// 获取临时凭证 // 获取临时凭证
......
...@@ -5,4 +5,31 @@ abstract class Tools { ...@@ -5,4 +5,31 @@ abstract class Tools {
static void unfocus() { static void unfocus() {
WidgetsBinding.instance.focusManager.primaryFocus?.unfocus(); WidgetsBinding.instance.focusManager.primaryFocus?.unfocus();
} }
static String dateFromMS(
int timestamp, {
String pattern = 'yyyy-MM-dd',
bool humanize = false,
}) {
final dateTime = DateTime.fromMillisecondsSinceEpoch(timestamp*1000);
if (humanize) {
final now = DateTime.now();
final difference = now.difference(dateTime);
if (difference.inMinutes < 60) {
if (difference.inMinutes < 1) return '刚刚';
return '${difference.inMinutes}分钟前';
} else if (difference.inHours < 24) {
return '${difference.inHours}小时前';
} else if (difference.inDays < 30) {
return '${difference.inDays}天前';
} else if (now.year == dateTime.year) {
return DateFormat('MM-dd').format(dateTime);
}
}
return DateFormat(pattern).format(dateTime);
}
} }
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论