提交 09c92a44 authored 作者: 岳维路's avatar 岳维路

合并分支 'test' 到 'sim'

Test 查看合并请求 kiwitap/zijing-app!18
...@@ -108,13 +108,7 @@ class _BookDetailPageState extends State<BookDetailPage> with SingleTickerProvid ...@@ -108,13 +108,7 @@ class _BookDetailPageState extends State<BookDetailPage> with SingleTickerProvid
}); });
}else{ }else{
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); pushToReadPage(controller: controller, chapterName: chapterModel.name.toString(), chapterId: chapterModel.id.toString());
if (backModel!.back == true){
controller.getChapters();
// controller.setCurrentReadChapterId(backModel!.chapterId);
controller.currentChapterId = int.parse(backModel!.chapterId);
controller.getBookDetails();
}
} }
}, },
), ),
...@@ -209,13 +203,7 @@ class _BookDetailPageState extends State<BookDetailPage> with SingleTickerProvid ...@@ -209,13 +203,7 @@ class _BookDetailPageState extends State<BookDetailPage> with SingleTickerProvid
if(controller.bookDetails.isFree == 1){ if(controller.bookDetails.isFree == 1){
final String chapterId = await controller.getCurrentChapterId(); final String chapterId = await controller.getCurrentChapterId();
final String chapterName = await controller.getCurrentChapterName(); final String chapterName = await controller.getCurrentChapterName();
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); pushToReadPage(controller: controller, chapterName: chapterName, chapterId: chapterId);
if (backModel!.back == true){
controller.getChapters();
controller.currentChapterId = int.parse(backModel!.chapterId);
controller.getBookDetails();
// controller.setCurrentReadChapterId(backModel!.chapterId);
}
} }
else { else {
// 没有购买 // 没有购买
...@@ -243,27 +231,14 @@ class _BookDetailPageState extends State<BookDetailPage> with SingleTickerProvid ...@@ -243,27 +231,14 @@ class _BookDetailPageState extends State<BookDetailPage> with SingleTickerProvid
else{ else{
final String chapterId = await controller.getCurrentChapterId(); final String chapterId = await controller.getCurrentChapterId();
final String chapterName = await controller.getCurrentChapterName(); final String chapterName = await controller.getCurrentChapterName();
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); pushToReadPage(controller: controller, chapterName: chapterName, chapterId: chapterId);
if (backModel!.back == true){
controller.getChapters();
controller.getBookDetails();
controller.currentChapterId = int.parse(backModel!.chapterId);
// controller.setCurrentReadChapterId(backModel!.chapterId);
}
} }
} }
else{ else{
final String chapterId = await controller.getCurrentChapterId(); final String chapterId = await controller.getCurrentChapterId();
final String chapterName = await controller.getCurrentChapterName(); final String chapterName = await controller.getCurrentChapterName();
pushToReadPage(controller: controller, chapterName: chapterName, chapterId: chapterId);
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.getBookDetails();
// controller.setCurrentReadChapterId(backModel!.chapterId);
}
} }
} }
...@@ -289,5 +264,18 @@ class _BookDetailPageState extends State<BookDetailPage> with SingleTickerProvid ...@@ -289,5 +264,18 @@ class _BookDetailPageState extends State<BookDetailPage> with SingleTickerProvid
} }
void pushToReadPage({
required BookDetailController controller,
required String chapterName,
required String chapterId,
}) async{
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.getBookDetails();
// controller.setCurrentReadChapterId(backModel!.chapterId);
}
}
} }
...@@ -108,14 +108,19 @@ class BookInfoPage extends StatelessWidget { ...@@ -108,14 +108,19 @@ class BookInfoPage extends StatelessWidget {
{'name':'上架时间','value':Tools.dateFromMS(model.onsaleTime!.toInt(),pattern:'yyyy年MM月dd日' )}, {'name':'上架时间','value':Tools.dateFromMS(model.onsaleTime!.toInt(),pattern:'yyyy年MM月dd日' )},
].map((item){ ].map((item){
return Row( return Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Row(
children: [ children: [
Container( Container(
// color: Colors.cyan, // color: Colors.cyan,
alignment: Alignment.centerRight, alignment: Alignment.centerRight,
width: 60.w, width: 80.w,
child: Text(item['name'].toString(),style: const TextStyle(fontSize: 15,height: 2.1,color: Colours.c3),), child: Text(item['name'].toString(),style: const TextStyle(fontSize: 15,height: 2.1,color: Colours.c3),),
), ),
Gaps.hGaps20, Gaps.hGaps20,
],
),
Expanded( Expanded(
child: Container( child: Container(
// color: Colors.red, // color: Colors.red,
......
...@@ -2,6 +2,8 @@ part of library; ...@@ -2,6 +2,8 @@ part of library;
class LibraryController extends GetxController with GetTickerProviderStateMixin{ class LibraryController extends GetxController with GetTickerProviderStateMixin{
final BuildContext context;
LibraryController(this.context);
// 分类数据 // 分类数据
List<CategoryModel> categories = []; List<CategoryModel> categories = [];
// 标签数据 // 标签数据
...@@ -49,6 +51,8 @@ class LibraryController extends GetxController with GetTickerProviderStateMixin{ ...@@ -49,6 +51,8 @@ class LibraryController extends GetxController with GetTickerProviderStateMixin{
late AnimationController _controller; late AnimationController _controller;
bool _show = false; bool _show = false;
late UModel _getModel;
bool get show => _show; bool get show => _show;
void setShow(bool value) { void setShow(bool value) {
_show = !value; _show = !value;
...@@ -85,21 +89,13 @@ class LibraryController extends GetxController with GetTickerProviderStateMixin{ ...@@ -85,21 +89,13 @@ class LibraryController extends GetxController with GetTickerProviderStateMixin{
_getTabs(); _getTabs();
// 获取广告数据 // 获取广告数据
_getAds(); _getAds();
// 检测版本
// if(Platform.isAndroid){
// _checkUpdates();
// }
// 测试添加数据库数据
// testInsertData();
// Map<String, dynamic> data = {
// 'types': 1,
// 'book_id': 175,
// 'chapter_id': 334,
// 'is_open': 1,
// 'color': 'blue',
// 'content': 'This is a note content',
// 'upload': 0,
// 'positioning': 'top',
// 'note_content': 'This is a note',
// 'node_id': 0,
// };
//
// await SqlManager.insertData(data);
final result = await Tools.checkCurrentNetStatus(); final result = await Tools.checkCurrentNetStatus();
// 有网络 并且是登录状态 的时候上传 笔记 // 有网络 并且是登录状态 的时候上传 笔记
...@@ -378,6 +374,180 @@ class LibraryController extends GetxController with GetTickerProviderStateMixin{ ...@@ -378,6 +374,180 @@ class LibraryController extends GetxController with GetTickerProviderStateMixin{
} }
} }
void testInsertData() async{
Map<String, dynamic> data = {
'types': 1,
'book_id': 175,
'chapter_id': 334,
'is_open': 1,
'color': 'blue',
'content': 'This is a note content',
'upload': 0,
'positioning': 'top',
'note_content': 'This is a note',
'node_id': 0,
};
await SqlManager.insertData(data);
}
void _checkUpdates() async {
UModel model = await MineAPI.update();
_getModel = model;
final packageInfo = await PackageInfo.fromPlatform();
int update = verifyVersion(model.version!,packageInfo.version);
if (update == 1) {
_showUpdateDialog(false);
}
}
int verifyVersion(String newVersion, String oldVersion) {
List<String> newVersionArr = newVersion.split('.');
List<String> oldVersionArr = oldVersion.split('.');
for (int i = 0; i < 3; i++) {
int newVersionNumber = int.parse(newVersionArr[i]);
int oldVersionNumber = int.parse(oldVersionArr[i]);
if (newVersionNumber < oldVersionNumber) {
return -1; // 新版本小于旧版本
} else if (newVersionNumber > oldVersionNumber) {
return 1; // 新版本大于旧版本
}
}
return 0; // 两个版本号相等
}
_showUpdateDialog(bool forcedUpgrade) {
showDialog(
context: context,
barrierDismissible: !forcedUpgrade,
builder: (BuildContext context) {
return WillPopScope(
onWillPop: () => Future.value(!forcedUpgrade),
child: AlertDialog(
insetPadding: EdgeInsets.zero, // 设置水平边距
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8.0.w),
),
// 去除操作按钮区域的内边距
actionsPadding: EdgeInsets.zero,
actions: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Column(
mainAxisAlignment: MainAxisAlignment.start,
children: [
SizedBox(
height: 25.5.w,
),
SizedBox(
height: 92.w,
width: 92.w,
child: Image.asset('assets/images/app_update.png'),
),
SizedBox(
height: 13.w,
),
Text(
"版本更新",
style: TextStyle(
fontSize: 14.w,
color: Colours.c3,
fontWeight: Fonts.medium),
),
Padding(
padding: EdgeInsets.only(top: 5.5.w),
child: Text(
'发现新版本V${_getModel.version}',
style: TextStyle(
fontSize: 10.w,
color: Colours.c9,
fontWeight: Fonts.medium),
),
),
SizedBox(
height: 22.w,
),
Container(
height: 1, // 设置分割线的高度
width: 216.5.w, // 设置分割线的宽度
color: Colours.cLine, // 设置分割线的颜色
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
if (!forcedUpgrade)
Padding(padding: EdgeInsets.only(right: 28.w),
child: GestureDetector(
child:
Container(
width: 85.w,
color: Colours.cFF,
alignment: Alignment.center,
child: const Text(
'稍后再说',
style: TextStyle(
color: Colours.c6,
fontSize: 15,
fontWeight: Fonts.medium),
),
),
onTap: () => Navigator.of(context).pop(),
),),
Container(
height: 39.5.w, // 设置分割线的高度
width: 1, // 设置分割线的宽度
color: Colours.cLine, // 设置分割线的颜色
),
Padding(padding: EdgeInsets.only(left: 28.w),
child: GestureDetector(
child: Container(
width: 85.w,
color: Colours.cFF,
alignment: Alignment.center,
child: const Text(
'立即更新',
style: TextStyle(
color: Colours.cAB1941,
fontSize: 15,
fontWeight: Fonts.boldSemi),
),
),
onTap: () {
_appUpdate();
if (!forcedUpgrade) {
Navigator.of(context).pop();
}
},
),
),
],
),
],
),
],
),
],
),
);
},
);
}
/// TODO: 苹果市场app地址
_appUpdate() {
UpdateModel model = UpdateModel(
_getModel.url!,
"zijing.apk",
"ic_launcher",
'https://itunes.apple.com/cn/app/抖音/id1142110895',
);
AzhonAppUpdate.update(model).then((value) => debugPrint('$value'));
}
} }
\ No newline at end of file
library library; library library;
import 'dart:convert'; import 'dart:convert';
import 'dart:io';
import 'package:azlistview/azlistview.dart'; import 'package:azlistview/azlistview.dart';
import 'package:easy_refresh/easy_refresh.dart'; import 'package:easy_refresh/easy_refresh.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_app_update/azhon_app_update.dart';
import 'package:flutter_app_update/update_model.dart';
import 'package:flutter_book/apis/index.dart'; import 'package:flutter_book/apis/index.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';
...@@ -12,6 +15,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; ...@@ -12,6 +15,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:ionicons/ionicons.dart'; import 'package:ionicons/ionicons.dart';
import 'package:package_info_plus/package_info_plus.dart';
import '../../models/index.dart'; import '../../models/index.dart';
import '../../routes/index.dart'; import '../../routes/index.dart';
......
...@@ -9,10 +9,11 @@ class LibraryPage extends StatefulWidget { ...@@ -9,10 +9,11 @@ class LibraryPage extends StatefulWidget {
class _LibraryPageState extends State<LibraryPage> { class _LibraryPageState extends State<LibraryPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return GetBuilder<LibraryController>( return GetBuilder<LibraryController>(
init: LibraryController(), init: LibraryController(context),
builder: (controller) => Scaffold( builder: (controller) => Scaffold(
appBar: AppBar( appBar: AppBar(
title: const Text('图书馆'), title: const Text('图书馆'),
...@@ -131,7 +132,7 @@ class _LibraryPageState extends State<LibraryPage> { ...@@ -131,7 +132,7 @@ class _LibraryPageState extends State<LibraryPage> {
height: 43.w, height: 43.w,
color: Colours.cF9, color: Colours.cF9,
child: GetBuilder<LibraryController>( child: GetBuilder<LibraryController>(
init: LibraryController(), init: LibraryController(context),
// id: 'label', // id: 'label',
builder:(controller) =>ListView.builder( builder:(controller) =>ListView.builder(
scrollDirection:Axis.horizontal , scrollDirection:Axis.horizontal ,
...@@ -153,7 +154,7 @@ class _LibraryPageState extends State<LibraryPage> { ...@@ -153,7 +154,7 @@ class _LibraryPageState extends State<LibraryPage> {
return Container( return Container(
height: 38.w, height: 38.w,
child: GetBuilder<LibraryController>( child: GetBuilder<LibraryController>(
init: LibraryController(), init: LibraryController(context),
builder: (controller) =>ListView.builder( builder: (controller) =>ListView.builder(
scrollDirection: Axis.horizontal, scrollDirection: Axis.horizontal,
itemBuilder: (BuildContext context, int index){ itemBuilder: (BuildContext context, int index){
......
...@@ -153,7 +153,8 @@ class LoginController extends GetxController { ...@@ -153,7 +153,8 @@ class LoginController extends GetxController {
// ]); // ]);
if (context.mounted){ if (context.mounted){
context.goNamed(Routes.main); // context.goNamed(Routes.main);
context.pop();
}else { }else {
context.goNamed(Routes.main); context.goNamed(Routes.main);
} }
......
...@@ -282,8 +282,12 @@ class ReadController extends FullLifeCycleController with GetSingleTickerProvide ...@@ -282,8 +282,12 @@ class ReadController extends FullLifeCycleController with GetSingleTickerProvide
// 初始化录音组件 // 初始化录音组件
Future<void> openTheRecorder() async { Future<void> openTheRecorder() async {
// 获取权限
if(await Access.microphone()){ var status = await Access.microphone();
if (status == false) {
Toast.show('录音权限没有开启无法使用该功能');
return;
}
await _mRecorder.openRecorder(); await _mRecorder.openRecorder();
final session = await AudioSession.instance; final session = await AudioSession.instance;
await session.configure(AudioSessionConfiguration( await session.configure(AudioSessionConfiguration(
...@@ -304,14 +308,9 @@ class ReadController extends FullLifeCycleController with GetSingleTickerProvide ...@@ -304,14 +308,9 @@ class ReadController extends FullLifeCycleController with GetSingleTickerProvide
androidWillPauseWhenDucked: true, androidWillPauseWhenDucked: true,
)); ));
} }
// 没有权限
else {
}
}
// 开启录音 // 开启录音
void record() async { void record() async {
openTheRecorder(); await openTheRecorder();
startRecording = true; startRecording = true;
String filePath = await Tools.getDirectory(); String filePath = await Tools.getDirectory();
String fileName = Tools.generateVoiceFileName(); String fileName = Tools.generateVoiceFileName();
...@@ -323,7 +322,6 @@ class ReadController extends FullLifeCycleController with GetSingleTickerProvide ...@@ -323,7 +322,6 @@ class ReadController extends FullLifeCycleController with GetSingleTickerProvide
codec: Codec.aacMP4, codec: Codec.aacMP4,
); );
// _mRecorder?.setSubscriptionDuration(Duration(milliseconds: 100)); // _mRecorder?.setSubscriptionDuration(Duration(milliseconds: 100));
// _mRecorder?.onProgress?.listen((e) // _mRecorder?.onProgress?.listen((e)
// { // {
......
...@@ -51,3 +51,4 @@ part 'discuss_controller.dart'; ...@@ -51,3 +51,4 @@ part 'discuss_controller.dart';
part 'widgets/input_discuss.dart'; part 'widgets/input_discuss.dart';
part 'widgets/item.dart'; part 'widgets/item.dart';
part 'widgets/search_all.dart'; part 'widgets/search_all.dart';
part 'view_offline.dart';
\ No newline at end of file
part of web;
class ReadOfflinePage extends StatefulWidget {
final String bookId;
final String chapterId;
final String chapterName;
final String noteId;
final BookDetailModel bookDetailModel;
const ReadOfflinePage({
Key? key,
required this.bookId,
required this.chapterId,
required this.chapterName,
required this.bookDetailModel,
required this.noteId
}) : super(key: key);
@override
State<ReadPage> createState() => _ReadPageState();
}
class _ReadOfflinePageState extends State<ReadPage> {
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return GetBuilder(
init: ReadController(bookId: widget.bookId, chapterId: widget.chapterId,chapterName: widget.chapterName,bookDetailModel: widget.bookDetailModel,noteId: widget.noteId),
builder: (readController) => WillPopScope(
onWillPop: () async {
PopBackModel backModel = PopBackModel(chapterId: readController.chapterId,back: true,chapterName: readController.chapterId);
context.pop(backModel);
CustomToast.dismiss();
return false;
},
child:Scaffold(
appBar: CustomAppBar(
titleSpacing: 0,
title: Align(
alignment: Alignment.centerLeft,
child: Text(readController.chapterName),
),
centerTitle: false,
actions: const [
],
),
resizeToAvoidBottomInset: false,
body: Container(
color: Colors.white,
child: Stack(
children: [
InAppWebView(
initialUrlRequest:URLRequest(
// url: Uri.parse(kReadBook),
url: readController.localHtml5Path.isNotEmpty?WebUri.uri(Uri.parse(readController.localHtml5Path)): WebUri.uri(Uri.parse(kReadBook))
// url: Uri.parse("/storage/emulated/0/Android/data/com.zijin.book.flutter_book/files/174/7-325.html"),
),
initialSettings:InAppWebViewSettings(
clearCache:true,
// http的请求也不做限制
mixedContentMode:MixedContentMode.MIXED_CONTENT_ALWAYS_ALLOW
),
contextMenu: ContextMenu(
// options: ContextMenuOptions(hideDefaultSystemContextMenuItems: true),
settings: ContextMenuSettings(
hideDefaultSystemContextMenuItems: true,
)
),
onWebViewCreated: (InAppWebViewController controller){
CustomToast.loading();
readController.webViewController = controller;
},
onConsoleMessage: (controller, consoleMessage) {
// 接收从 WebView 发送的消息
Console.log("Received message from WebView-----------------------------: ${consoleMessage.message}");
},
onLoadStop: (controller, url) {
CustomToast.dismiss();
// flutter 主动给 js 传参数
Map<String, dynamic> param = {
'book_id': readController.bookId,
'chapter_id': readController.chapterId,
'token':UserStore.to.token
};
String str = '$kServerUrl,${readController.bookId},${readController.chapterId},${UserStore.to.token},${readController.noteId},${readController.sModel.bookId =='0'?'':readController.sModel.combinedContent}';
Console.log('传给前端的参数--------------------------------$str');
controller.evaluateJavascript(source: 'callbackInFlutterComponent("$str");');
// 添加单击事件
controller.evaluateJavascript(source: '''
document.addEventListener('click', function() {
window.flutter_inappwebview.callHandler('onTap');
});
''');
// 监听js单击回调
controller.addJavaScriptHandler(handlerName: 'onTap', callback: (args){
readController.setShow(readController.show);
});
// 监听笔记回调
controller.addJavaScriptHandler(handlerName: 'noteCallBack', callback: (args){
Console.log('监听笔记回调------------------------------------------------$args');
readController.noteTitle = args.first;
readController.setShowChat(true);
readController.setChatType(1);
// readController.titleInput.text = args.toString();
});
// 监听百科回调
controller.addJavaScriptHandler(handlerName: 'baikeCallBack', callback: (args){
Console.log('监听百科回调------------------------------------------------$args');
context.pushNamed(Routes.baiKe,queryParameters: {'keyword':args.first});
});
// 监听字典回调
controller.addJavaScriptHandler(handlerName: 'dictCallBack', callback: (args){
Console.log('监听字典回调------------------------------------------------$args');
context.pushNamed(Routes.baiDict,queryParameters: {'keyword':args.first});
});
// 监听朗读回调
controller.addJavaScriptHandler(handlerName: 'readCallBack', callback: (args){
Console.log('监听朗读回调------------------------------------------------$args');
readController.speak(args.first.toString());
});
// 监听讨论回调
controller.addJavaScriptHandler(handlerName: 'discussCallBack', callback: (args){
Console.log('监听讨论回调------------------------------------------------$args');
readController.setShowChat(true);
readController.setChatType(0);
readController.noteTitle = args.first.toString();
});
controller.addJavaScriptHandler(handlerName: 'answerResultCallBack', callback: (args){
Console.log('监听答题回调------------------------------------------------$args');
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'){
url = kAnswer;
}
else {
url = kAnswerResult;
}
Map<String,String> params = {
'chapter_id':chapterId,
'position':position,
'url':url,
'book_id':readController.bookId,
'token':UserStore.to.token,
'title':title
};
Console.log('监听答题回调---------------给页面传参---------------------------------$params');
context.pushNamed(Routes.answer,queryParameters: params);
// 跳转知识测评界面
});
// 监听 上一节 下一节
controller.addJavaScriptHandler(handlerName: 'loadChapterCallBack', callback: (args){
String chapterId = args.first[0].toString();
String chapterName = args.first[1].toString();
ChapterModel chapterModel = ChapterModel(id: int.parse(chapterId), name: chapterName);
// readController.setChapterInfo(id: chapterId, name: chapterName ?? '');
readController.selectChapter(chapterModel);
Console.log('监听 上一节 下一节------------------------------------------------$args');
});
// // 监听 双击回调
// controller.addJavaScriptHandler(handlerName: 'dbClickCallBack', callback: (args){
// readController.setShow(readController.show);
// });
// 阅读页内容中的 外部链接
controller.addJavaScriptHandler(handlerName: 'openLinkCallback', callback: (args){
Console.log('监听外部链接------------------------------------------------$args');
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);
});
// 图片预览
controller.addJavaScriptHandler(handlerName: 'scaleImageCallback', callback: (args){
String url = args.first[0].toString();
String title = args.first[1].toString();
Map<String,String> params = {
'url':url,
'title':title,
};
Console.log('监听图片预览---------------给页面传参---------------------------------$params');
context.pushNamed(Routes.scaleImage,queryParameters: params);
});
// 前端 token过去回调
controller.addJavaScriptHandler(handlerName: 'refreshTokenCallback', callback: (args) async {
final result = await readController.refreshToken();
Map<String, dynamic> param = {
'token': result,
};
String jsonStr = jsonEncode(param);
controller.evaluateJavascript(source: 'refreshTokenSuccess($jsonStr)');
});
/// 离线需要参数
// //
// Map<String, dynamic> param111 = {
// 'book_id': readController.bookId,
// 'chapter_id': readController.chapterId,
// 'token':UserStore.to.token
// };
// String jsonStr = jsonEncode(param111);
// controller.evaluateJavascript(source: 'offlineCallbackInFlutterComponent($jsonStr)');
// // controller.evaluateJavascript(source: 'callbackInFlutterComponent("$str");');
// 添加高亮划线笔记
controller.addJavaScriptHandler(handlerName: 'offlineAddNoteCallBack', callback: (args){
Map<String, dynamic> data = {};
readController.addLocalNote(data);
});
// 删除高亮划线笔记
controller.addJavaScriptHandler(handlerName: 'offlineDelNoteCallBack', callback: (args){
int id = 0;
readController.delLocalNote(id: id);
});
// 更新高亮划线笔记
controller.addJavaScriptHandler(handlerName: 'offlineUpdateNoteCallBack', callback: (args){
int id = 0;
Map<String, dynamic> data = {};
readController.updateLocalNote(id: id,data: data);
});
// 查询高亮划线笔记
controller.addJavaScriptHandler(handlerName: 'offlineQueryNoteCallBack', callback: (args){
});
// 上一节下一节
controller.addJavaScriptHandler(handlerName: 'offlineReadNoteCallBack', callback: (args){
int type = 0;
// 上一节
if (type == 0){
readController.readChapter(type: 0);
}
// 下一节
else{
readController.readChapter(type: 1);
}
});
},
),
Positioned(
left: 0,
right: 0,
top: 0,
bottom: 69,
child: _showContent(readController,readController.toolModel)
),
/// 底部工具栏布局
Visibility(
visible: readController.show,
child:Positioned(
left: 0,
right: 0,
bottom: 0,
child: SafeArea(
bottom: false,
child: Container(
height: 69,
color: Colors.limeAccent,
alignment: Alignment.center,
child: _createToolBar(readController)
),
),
)
),
/// 悬浮按钮点击发起话题布局
Visibility(
visible: readController.showChat,
child: Positioned(
left: 0,
right: 0,
top: 0,
bottom:0,
child: GestureDetector(
onTap: (){
readController.setShowChat(false);
readController.clearAllDiscussInput();
},
child: Container(
color: const Color(0xFF000000).withOpacity(0.5),
child: SingleChildScrollView(
reverse: true,
child: Container(
color: Colors.white,
padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),
// alignment:Alignment.bottomCenter,
child: GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: (){},
child: ReadInputDiscuss(controller: readController,)
)
),
),
),
)
),
),
],
),
),
),
),
);
}
/// 目录 笔记 讨论 工具栏
Widget _createToolBar(ReadController controller){
return Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: controller.tools.map((model){
return Expanded(
child: GestureDetector(
onTap: (){
controller.chooseTool(model);
},
child: Container(
color: Colors.white,
padding: EdgeInsets.only(bottom: 15.w),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.max,
children: [
SizedBox(
width: 25,
height: 25,
child: Image.asset(model.selected?model.activeIcon:model.icon,fit: BoxFit.cover,)
),
SizedBox(height: 2.5.w,),
model.selected?Text(model.name,style: TextStyle(fontSize: 12.w,height: 1.4,fontWeight: Fonts.boldSemi,color: AppTheme.primary),)
:Text(model.name,style: TextStyle(fontSize: 12.w,height: 1.4,fontWeight: Fonts.medium,color: Colours.c6))
],
),
),
),
);
}).toList()
);
}
Widget detail(ReadController controller,ToolModel model){
if(model.tag == 0){
return ReadCategoryPage(controller: controller,
// 点 x 事件
onTap: (){
controller.chooseTool(model);
},
// 点 搜索全部 列表 某一项 事件
onTapSearchItem: (SearchAllModel sModel){
controller.chooseTool(model);
// 加载阅读界面 参数:chapter_id text
controller.sModel = sModel;
controller.selectChapter(ChapterModel(id: sModel.chapterId,name: sModel.chapterName));
controller.webViewController.reload();
},
onTapChapter: (ChapterModel chapterModel){
// 配置选择的章节
controller.selectChapter(chapterModel);
// 取消选中 tool
controller.chooseTool(model);
// 选择了新的章节 刷新 webview
controller.webViewController.reload();
// controller.setCurrentReadChapterId();
},
);
}
else if(model.tag == 1){
return ReadNotePage(
// 点 x 事件
onTap: (){
controller.chooseTool(model);
},
// 点 搜索全部 列表 某一项 事件
onTapSearchItem: (SearchAllModel sModel){
controller.chooseTool(model);
// 重新加载阅读界面 参数:chapter_id text
controller.sModel = sModel;
controller.selectChapter(ChapterModel(id: sModel.chapterId,name: sModel.chapterName));
controller.webViewController.reload();
},
// 删除笔记后 重新刷新web页
delTapCallBack: (){
controller.webViewController.reload();
},
bookDetailModel: controller.bookDetailModel,
chapterId: controller.chapterId,
);
}
else if(model.tag == 2){
return ReadDiscussPage(
// 点 x 事件
onTap: (){
controller.chooseTool(model);
},
// 点 搜索全部 列表 某一项 事件
onTapSearchItem: (SearchAllModel sModel){
controller.chooseTool(model);
controller.sModel = sModel;
// 重新加载阅读界面 参数:chapter_id text
controller.selectChapter(ChapterModel(id: sModel.chapterId,name: sModel.chapterName));
controller.webViewController.reload();
},
bookDetailModel: controller.bookDetailModel,
chapterId:controller.chapterId,
);
}
return const SizedBox();
}
/// 目录、评论、笔记 背景
Widget _showContent(ReadController controller,ToolModel model) {
if (controller.show){
if(model.selected){
return GestureDetector(
onTap: (){
controller.chooseTool(model);
},
child: 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: GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: (){},
child: detail(controller, model),
)
),
),
// child: ReadCategoryPage(),
),
);
}
else{
return const SizedBox();
}
}
return const SizedBox();
}
}
...@@ -116,7 +116,7 @@ class UserEditNoteController extends GetxController { ...@@ -116,7 +116,7 @@ class UserEditNoteController extends GetxController {
// 开启录音 // 开启录音
void record() async { void record() async {
openTheRecorder(); await openTheRecorder();
update(); update();
startRecording = true; startRecording = true;
String filePath = await Tools.getDirectory(); String filePath = await Tools.getDirectory();
......
...@@ -134,10 +134,11 @@ abstract class Routes { ...@@ -134,10 +134,11 @@ abstract class Routes {
// 图片预览 // 图片预览
static const imageView = 'image_view'; static const imageView = 'image_view';
static final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
static final GoRouter config = GoRouter( static final GoRouter config = GoRouter(
navigatorKey: navigatorKey,
initialLocation: '/$splash', initialLocation: '/$splash',
// initialLocation: '/', // initialLocation: '/',
observers: [observer], observers: [observer],
......
...@@ -326,6 +326,7 @@ class _RequestInterceptor extends Interceptor { ...@@ -326,6 +326,7 @@ class _RequestInterceptor extends Interceptor {
final String accessToken = result.data['access_token']; final String accessToken = result.data['access_token'];
if(token.isEmpty && accessToken.isEmpty){ if(token.isEmpty && accessToken.isEmpty){
UserStore.to.logout(); UserStore.to.logout();
// Routes.config.goNamed(Routes.login);
return null; return null;
} }
await Future.wait([ await Future.wait([
......
...@@ -12,7 +12,9 @@ import 'package:flutter_cache_manager/flutter_cache_manager.dart'; ...@@ -12,7 +12,9 @@ import 'package:flutter_cache_manager/flutter_cache_manager.dart';
import 'package:get/get.dart' hide Response, FormData, MultipartFile; import 'package:get/get.dart' hide Response, FormData, MultipartFile;
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
import '../main.dart';
import '../models/index.dart'; import '../models/index.dart';
import '../routes/index.dart';
export 'package:dio/dio.dart'; export 'package:dio/dio.dart';
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论