提交 08fd23b2 authored 作者: 岳维路's avatar 岳维路

合并分支 'test' 到 'sim'

Test 查看合并请求 kiwitap/zijing-app!12
......@@ -156,7 +156,7 @@ abstract class LibraryAPI {
'book_id': bookId,
'chapter_id': chapterId
},
showLoading: true
// showLoading: true
);
if (result.data is! Map && result.data['list'] is! List) return [];
return List.generate(result.data['list'].length, (index) {
......@@ -179,7 +179,7 @@ abstract class LibraryAPI {
'book_id': bookId,
'chapter_id': chapterId
},
showLoading: true,
// showLoading: true,
);
if (result.data is! Map && result.data['list'] is! List) return [];
return List.generate(result.data['list'].length, (index) {
......
......@@ -379,6 +379,7 @@ abstract class MineAPI {
'type': type,
'identifying': identifying,
},
showLoading: true
);
if (result.data is! Map) return PayOrderModel();
return PayOrderModel.fromJson(result.data);
......
......@@ -132,7 +132,8 @@ class ChapterModel {
this.sort,
this.seen,
this.children,
this.selected = false
this.selected = false,
this.currentRead = false
});
ChapterModel.fromJson(dynamic json) {
......@@ -150,6 +151,7 @@ class ChapterModel {
});
}
selected = false;
currentRead = false;
}
num? id;
String? name;
......@@ -159,6 +161,7 @@ class ChapterModel {
num? sort;
num? seen;
late bool selected;
late bool currentRead;
List<ChapterModel>? children;
ChapterModel copyWith({ num? id,
String? name,
......@@ -589,3 +592,12 @@ class SearchAllModel {
}
class PopBackModel {
PopBackModel({
required this.chapterId,
required this.back
});
String chapterId;
bool back;
}
......@@ -17,7 +17,7 @@ class _AnswerPageState extends State<AnswerPage> {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('知识测评'),
title: Text('${widget.params['title']}'),
),
body: InAppWebView(
initialUrlRequest: URLRequest(
......
......@@ -114,6 +114,7 @@ class _BuildItemState extends State<BuildItem> {
onTap: (){
if(chapterModel.children!.isEmpty){
widget.onTap(chapterModel);
chapterModel.currentRead= true;
}
else{
setState(() {
......@@ -134,7 +135,7 @@ class _BuildItemState extends State<BuildItem> {
},
child: Container(
padding: EdgeInsets.symmetric(horizontal: 15.w),
height: 30.w,
height: 40.w,
color: Colors.white,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
......@@ -158,7 +159,7 @@ class _BuildItemState extends State<BuildItem> {
):const SizedBox(),
],
),
Transform.rotate(
chapterModel.children!.isEmpty?const SizedBox(): Transform.rotate(
angle: chapterModel.selected?0:-90 * (3.141592653589793 / 180),
child: GestureDetector(
onTap: (){
......@@ -167,8 +168,8 @@ class _BuildItemState extends State<BuildItem> {
});
},
child: SizedBox(
width: 20.w,
height: 20.w,
width: 12.w,
height: 6.w,
// color: Colors.red,
child: Image.asset('assets/images/down.png')
),
......
......@@ -14,6 +14,8 @@ class BookDetailController extends GetxController with GetSingleTickerProviderSt
const Tab(text: '本书信息',),
];
num currentChapterId = 0;
// 目录
List <ChapterModel> chapters = [];
// 图书
......@@ -48,6 +50,25 @@ class BookDetailController extends GetxController with GetSingleTickerProviderSt
}
}
/// 设置当前读的章节id
void setCurrentReadChapterId(){
for(ChapterModel chapterModel in chapters){
writeCurrentReadChapterIdToData(chapterModel);
}
}
void writeCurrentReadChapterIdToData(ChapterModel chapterModel){
for(ChapterModel cModel in chapterModel.children!){
cModel.currentRead = false;
if(cModel.id == currentChapterId){
cModel.currentRead = true;
cModel.selected = true;
chapterModel.selected = true;
}
writeCurrentReadChapterIdToData(chapterModel);
}
}
/// 写入特定数据
......@@ -68,6 +89,7 @@ class BookDetailController extends GetxController with GetSingleTickerProviderSt
writeData(chapters, result);
chapters = result;
setCurrentReadChapterId();
update();
}
......
......@@ -113,9 +113,11 @@ class _BookDetailPageState extends State<BookDetailPage> with SingleTickerProvid
controller.getBookDetails();
}
}else{
final result = await context.pushNamed(Routes.web,queryParameters: {'book_id': controller.bookDetails.bookId.toString(),'chapter_id': chapterModel.id.toString(),'chapter_name':chapterModel.name.toString(),'note_id':'0'},extra: controller.bookDetails);
if (result == true){
final PopBackModel? backModel = await context.pushNamed(Routes.web,queryParameters: {'book_id': controller.bookDetails.bookId.toString(),'chapter_id': chapterModel.id.toString(),'chapter_name':chapterModel.name.toString(),'note_id':'0'},extra: controller.bookDetails);
if (backModel!.back == true){
controller.getChapters();
// controller.setCurrentReadChapterId(backModel!.chapterId);
controller.currentChapterId = int.parse(backModel!.chapterId);
}
}
},
......@@ -211,9 +213,11 @@ class _BookDetailPageState extends State<BookDetailPage> with SingleTickerProvid
if(controller.bookDetails.isFree == 1){
final String chapterId = await controller.getCurrentChapterId();
final String chapterName = await controller.getCurrentChapterName();
final result = await context.pushNamed(Routes.web,queryParameters: {'book_id': controller.bookDetails.bookId.toString(),'chapter_id': chapterId,'chapter_name':chapterName,'note_id':'0'},extra: controller.bookDetails);
if (result == true){
final PopBackModel? backModel = await context.pushNamed(Routes.web,queryParameters: {'book_id': controller.bookDetails.bookId.toString(),'chapter_id': chapterId,'chapter_name':chapterName,'note_id':'0'},extra: controller.bookDetails);
if (backModel!.back == true){
controller.getChapters();
controller.currentChapterId = int.parse(backModel!.chapterId);
// controller.setCurrentReadChapterId(backModel!.chapterId);
}
}
else {
......@@ -242,9 +246,11 @@ class _BookDetailPageState extends State<BookDetailPage> with SingleTickerProvid
else{
final String chapterId = await controller.getCurrentChapterId();
final String chapterName = await controller.getCurrentChapterName();
final result = await context.pushNamed(Routes.web,queryParameters: {'book_id': controller.bookDetails.bookId.toString(),'chapter_id': chapterId,'chapter_name':chapterName,'note_id':'0'},extra: controller.bookDetails);
if (result == true){
final PopBackModel? backModel = await context.pushNamed(Routes.web,queryParameters: {'book_id': controller.bookDetails.bookId.toString(),'chapter_id': chapterId,'chapter_name':chapterName,'note_id':'0'},extra: controller.bookDetails);
if (backModel!.back == true){
controller.getChapters();
controller.currentChapterId = int.parse(backModel!.chapterId);
// controller.setCurrentReadChapterId(backModel!.chapterId);
}
}
}
......@@ -253,9 +259,11 @@ class _BookDetailPageState extends State<BookDetailPage> with SingleTickerProvid
final String chapterId = await controller.getCurrentChapterId();
final String chapterName = await controller.getCurrentChapterName();
final result = await context.pushNamed(Routes.web,queryParameters: {'book_id': controller.bookDetails.bookId.toString(),'chapter_id': chapterId,'chapter_name':chapterName,'note_id':'0'},extra: controller.bookDetails);
if (result == true){
final PopBackModel? backModel = await context.pushNamed(Routes.web,queryParameters: {'book_id': controller.bookDetails.bookId.toString(),'chapter_id': chapterId,'chapter_name':chapterName,'note_id':'0'},extra: controller.bookDetails);
if (backModel!.back == true){
controller.getChapters();
controller.currentChapterId = int.parse(backModel!.chapterId);
// controller.setCurrentReadChapterId(backModel!.chapterId);
}
}
......
......@@ -27,7 +27,7 @@ class BuildItem extends StatelessWidget {
child: Text(
model.helpTitle ?? '',
style: TextStyle(
fontSize: 12.w, height: 1.5.w, color: Colours.c9),
fontSize: 12.w, height: 1.5.w, color: Colours.c3),
),
),
],
......
......@@ -3,6 +3,7 @@ library image_view;
import 'package:extended_image/extended_image.dart';
import 'package:flutter/material.dart';
import 'package:flutter_book/utils/index.dart';
import 'package:go_router/go_router.dart';
......
......@@ -2,9 +2,11 @@ part of image_view;
class ImageViewPage extends StatefulWidget {
final List<String>images;
final int currentIndex;
const ImageViewPage({
Key? key,
required this.images
required this.images,
required this.currentIndex
}) : super(key: key);
@override
......@@ -36,15 +38,16 @@ class _ImageViewPageState extends State<ImageViewPage> {
color: Colors.black,
child: ExtendedImageGesturePageView.builder(
controller: ExtendedPageController(
initialPage: 0,
initialPage: widget.currentIndex,
pageSpacing: 50,
),
onPageChanged: (int page) {
// _preloadImage(page - 1);
// _preloadImage(page + 1);
_preloadImage(page - 1);
_preloadImage(page + 1);
},
itemCount: widget.images.length,
itemBuilder: (BuildContext context, int index) {
Console.log('-index---------------------------$index----');
return GestureDetector(
onTap: (){
context.pop();
......
......@@ -121,12 +121,18 @@ class LibraryController extends GetxController with GetTickerProviderStateMixin{
for(FilterModel model in filterCategories){
model.selected = false;
}
filterCategories.first.selected = true;
if(filterCategories.isNotEmpty){
selectedCategory = filterCategories.first;
selectedCategory.selected = true;
}
for(FilterModel model in filterLabels){
model.selected = false;
}
filterLabels.first.selected = true;
if(filterLabels.isNotEmpty){
selectedLabel = filterLabels.first;
selectedLabel.selected = true;
}
for(FilterModel model in filterFree){
model.selected = false;
......@@ -135,8 +141,9 @@ class LibraryController extends GetxController with GetTickerProviderStateMixin{
for(FilterModel model in filterDown){
model.selected = false;
}
update();
// onRefresh();
update();
}
/// 确定
......@@ -202,10 +209,14 @@ class LibraryController extends GetxController with GetTickerProviderStateMixin{
categories = await LibraryAPI.categories();
tabController.dispose();
tabController = TabController(length:categories.length, vsync: this);
categories.first.selected = true;
filterCategories = categories.map((model) {
return FilterModel(id: model.categoryId.toString(), name: model.name??'',selected: model.selected);
}).toList();
if(filterCategories.isNotEmpty){
selectedCategory = filterCategories.first;
selectedCategory.selected = true;
}
update();
}
......@@ -216,8 +227,10 @@ class LibraryController extends GetxController with GetTickerProviderStateMixin{
filterLabels = labels.map((model) {
return FilterModel(id: model.labelId.toString(), name: model.name??'',selected: model.selected);
}).toList();
selectedLabel = filterLabels.first;
selectedLabel.selected = true;
if (filterLabels.isNotEmpty){
selectedLabel = filterLabels.first;
selectedLabel.selected = true;
}
update(['label']);
......
......@@ -41,8 +41,8 @@ class _LibraryPageState extends State<LibraryPage> {
Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Expanded(child: _buildCategory()),
GestureDetector(
controller.filterCategories.isEmpty?const SizedBox():Expanded(child: _buildCategory()),
controller.filterCategories.isEmpty?const SizedBox():GestureDetector(
onTap: (){
controller.setShow(controller.show);
},
......@@ -115,7 +115,8 @@ class _LibraryPageState extends State<LibraryPage> {
controller.sureFilter();
},
resetTap: (){
// controller.setShow(controller.show);
controller.resetFilter();
},),
),
],
......
......@@ -26,30 +26,37 @@ class _FilterPageState extends State<FilterPage> {
// return FilterModel(id: model.labelId.toString(), name: model.name??'');
// }).toList();
return Container(
color: const Color(0xFF000000).withOpacity(0.5),
child: SingleChildScrollView(
return GestureDetector(
onTap: (){
widget.controller.setShow(widget.controller.show);
},
child: Container(
color: const Color(0xFF000000).withOpacity(0.5),
child: Column(
children: [
Container(
color: Colors.white,
width: double.infinity,
padding: EdgeInsets.only(bottom: 10.w),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_buildWrapWidget('分类', widget.controller.filterCategories),
_buildWrapWidget('标签', widget.controller.filterLabels),
_buildWrapWidget('是否收费', widget.controller.filterFree),
_buildWrapWidget('排序', widget.controller.filterDown),
],
)
],
),
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: (){},
child: Container(
color: Colors.white,
width: double.infinity,
padding: EdgeInsets.only(bottom: 10.w),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
widget.controller.filterCategories.isEmpty?const SizedBox():_buildWrapWidget('分类', widget.controller.filterCategories),
widget.controller.filterLabels.isEmpty?const SizedBox():_buildWrapWidget('标签', widget.controller.filterLabels),
_buildWrapWidget('是否收费', widget.controller.filterFree),
_buildWrapWidget('排序', widget.controller.filterDown),
],
)
],
),
),
),
Container(
padding: EdgeInsets.only(left:10.w,right:10.w,top:30.w,bottom:10.w),
......@@ -60,9 +67,7 @@ class _FilterPageState extends State<FilterPage> {
children: [
Expanded(
child: GestureDetector(
onTap: (){
widget.controller.resetFilter();
},
onTap: widget.resetTap,
child: Container(
alignment: Alignment.center,
height: 35.w,
......@@ -109,7 +114,7 @@ class _FilterPageState extends State<FilterPage> {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
margin: EdgeInsets.only(left: 10.w,bottom: 10.w,top: 10.w),
margin: EdgeInsets.only(left: 10.w,bottom: 15.w,top: 15.w),
child: Text(title,style: TextStyle(fontSize: 15.w,height:1.6,color: Colours.c3,fontWeight: Fonts.boldSemi),)
),
Container(
......
......@@ -47,78 +47,91 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver{
),
bottomNavigationBar: GetBuilder<MainController>(
id: 'navigation',
builder: (controller) => BottomNavigationBar(
currentIndex:controller.currentPage ,
onTap: (page){
if (page != 1 && !UserStore.to.isLogin) {
context.pushNamed(Routes.login);
} else {
controller.pageController.jumpToPage(page);
}
// controller.pageController.jumpToPage(page);
},
items: [
BottomNavigationBarItem(
builder: (controller) => Container(
decoration: BoxDecoration(
color: Colors.white,
boxShadow:[
BoxShadow(
color: const Color(0xFFE0E0E0).withOpacity(0.5),
spreadRadius: 0,
blurRadius: 4.5,
offset: const Offset(0, 0),
),
],
),
child: BottomNavigationBar(
currentIndex:controller.currentPage ,
onTap: (page){
if (page != 1 && !UserStore.to.isLogin) {
context.pushNamed(Routes.login);
} else {
controller.pageController.jumpToPage(page);
}
// controller.pageController.jumpToPage(page);
},
items: [
BottomNavigationBarItem(
icon: Image.asset(
'assets/images/course.png',
width: 25,
height: 27.5,
fit: BoxFit.cover,
),
activeIcon:Image.asset(
'assets/images/course_select.png',
width: 25,
height: 27.5,
fit: BoxFit.cover,
),
label: '课程',
),
BottomNavigationBarItem(
icon: Image.asset(
'assets/images/course.png',
'assets/images/library.png',
width: 25,
height: 27.5,
fit: BoxFit.cover,
),
activeIcon:Image.asset(
'assets/images/course_select.png',
'assets/images/library_select.png',
width: 25,
height: 27.5,
fit: BoxFit.cover,
),
label: '课程',
),
BottomNavigationBarItem(
icon: Image.asset(
'assets/images/library.png',
width: 25,
height: 27.5,
fit: BoxFit.cover,
),
activeIcon:Image.asset(
'assets/images/library_select.png',
width: 25,
height: 27.5,
fit: BoxFit.cover,
),
label: '图书馆',
),
BottomNavigationBarItem(
icon: Image.asset(
'assets/images/shujia.png',
width: 25,
height: 27.5,
fit: BoxFit.cover,
),
activeIcon:Image.asset(
'assets/images/shujia_select.png',
width: 25,
height: 27.5,
fit: BoxFit.cover,
label: '图书馆',
),
label: '书架',
),
BottomNavigationBarItem(
icon: Image.asset(
'assets/images/mine.png',
width: 25,
height: 27.5,
fit: BoxFit.cover,
),
activeIcon:Image.asset(
'assets/images/mine_select.png',
width: 25,
height: 27.5,
fit: BoxFit.cover,
BottomNavigationBarItem(
icon: Image.asset(
'assets/images/shujia.png',
width: 25,
height: 27.5,
fit: BoxFit.cover,
),
activeIcon:Image.asset(
'assets/images/shujia_select.png',
width: 25,
height: 27.5,
fit: BoxFit.cover,
),
label: '书架',
),
label: '我的',
)
]
BottomNavigationBarItem(
icon: Image.asset(
'assets/images/mine.png',
width: 25,
height: 27.5,
fit: BoxFit.cover,
),
activeIcon:Image.asset(
'assets/images/mine_select.png',
width: 25,
height: 27.5,
fit: BoxFit.cover,
),
label: '我的',
)
]
),
),
),
)
......
library read_info;
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:go_router/go_router.dart';
import '../../utils/index.dart';
part 'view.dart';
\ No newline at end of file
part of read_info;
class ReadInfoPage extends StatefulWidget {
final Map<String,String> params;
const ReadInfoPage({
Key? key,
required this.params
}) : super(key: key);
@override
State<ReadInfoPage> createState() => _ReadInfoPageState();
}
class _ReadInfoPageState extends State<ReadInfoPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('${widget.params['title']}'),
),
body: InAppWebView(
initialUrlRequest: URLRequest(
url: WebUri.uri(Uri.parse(kReadInfo))
),
onLoadStop: (controller, url) {
String jsonStr = jsonEncode(widget.params);
controller.evaluateJavascript(source: 'callbackInFlutterComponent($jsonStr)');
},
onConsoleMessage: (controller, consoleMessage) {
// 接收从 WebView 发送的消息
Console.log("画廊扩展阅读-------Received message from WebView-----------------------------: ${consoleMessage.message}");
},
)
);
}
}
......@@ -96,7 +96,8 @@ class ReadController extends FullLifeCycleController with GetSingleTickerProvide
initTts();
netStatus = await Tools.checkCurrentNetStatus();
discussTitleFocusNode.addListener(_onCommentFocusChanged);
await ScreenProtector.preventScreenshotOn();
// 开启防截屏
// await ScreenProtector.preventScreenshotOn();
super.onInit();
}
......@@ -135,7 +136,8 @@ class ReadController extends FullLifeCycleController with GetSingleTickerProvide
contentInput.dispose();
flutterTts.stop();
searchInput.dispose();
await ScreenProtector.preventScreenshotOff();
// 关闭防截屏
// await ScreenProtector.preventScreenshotOff();
super.onClose();
}
///------------------------------------------ 页面 生命周期--------------------------------------------------------
......@@ -167,6 +169,9 @@ class ReadController extends FullLifeCycleController with GetSingleTickerProvide
}
void setShowSearch(bool show){
if(show == false){
searchInput.text = '';
}
showSearch = show;
update();
}
......
......@@ -62,6 +62,9 @@ class DiscussController extends GetxController {
}
void setShowSearch(bool show){
if(show == false){
searchInput.text = '';
}
showSearch = show;
update();
}
......
......@@ -46,6 +46,9 @@ class NoteController extends GetxController {
}
void setShowSearch(bool show){
if(show == false){
searchInput.text = '';
}
showSearch = show;
update();
}
......
......@@ -27,9 +27,10 @@ class _ReadPageState extends State<ReadPage> {
}
@override
Widget build(BuildContext context) {
PopBackModel backModel = PopBackModel(chapterId: widget.chapterId,back: true);
return WillPopScope(
onWillPop: () async {
context.pop(true);
context.pop(backModel);
CustomToast.dismiss();
return false;
},
......@@ -168,7 +169,10 @@ class _ReadPageState extends State<ReadPage> {
String chapterId = args.first[0].toString();
String position = args.first[1].toString();
// 0:未答题 1:答题结果
String type = args.first[2].toString();
// 测评标题
String title = args.first[3].toString();
String url = '';
// 未答题
if(type == '0'){
......@@ -182,7 +186,8 @@ class _ReadPageState extends State<ReadPage> {
'position':position,
'url':url,
'book_id':readController.bookId,
'token':UserStore.to.token
'token':UserStore.to.token,
'title':title
};
Console.log('监听答题回调---------------给页面传参---------------------------------$params');
context.pushNamed(Routes.answer,queryParameters: params);
......@@ -210,6 +215,24 @@ class _ReadPageState extends State<ReadPage> {
context.pushNamed(Routes.link,queryParameters: {'url': args.first.toString()});
});
// 画廊 扩展于都
controller.addJavaScriptHandler(handlerName: 'readInfoCallback', callback: (args){
String position = args.first[0].toString();
String type = args.first[1].toString();
String title = args.first[2].toString();
Map<String,String> params = {
'chapter_id':readController.chapterId,
'position':position,
'book_id':readController.bookId,
'token':UserStore.to.token,
'title':title,
'base_url':kServerUrl,
'type':type
};
Console.log('监听画廊 扩展于都---------------给页面传参---------------------------------$params');
context.pushNamed(Routes.readInfo,queryParameters: params);
});
/// 离线需要参数
// //
......@@ -403,6 +426,10 @@ class _ReadPageState extends State<ReadPage> {
controller.selectChapter(ChapterModel(id: sModel.chapterId,name: sModel.chapterName));
controller.webViewController.reload();
},
// 删除笔记后 重新刷新web页
delTapCallBack: (){
controller.webViewController.reload();
},
bookDetailModel: controller.bookDetailModel,
chapterId: controller.chapterId,
);
......
......@@ -87,14 +87,19 @@ class _ReadCategoryPageState extends State<ReadCategoryPage> {
],
),
widget.controller.showSearch? Expanded(
child: BuildSearchAll(
onTap: (SearchAllModel sModel){
if (widget.onTapSearchItem !=null) {
widget.onTapSearchItem!(sModel);
}
},
searchALlResults: widget.controller.searchALlResults
,)):
child: CustomPullScrollView(
controller: widget.controller.refreshController,
onRefresh: widget.controller.onRefreshSearch,
onLoading: widget.controller.onLoadingSearch,
child: BuildSearchAll(
onTap: (SearchAllModel sModel){
if (widget.onTapSearchItem !=null) {
widget.onTapSearchItem!(sModel);
}
},
searchALlResults: widget.controller.searchALlResults
,),
)):
widget.controller.showSearch?const SizedBox():BuildBook(bookDetailModel: widget.controller.bookDetailModel,),
widget.controller.showSearch?const SizedBox():Expanded(
child: ListView.builder(
......
......@@ -88,31 +88,41 @@ class _ReadDiscussPageState extends State<ReadDiscussPage> {
],
),
controller.showSearch? Expanded(
child: BuildSearchAll(
onTap: (SearchAllModel sModel){
if (widget.onTapSearchItem !=null) {
widget.onTapSearchItem!(sModel);
}
},
searchALlResults: controller.searchALlResults,
child: CustomPullScrollView(
controller: controller.refreshController,
onRefresh: controller.onRefreshSearch,
onLoading: controller.onLoadingSearch,
child: BuildSearchAll(
onTap: (SearchAllModel sModel){
if (widget.onTapSearchItem !=null) {
widget.onTapSearchItem!(sModel);
}
},
searchALlResults: controller.searchALlResults,
),
)):
controller.showSearch?const SizedBox():BuildBook(bookDetailModel: widget.bookDetailModel,),
controller.showSearch?const SizedBox():Expanded(
child: Stack(
children: [
ListView.builder(
itemBuilder: (BuildContext context,int index){
DiscussModel model = controller.discuss[index];
return BuildDiscuss(
model: model,
controller: controller,
bookId: widget.bookDetailModel.bookId.toString(),
onTapDel: (DiscussModel dModel){
controller.delComment(discussModel: dModel);
},
);
},
itemCount: controller.discuss.length,
CustomPullScrollView(
controller: controller.refreshController,
onRefresh: controller.onRefresh,
onLoading: controller.onLoading,
child: ListView.builder(
itemBuilder: (BuildContext context,int index){
DiscussModel model = controller.discuss[index];
return BuildDiscuss(
model: model,
controller: controller,
bookId: widget.bookDetailModel.bookId.toString(),
onTapDel: (DiscussModel dModel){
controller.delComment(discussModel: dModel);
},
);
},
itemCount: controller.discuss.length,
),
),
Visibility(
visible: controller.showReply,
......
......@@ -121,7 +121,7 @@ class _BuildItemState extends State<BuildItem> {
},
child: Container(
padding: EdgeInsets.symmetric(horizontal: 15.w),
height: 30.w,
height: 40.w,
color: Colors.white,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
......@@ -154,8 +154,8 @@ class _BuildItemState extends State<BuildItem> {
});
},
child: Container(
width: 20.w,
height: 20.w,
width: 12.w,
height: 6.w,
// color: Colors.red,
child: Image.asset('assets/images/down.png')
),
......
......@@ -7,12 +7,14 @@ class ReadNotePage extends StatefulWidget {
// 当前的章节id
final String chapterId;
final void Function()? onTap;
final void Function() delTapCallBack;
const ReadNotePage({
Key? key,
required this.onTap,
required this.bookDetailModel,
required this.chapterId,
this.onTapSearchItem
this.onTapSearchItem,
required this.delTapCallBack
}) : super(key: key);
@override
......@@ -85,57 +87,70 @@ class _ReadNotePageState extends State<ReadNotePage> {
):const SizedBox(),
],
),
controller.showSearch? Expanded(child: BuildSearchAll(
onTap: (SearchAllModel sModel){
if (widget.onTapSearchItem !=null) {
widget.onTapSearchItem!(sModel);
}
},
searchALlResults: controller.searchALlResults
)):
controller.showSearch? Expanded(
child: CustomPullScrollView(
controller: controller.refreshController,
onRefresh: controller.onRefreshSearch,
onLoading: controller.onLoadingSearch,
child: BuildSearchAll(
onTap: (SearchAllModel sModel){
if (widget.onTapSearchItem !=null) {
widget.onTapSearchItem!(sModel);
}
},
searchALlResults: controller.searchALlResults
),
)):
controller.showSearch?const SizedBox():BuildBook(bookDetailModel: widget.bookDetailModel,),
controller.showSearch?const SizedBox():Expanded(
child: MediaQuery.removePadding(
context: context,
removeTop: true,
child:ListView.builder(
itemBuilder: (BuildContext context,int index){
NoteModel model = controller.notes[index];
// 划线
if(model.types == 1){
return BuildLine(
model: model,
onTapDel: (){
controller.delNotes(noteModel: model, bookId:widget.bookDetailModel.bookId.toString());
},
);
}
// 高亮
else if(model.types == 2){
return BuildHigh(
model: model,
onTapDel: (){
controller.delNotes(noteModel: model, bookId:widget.bookDetailModel.bookId.toString());
},
);
}
// 笔记
else if(model.types == 3){
return BuildNote(
model: model,
onTapAudio: (MediaModel mediaModel){
controller.playAudio(mediaModel);
},
onTapDel: (){
controller.delNotes(noteModel: model, bookId:widget.bookDetailModel.bookId.toString());
},
onTapEdit: (){
context.pushNamed(Routes.editNote,extra: model,queryParameters: {'book_id':widget.bookDetailModel.bookId});
},
);
}
},
itemCount: controller.notes.length,
child:CustomPullScrollView(
controller: controller.refreshController,
onRefresh: controller.onRefresh,
onLoading: controller.onLoading,
child: ListView.builder(
itemBuilder: (BuildContext context,int index){
NoteModel model = controller.notes[index];
// 划线
if(model.types == 1){
return BuildLine(
model: model,
onTapDel: (){
controller.delNotes(noteModel: model, bookId:widget.bookDetailModel.bookId.toString());
widget.delTapCallBack();
},
);
}
// 高亮
else if(model.types == 2){
return BuildHigh(
model: model,
onTapDel: (){
controller.delNotes(noteModel: model, bookId:widget.bookDetailModel.bookId.toString());
widget.delTapCallBack();
},
);
}
// 笔记
else if(model.types == 3){
return BuildNote(
model: model,
onTapAudio: (MediaModel mediaModel){
controller.playAudio(mediaModel);
},
onTapDel: (){
controller.delNotes(noteModel: model, bookId:widget.bookDetailModel.bookId.toString());
},
onTapEdit: (){
context.pushNamed(Routes.editNote,extra: model,queryParameters: {'book_id':widget.bookDetailModel.bookId});
},
);
}
},
itemCount: controller.notes.length,
),
),
),
),
......
......@@ -26,25 +26,28 @@ class _BuildSearchAllState extends State<BuildSearchAll> {
widget.onTap!(model);
}
},
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
color: Colors.white,
margin: EdgeInsets.only(left: 15.w,top: 8.w),
// height: 110,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(model.chapterName??'',style: TextStyle(fontSize: 11.w,height: 2,color: Colours.c9,fontWeight: Fonts.medium),),
Gaps.vGaps5,
ColoredText(text: model.combinedContent??'', coloredSubstring: model.key??'', coloredTextStyle: TextStyle(fontSize: 13.w,height: 2,color: AppTheme.primary),),
],
child: Container(
color: Colors.white,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
color: Colors.white,
margin: EdgeInsets.only(left: 15.w,top: 8.w),
// height: 110,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(model.chapterName??'',style: TextStyle(fontSize: 11.w,height: 2,color: Colours.c9,fontWeight: Fonts.medium),),
Gaps.vGaps5,
ColoredText(text: model.combinedContent??'', coloredSubstring: model.key??'', coloredTextStyle: TextStyle(fontSize: 13.w,height: 2,color: AppTheme.primary),),
],
),
),
),
Gaps.vGaps10,
Container(height: 0.5.w,color: Colours.cF2,)
],
Gaps.vGaps10,
Container(height: 0.5.w,color: Colours.cF2,)
],
),
)
);
},
......
......@@ -79,7 +79,7 @@ class _BuildHistoryState extends State<BuildHistory> {
),
child: Padding(
padding: const EdgeInsets.symmetric(horizontal:15,vertical: 3),
child: Text(e,style: const TextStyle(fontSize: 13,height: 1.4,color: Colours.c3),textAlign: TextAlign.center,),
child: Text(e,style: const TextStyle(fontSize: 13,height: 1.5,color: Colours.c3),textAlign: TextAlign.center,),
),
),
);
......
......@@ -82,10 +82,11 @@ class BuildDayItem extends StatelessWidget {
Expanded(
child: Container(
// color: Colors.green,
height: 86.w,
padding: EdgeInsets.only(top: 2.5.w,left: 13.w),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
......@@ -95,7 +96,7 @@ class BuildDayItem extends StatelessWidget {
Text(courseModel.authors??'',style: TextStyle(fontSize: 12.w,height: 1.4,color: Colours.c6),),
],
),
Gaps.vGaps25,
// Gaps.vGaps25,
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
......@@ -105,7 +106,11 @@ class BuildDayItem extends StatelessWidget {
child: Text(courseModel.typeName,style: TextStyle(fontSize: 11.w,height: 1.3,color:AppTheme.primary),),
),
// Spacer(),
Text('上次读到:${courseModel.lastChapter}',style: TextStyle(fontSize: 11.w,height: 1.3,color: Colours.c6),)
Container(
width: 120,
alignment: Alignment.centerLeft,
child: Text('上次读到:${courseModel.lastChapter}',style: TextStyle(fontSize: 11.w,height: 1.3,color: Colours.c6),maxLines: 1,overflow: TextOverflow.ellipsis,),
)
],
)
],
......
......@@ -167,7 +167,7 @@ class _StudyReportPageState extends State<StudyReportPage> {
children: [
RichText(text: TextSpan(
children: [
TextSpan(text: '总回顾',style: TextStyle(fontSize: 14.w,height: 1.5,color: Colours.c9),),
TextSpan(text: '测评总数',style: TextStyle(fontSize: 14.w,height: 1.5,color: Colours.c9),),
WidgetSpan(child: SizedBox(width: 36.w),),
TextSpan(text:controller.model.questionAllNums !=null? controller.model.questionAllNums.toString():'' ,style: TextStyle(fontSize: 21.w,height: 1.5,color: Colours.c3,fontWeight: Fonts.medium)),
TextSpan(text: '/条',style: TextStyle(fontSize: 13.w,height: 1.5,color: Colours.c3)),
......
......@@ -24,44 +24,50 @@ class BuildCard extends StatelessWidget {
right: 0,
child: Container(
padding: EdgeInsets.only(left: 17.5.w,top:25.w,right: 20.w,bottom: 20.w),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.end,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(model.bookName??'',style: TextStyle(fontSize: 18.w,height: 1.4,color: Colors.white,fontWeight: Fonts.boldSemi),),
Gaps.vGaps15,
Row(
Text(model.bookName??'',style: TextStyle(fontSize: 18.w,height: 1.4,color: Colors.white,fontWeight: Fonts.boldSemi),),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Expanded(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('学习总进度',style: TextStyle(fontSize: 15.w,height: 1.4,color: Colors.white),),
Gaps.hGaps15,
Text(model.progress??'',style: TextStyle(fontSize: 16.w,height: 1.4,color: Colors.white,fontWeight: Fonts.boldSemi),),
// Text(model.bookName??'',style: TextStyle(fontSize: 18.w,height: 1.4,color: Colors.white,fontWeight: Fonts.boldSemi),),
Gaps.vGaps15,
Row(
children: [
Text('学习总进度',style: TextStyle(fontSize: 15.w,height: 1.4,color: Colors.white),),
Gaps.hGaps15,
Text(model.progress??'',style: TextStyle(fontSize: 16.w,height: 1.4,color: Colors.white,fontWeight: Fonts.boldSemi),),
]
),
Gaps.vGaps10,
Row(
children: [
Text('学习总时长',style: TextStyle(fontSize: 15.w,height: 1.4,color: Colors.white),),
Gaps.hGaps15,
Text('${model.readSecond??''}分钟',style: TextStyle(fontSize: 16.w,height: 1.4,color: Colors.white,fontWeight: Fonts.boldSemi),),
]
),
Gaps.vGaps10,
Text('上次读到',style: TextStyle(fontSize: 15.w,height: 1.4,color: Colors.white),),
Gaps.vGaps5,
Text(model.lastChapter??'',style: TextStyle(fontSize: 16.w,height: 1.4,color: Colors.white,fontWeight: Fonts.boldSemi),maxLines: 1,overflow: TextOverflow.ellipsis,),
]
),
Gaps.vGaps10,
Row(
children: [
Text('学习总时长',style: TextStyle(fontSize: 15.w,height: 1.4,color: Colors.white),),
Gaps.hGaps15,
Text('${model.readSecond??''}分钟',style: TextStyle(fontSize: 16.w,height: 1.4,color: Colors.white,fontWeight: Fonts.boldSemi),),
]
),
Gaps.vGaps10,
Text('上次读到',style: TextStyle(fontSize: 15.w,height: 1.4,color: Colors.white),),
Gaps.vGaps5,
Text(model.lastChapter??'',style: TextStyle(fontSize: 16.w,height: 1.4,color: Colors.white,fontWeight: Fonts.boldSemi),maxLines: 1,overflow: TextOverflow.ellipsis,),
]
),
),
CustomCard(
url: model.img ?? '',
height: 120.w,
width: 100.w,
)
],
),
Container(
height: 120.w,
width: 100.w,
child: CustomImage.network(url: model.img??''),
)
],
),
)
......
......@@ -165,7 +165,7 @@ class BuildNote extends StatelessWidget {
List<String>images = model.noteContent?.image?.map((MediaModel model) => model.content??'').toList()??[];
return GestureDetector(
onTap: (){
context.pushNamed(Routes.imageView,extra:images);
context.pushNamed(Routes.imageView,extra:images,queryParameters: {'index': index.toString()});
},
child: Stack(
children: [
......
......@@ -18,6 +18,7 @@ import 'package:flutter_book/pages/help_cneter_content/index.dart';
import 'package:flutter_book/pages/link/index.dart';
import 'package:flutter_book/pages/login/index.dart';
import 'package:flutter_book/pages/main/index.dart';
import 'package:flutter_book/pages/read_info/index.dart';
import 'package:flutter_book/pages/reset_pwd/index.dart';
import 'package:flutter_book/pages/search/index.dart';
import 'package:flutter_book/pages/splash/index.dart';
......
......@@ -12,7 +12,7 @@ abstract class Routes {
static const web = 'read_web';
static const answer = 'answer';
static const readInfo = 'read_info';
// 支付界面
static const bookPay = 'book_pay';
......@@ -703,7 +703,18 @@ abstract class Routes {
)
)
),
GoRoute( // 知识测评
GoRoute( // 画廊 扩展阅读
path: '/$readInfo',
name: readInfo,
pageBuilder: (context, state) =>CupertinoPage(
name: state.uri.toString(),
key: state.pageKey,
child: ReadInfoPage(
params: state.uri.queryParameters,
)
)
),
GoRoute( // 图片预览
path: '/$imageView',
name: imageView,
pageBuilder: (context, state) =>BottomToTopTransitionPage(
......@@ -711,6 +722,7 @@ abstract class Routes {
key: state.pageKey,
child: ImageViewPage(
images: state.extra as List<String>,
currentIndex: int.parse(state.uri.queryParameters['index'].toString()),
)
)
......
......@@ -99,6 +99,7 @@ class HttpService extends GetxService {
try {
final requestOptions = options ?? Options();
requestOptions.headers = _getHeaders(excludeToken: excludeToken,params: params,url: url);
Console.log('----headers------${requestOptions.headers}\n----params------$params-----');
// 如果启用缓存,将cacheEnabled参数添加到请求选项中
if(cacheEnabled){
requestOptions.extra ??= {};
......@@ -111,7 +112,6 @@ class HttpService extends GetxService {
cancelToken: cancelToken,
);
if (showLoading) CustomToast.dismiss();
Console.log('----headers------${requestOptions.headers}\n----params------$params-----');
Console.log(response.data);
return ResponseModel.fromJson(response.data);
} catch (error){
......@@ -245,7 +245,8 @@ class _RequestInterceptor extends Interceptor {
Console.log('----------403---------access_token-------------------------${UserStore.to.accessToken}--------------------');
msg = '$statusCode - Unauthorized';
final newToken = await refreshToken();
if (newToken != null) {
Console.log('newToken----------$newToken');
if (newToken != null && newToken.isNotEmpty) {
final RequestOptions requestOptions = err.requestOptions;
final headers = requestOptions.headers;
headers['Authorization'] = newToken;
......
......@@ -25,9 +25,9 @@ const String kReadBook = '$kServerUrl/html/app/read.html';
// 答题页
const String kAnswer = '$kServerUrl/html/app/evaluating.html';
// 答题结果页
const String kAnswerResult = '$kServerUrl/html/app/evaluating_result.html';
const String kAnswerResult = 'http://150.158.138.40:9200/evaluating_result.html';
// 画廊 扩展阅读
const String kReadInfo = 'http://150.158.138.40:9200/read_info.html';
......
......@@ -378,8 +378,8 @@ class CustomInputSearch extends StatelessWidget {
onTap: onTap,
style: TextStyle(
// fontFamily: 'Sans',
fontSize: 16.w,
height: 1.2,
fontSize: 12.w,
height: 1.5,
),
decoration: InputDecoration(
border: OutlineInputBorder(
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论