提交 96ee11be authored 作者: yueweilu's avatar yueweilu

1、笔记 目录 讨论 搜索全文基本布局

2、讨论回复逻辑
上级 dc88726a
......@@ -5,6 +5,7 @@ import 'package:flutter_book/apis/index.dart';
import 'package:flutter_book/theme.dart';
import 'package:flutter_book/utils/index.dart';
import 'package:flutter_book/widgets/index.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_star/custom_rating.dart';
import 'package:flutter_star/star.dart';
......
......@@ -63,6 +63,9 @@ class ReadController extends FullLifeCycleController with GetSingleTickerProvide
// 朗读组件
late FlutterTts flutterTts;
// 是否展示搜索结果
bool showSearch = false;
///------------------------------------------ 页面 生命周期--------------------------------------------------------
@override
......@@ -133,6 +136,11 @@ class ReadController extends FullLifeCycleController with GetSingleTickerProvide
update();
}
void setShowSearch(bool show){
showSearch = show;
update();
}
// 选择了某个章节
void selectChapter(ChapterModel model) {
chapterName = model.name??'';
......
......@@ -11,10 +11,20 @@ class DiscussController extends GetxController {
controlFinishRefresh: true,
);
late TextEditingController searchInput = TextEditingController();
late TextEditingController replyInput = TextEditingController();
final int _limit = 10;
int _page = 1;
bool _noMore = false;
// 展示回复输入框
bool showReply = false;
// 当前要回复的模型
late DiscussModel discussModel;
// 是否展示搜索结果
bool showSearch = false;
@override
void onReady() {
......@@ -25,9 +35,52 @@ class DiscussController extends GetxController {
@override
void onClose() {
refreshController.dispose();
searchInput.dispose();
super.onClose();
}
void setShow() {
showReply = !showReply;
update();
}
void setDiscussModel(DiscussModel model){
discussModel = model;
}
void setShowSearch(bool show){
showSearch = show;
update();
}
Future<bool> submit() async {
Map<String,dynamic> contentMap = {
'text':replyInput.text,
'audio':[],
'image':[]
};
final result = await LibraryAPI.addDiscuss(
bookId: bookDetailModel.bookId.toString(),
chapterId: chapterId,
commentId: discussModel.id.toString(),
quoteContent: '',
title: '',
content: jsonEncode(contentMap)
);
if(result){
Toast.show('话题发表成功');
}
else{
Toast.show('话题发表失败');
}
// 重置所有信息
// reset();
// setShowChat(false);
return result;
}
/// 获取讨论详情
Future<void> _getDiscuss([bool isRefresh = false]) async {
......
......@@ -46,4 +46,5 @@ part 'widgets/book.dart';
part 'note_controller.dart';
part 'discuss_controller.dart';
part 'widgets/input_discuss.dart';
part 'widgets/item.dart';
\ No newline at end of file
part 'widgets/item.dart';
part 'widgets/search_all.dart';
......@@ -16,6 +16,9 @@ class NoteController extends GetxController {
int _page = 1;
bool _noMore = false;
// 是否展示搜索结果
bool showSearch = false;
@override
void onReady() {
......@@ -29,6 +32,10 @@ class NoteController extends GetxController {
super.onClose();
}
void setShowSearch(bool show){
showSearch = show;
update();
}
/// 获取笔记列表
Future<void> _getNotes([bool isRefresh = false]) async {
......
......@@ -67,6 +67,11 @@ class _ReadPageState extends State<ReadPage> {
url: Uri.parse('http://150.158.138.40:9200/read.html'),
// url: Uri.parse("/storage/emulated/0/Android/data/com.zijin.book.flutter_book/files/174/7-325.html"),
),
initialOptions: InAppWebViewGroupOptions(
crossPlatform: InAppWebViewOptions(
clearCache: true
)
),
contextMenu: ContextMenu(
options: ContextMenuOptions(hideDefaultSystemContextMenuItems: true),
),
......@@ -277,11 +282,18 @@ class _ReadPageState extends State<ReadPage> {
Widget detail(ReadController controller,ToolModel model){
if(model.tag == 0){
return ReadCategoryPage(controller: controller,
// 点 x 事件
onTap: (){
controller.chooseTool(model);
},
// 点 搜索全部 列表 某一项 事件
onTapSearchItem: (){
controller.chooseTool(model);
// TODO:重新加载阅读界面 参数:chapter_id text
Console.log('-----------目录点击搜索条目---------------------');
},
onTapChapter: (ChapterModel chapterModel){
print('-----------选择的章节-------------${chapterModel.name}--------');
Console.log('-----------选择的章节-------------${chapterModel.name}--------');
// 配置选择的章节
controller.selectChapter(chapterModel);
// 取消选中 tool
......@@ -292,14 +304,36 @@ class _ReadPageState extends State<ReadPage> {
);
}
else if(model.tag == 1){
return ReadNotePage(onTap: (){
controller.chooseTool(model);
},bookDetailModel: controller.bookDetailModel,chapterId: controller.chapterId,);
return ReadNotePage(
// 点 x 事件
onTap: (){
controller.chooseTool(model);
},
// 点 搜索全部 列表 某一项 事件
onTapSearchItem: (){
controller.chooseTool(model);
// TODO:重新加载阅读界面 参数:chapter_id text
Console.log('-----------笔记点击搜索条目---------------------');
},
bookDetailModel: controller.bookDetailModel,
chapterId: controller.chapterId,
);
}
else if(model.tag == 2){
return ReadDiscussPage(onTap: (){
controller.chooseTool(model);
},bookDetailModel: controller.bookDetailModel,chapterId:controller.chapterId,);
return ReadDiscussPage(
// 点 x 事件
onTap: (){
controller.chooseTool(model);
},
// 点 搜索全部 列表 某一项 事件
onTapSearchItem: (){
controller.chooseTool(model);
// TODO:重新加载阅读界面 参数:chapter_id text
Console.log('-----------讨论点击搜索条目---------------------');
},
bookDetailModel: controller.bookDetailModel,
chapterId:controller.chapterId,
);
}
return const SizedBox();
}
......
......@@ -3,12 +3,15 @@ part of web;
class ReadCategoryPage extends StatefulWidget {
final ReadController controller;
final void Function()? onTap;
// 点击 搜索全文 中的列表事件
final void Function()? onTapSearchItem;
final Function(ChapterModel chapterModel) onTapChapter;
const ReadCategoryPage({
Key? key,
required this.controller,
required this.onTap,
required this.onTapChapter
required this.onTapChapter,
this.onTapSearchItem
}) : super(key: key);
@override
......@@ -33,37 +36,59 @@ class _ReadCategoryPageState extends State<ReadCategoryPage> {
child: Image.asset('assets/images/close.png'),
)
),
Container(
margin: EdgeInsets.only(left: 15.w,right: 15.w,),
decoration: BoxDecoration(
color: const Color(0xFFF9F9F9),
borderRadius: BorderRadius.circular(17.5.w),
boxShadow: [
BoxShadow(
color: const Color(0xFFC7C7C7).withOpacity(0.5),
offset: Offset(3.w, 0),
blurRadius: 10.w,
spreadRadius: 0.w,
Row(
children: [
Expanded(
child: Container(
margin: EdgeInsets.only(left: 15.w,right: 15.w,),
decoration: BoxDecoration(
color: const Color(0xFFF9F9F9),
borderRadius: BorderRadius.circular(17.5.w),
boxShadow: [
BoxShadow(
color: const Color(0xFFC7C7C7).withOpacity(0.5),
offset: Offset(3.w, 0),
blurRadius: 10.w,
spreadRadius: 0.w,
),
],
),
child: ClipRRect(
borderRadius: BorderRadius.circular(17.5.w),
child: CustomInputSearch(
// controller: controller.searchInput,
readOnly: false,
hintText: '搜索全文---目录',
onTap: () {
// context.pushNamed(Routes.msgs);
},
onEditingComplete: () {
widget.controller.setShowSearch(true);
Tools.unfocus();
},
),
),
),
],
),
child: ClipRRect(
borderRadius: BorderRadius.circular(17.5.w),
child: CustomInputSearch(
controller: searchController,
readOnly: false,
hintText: '请输入书籍名称分类',
onTap: () {
// context.pushNamed(Routes.msgs);
},
onEditingComplete: () {
},
),
),
widget.controller.showSearch?GestureDetector(
onTap: () {
widget.controller.setShowSearch(false);
Tools.unfocus();
},
child: Container(
margin: EdgeInsets.only(right: 15.w),
child: Text('取消'),
)
):const SizedBox(),
],
),
BuildBook(bookDetailModel: widget.controller.bookDetailModel,),
Expanded(
widget.controller.showSearch? Expanded(child: BuildSearchAll(onTap: (){
if (widget.onTapSearchItem !=null) {
widget.onTapSearchItem!();
}
},)):
widget.controller.showSearch?const SizedBox():BuildBook(bookDetailModel: widget.controller.bookDetailModel,),
widget.controller.showSearch?const SizedBox():Expanded(
child: ListView.builder(
itemBuilder:(BuildContext context, int index){
return BuildItem(model: widget.controller.chapters[index],onTapChapter:(ChapterModel chapterModel){
......
part of web;
class ReadDiscussPage extends StatefulWidget {
// 点 x 事件
final void Function()? onTap;
// 点击 搜索全文 中的列表事件
final void Function()? onTapSearchItem;
final BookDetailModel bookDetailModel;
// 当前的章节id
final String chapterId;
......@@ -9,7 +12,8 @@ class ReadDiscussPage extends StatefulWidget {
Key? key,
required this.onTap,
required this.bookDetailModel,
required this.chapterId
required this.chapterId,
this.onTapSearchItem
}) : super(key: key);
@override
......@@ -17,7 +21,6 @@ class ReadDiscussPage extends StatefulWidget {
}
class _ReadDiscussPageState extends State<ReadDiscussPage> {
late TextEditingController searchController = TextEditingController();
@override
Widget build(BuildContext context) {
return GetBuilder<DiscussController>(
......@@ -34,44 +37,124 @@ class _ReadDiscussPageState extends State<ReadDiscussPage> {
child: Image.asset('assets/images/close.png')
)
),
Container(
margin: EdgeInsets.only(left: 15.w,right: 15.w,),
decoration: BoxDecoration(
color: const Color(0xFFF9F9F9),
borderRadius: BorderRadius.circular(17.5.w),
boxShadow: [
BoxShadow(
color: const Color(0xFFC7C7C7).withOpacity(0.5),
offset: Offset(3.w, 0),
blurRadius: 10.w,
spreadRadius: 0.w,
),
],
),
child: ClipRRect(
borderRadius: BorderRadius.circular(17.5.w),
child: CustomInputSearch(
controller: searchController,
readOnly: false,
hintText: '请输入书籍名称讨论',
Row(
children: [
Expanded(
child: Container(
margin: EdgeInsets.only(left: 15.w,right: 15.w,),
decoration: BoxDecoration(
color: const Color(0xFFF9F9F9),
borderRadius: BorderRadius.circular(17.5.w),
boxShadow: [
BoxShadow(
color: const Color(0xFFC7C7C7).withOpacity(0.5),
offset: Offset(3.w, 0),
blurRadius: 10.w,
spreadRadius: 0.w,
),
],
),
child: ClipRRect(
borderRadius: BorderRadius.circular(17.5.w),
child: CustomInputSearch(
controller: controller.searchInput,
readOnly: false,
hintText: '搜索全文---讨论',
onTap: () {
// context.pushNamed(Routes.msgs);
},
onEditingComplete: () {
controller.setShowSearch(true);
Tools.unfocus();
},
),
),
),
),
controller.showSearch?GestureDetector(
onTap: () {
// context.pushNamed(Routes.msgs);
controller.setShowSearch(false);
Tools.unfocus();
},
onEditingComplete: () {
},
),
),
child: Container(
margin: EdgeInsets.only(right: 15.w),
child: Text('取消'),
)
):const SizedBox(),
],
),
BuildBook(bookDetailModel: widget.bookDetailModel,),
Expanded(
child: ListView.builder(
itemBuilder: (BuildContext context,int index){
DiscussModel model = controller.discuss[index];
return BuildDiscuss(model: model,);
},
itemCount: controller.discuss.length,
),
controller.showSearch? Expanded(child: BuildSearchAll(onTap: (){
if (widget.onTapSearchItem !=null) {
widget.onTapSearchItem!();
}
},)):
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,);
},
itemCount: controller.discuss.length,
),
Visibility(
visible: controller.showReply,
child: Positioned(
bottom: MediaQuery.of(context).viewInsets.bottom -49 ,
left: 0,
right: 0,
child: Container(
color: Colors.white,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
children: [
Expanded(
child: TextField(
autofocus: true,
maxLines: null,
controller: controller.replyInput,
decoration: InputDecoration(
border: InputBorder.none,
enabledBorder: InputBorder.none,
focusedBorder: InputBorder.none,
hintText: '请输入内容',
hintStyle:TextStyle(fontSize: 12.w,height: 1.5,color: Colours.c9,),
filled: true,
fillColor: Colours.cF8,
),
),
),
Gaps.hGaps10,
GestureDetector(
onTap: (){
controller.submit();
controller.setShow();
},
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(15.w),
color: AppTheme.primary,
gradient: LinearGradient(
colors: [const Color(0xFFD53676).withOpacity(0.9),AppTheme.primary] , // 不可点击时的颜色,透明度为0.7
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
),
),
padding: EdgeInsets.symmetric(horizontal:13.5.w,vertical: 4.w),
child: Text('发表',style: TextStyle(fontSize: 14.w,fontWeight: Fonts.medium,color: Colors.white),),
),
)
],
),
),
),
),
)
],
)
)
],
......
......@@ -2,6 +2,8 @@ part of web;
class ReadNotePage extends StatefulWidget {
final BookDetailModel bookDetailModel;
// 点击 搜索全文 中的列表事件
final void Function()? onTapSearchItem;
// 当前的章节id
final String chapterId;
final void Function()? onTap;
......@@ -9,7 +11,8 @@ class ReadNotePage extends StatefulWidget {
Key? key,
required this.onTap,
required this.bookDetailModel,
required this.chapterId
required this.chapterId,
this.onTapSearchItem
}) : super(key: key);
@override
......@@ -32,37 +35,59 @@ class _ReadNotePageState extends State<ReadNotePage> {
child: Image.asset('assets/images/close.png')
)
),
Container(
margin: EdgeInsets.only(left: 15.w,right: 15.w,),
decoration: BoxDecoration(
color: const Color(0xFFF9F9F9),
borderRadius: BorderRadius.circular(17.5.w),
boxShadow: [
BoxShadow(
color: const Color(0xFFC7C7C7).withOpacity(0.5),
offset: Offset(3.w, 0),
blurRadius: 10.w,
spreadRadius: 0.w,
Row(
children: [
Expanded(
child: Container(
margin: EdgeInsets.only(left: 15.w,right: 15.w,),
decoration: BoxDecoration(
color: const Color(0xFFF9F9F9),
borderRadius: BorderRadius.circular(17.5.w),
boxShadow: [
BoxShadow(
color: const Color(0xFFC7C7C7).withOpacity(0.5),
offset: Offset(3.w, 0),
blurRadius: 10.w,
spreadRadius: 0.w,
),
],
),
child: ClipRRect(
borderRadius: BorderRadius.circular(17.5.w),
child: CustomInputSearch(
// controller: controller.searchInput,
readOnly: false,
hintText: '搜索全文---笔记',
onTap: () {
// context.pushNamed(Routes.msgs);
},
onEditingComplete: () {
controller.setShowSearch(true);
Tools.unfocus();
},
),
),
),
],
),
child: ClipRRect(
borderRadius: BorderRadius.circular(17.5.w),
child: CustomInputSearch(
controller: searchController,
readOnly: false,
hintText: '请输入书籍名称笔记',
onTap: () {
// context.pushNamed(Routes.msgs);
},
onEditingComplete: () {
},
),
),
controller.showSearch?GestureDetector(
onTap: () {
controller.setShowSearch(false);
Tools.unfocus();
},
child: Container(
margin: EdgeInsets.only(right: 15.w),
child: Text('取消'),
)
):const SizedBox(),
],
),
BuildBook(bookDetailModel: widget.bookDetailModel,),
Expanded(
controller.showSearch? Expanded(child: BuildSearchAll(onTap: (){
if (widget.onTapSearchItem !=null) {
widget.onTapSearchItem!();
}
},)):
controller.showSearch?const SizedBox():BuildBook(bookDetailModel: widget.bookDetailModel,),
controller.showSearch?const SizedBox():Expanded(
child: MediaQuery.removePadding(
context: context,
removeTop: true,
......
part of web;
class BuildSearchAll extends StatefulWidget {
final void Function()? onTap;
const BuildSearchAll({
Key? key,
this.onTap
}) : super(key: key);
@override
State<BuildSearchAll> createState() => _BuildSearchAllState();
}
class _BuildSearchAllState extends State<BuildSearchAll> {
@override
Widget build(BuildContext context) {
return ListView.builder(
itemBuilder: (BuildContext context, int index){
return GestureDetector(
onTap: (){
if(widget.onTap !=null){
widget.onTap!();
}
},
child: Container(
color: Colors.red,
height: 110,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('章节名称$index'),
Text('章节内容$index'),
],
),
),
);
},
itemCount: 3,
);
}
}
......@@ -10,6 +10,7 @@ import '../../apis/index.dart';
import '../../models/index.dart';
import '../../theme.dart';
import '../../utils/index.dart';
import '../read_web/index.dart';
part 'view.dart';
......
......@@ -2,9 +2,11 @@ part of user_discuss_des;
class BuildDiscuss extends StatefulWidget {
final DiscussModel model;
final DiscussController? controller;
const BuildDiscuss({
Key? key,
required this.model
required this.model,
this.controller
}) : super(key: key);
@override
......@@ -146,7 +148,9 @@ class _BuildDiscussState extends State<BuildDiscuss> {
children: [
GestureDetector(
onTap:(){
_showKeyboard(context);
// _showKeyboard(context);
widget.controller?.setShow();
widget.controller?.setDiscussModel(model);
},
child: Container(
height: 25.w,
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论