提交 74128bd5 authored 作者: maodou's avatar maodou

Merge remote-tracking branch 'origin/test' into test

{ {
"images" : [ "images" : [
{ {
"size" : "20x20", "filename" : "icon-20@2x.png",
"idiom" : "iphone", "idiom" : "universal",
"filename" : "Icon-App-20x20@2x.png", "platform" : "ios",
"scale" : "2x" "scale" : "2x",
"size" : "20x20"
}, },
{ {
"size" : "20x20", "filename" : "icon-20@3x.png",
"idiom" : "iphone", "idiom" : "universal",
"filename" : "Icon-App-20x20@3x.png", "platform" : "ios",
"scale" : "3x" "scale" : "3x",
"size" : "20x20"
}, },
{ {
"size" : "29x29", "filename" : "icon-29@2x.png",
"idiom" : "iphone", "idiom" : "universal",
"filename" : "Icon-App-29x29@1x.png", "platform" : "ios",
"scale" : "1x" "scale" : "2x",
"size" : "29x29"
}, },
{ {
"size" : "29x29", "filename" : "icon-29@3x.png",
"idiom" : "iphone", "idiom" : "universal",
"filename" : "Icon-App-29x29@2x.png", "platform" : "ios",
"scale" : "2x" "scale" : "3x",
"size" : "29x29"
}, },
{ {
"size" : "29x29", "filename" : "icon-38@2x.png",
"idiom" : "iphone", "idiom" : "universal",
"filename" : "Icon-App-29x29@3x.png", "platform" : "ios",
"scale" : "3x" "scale" : "2x",
"size" : "38x38"
}, },
{ {
"size" : "40x40", "filename" : "icon-38@3x.png",
"idiom" : "iphone", "idiom" : "universal",
"filename" : "Icon-App-40x40@2x.png", "platform" : "ios",
"scale" : "2x" "scale" : "3x",
"size" : "38x38"
}, },
{ {
"size" : "40x40", "filename" : "icon-40@2x.png",
"idiom" : "iphone", "idiom" : "universal",
"filename" : "Icon-App-40x40@3x.png", "platform" : "ios",
"scale" : "3x" "scale" : "2x",
"size" : "40x40"
}, },
{ {
"size" : "60x60", "filename" : "icon-40@3x.png",
"idiom" : "iphone", "idiom" : "universal",
"filename" : "Icon-App-60x60@2x.png", "platform" : "ios",
"scale" : "2x" "scale" : "3x",
"size" : "40x40"
}, },
{ {
"size" : "60x60", "filename" : "icon-60@2x.png",
"idiom" : "iphone", "idiom" : "universal",
"filename" : "Icon-App-60x60@3x.png", "platform" : "ios",
"scale" : "3x" "scale" : "2x",
"size" : "60x60"
}, },
{ {
"size" : "20x20", "filename" : "icon-60@3x.png",
"idiom" : "ipad", "idiom" : "universal",
"filename" : "Icon-App-20x20@1x.png", "platform" : "ios",
"scale" : "1x" "scale" : "3x",
"size" : "60x60"
}, },
{ {
"size" : "20x20", "filename" : "icon-64@2x.png",
"idiom" : "ipad", "idiom" : "universal",
"filename" : "Icon-App-20x20@2x.png", "platform" : "ios",
"scale" : "2x" "scale" : "2x",
"size" : "64x64"
}, },
{ {
"size" : "29x29", "filename" : "icon-64@3x.png",
"idiom" : "ipad", "idiom" : "universal",
"filename" : "Icon-App-29x29@1x.png", "platform" : "ios",
"scale" : "1x" "scale" : "3x",
"size" : "64x64"
}, },
{ {
"size" : "29x29", "filename" : "icon-68@2x.png",
"idiom" : "ipad", "idiom" : "universal",
"filename" : "Icon-App-29x29@2x.png", "platform" : "ios",
"scale" : "2x" "scale" : "2x",
"size" : "68x68"
}, },
{ {
"size" : "40x40", "filename" : "icon-76@2x.png",
"idiom" : "ipad", "idiom" : "universal",
"filename" : "Icon-App-40x40@1x.png", "platform" : "ios",
"scale" : "1x" "scale" : "2x",
"size" : "76x76"
}, },
{ {
"size" : "40x40", "filename" : "icon-83.5@2x.png",
"idiom" : "ipad", "idiom" : "universal",
"filename" : "Icon-App-40x40@2x.png", "platform" : "ios",
"scale" : "2x" "scale" : "2x",
"size" : "83.5x83.5"
}, },
{ {
"size" : "76x76", "filename" : "icon-1024.png",
"idiom" : "ipad", "idiom" : "universal",
"filename" : "Icon-App-76x76@1x.png", "platform" : "ios",
"scale" : "1x" "scale" : "1x",
}, "size" : "1024x1024"
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@2x.png",
"scale" : "2x"
},
{
"size" : "83.5x83.5",
"idiom" : "ipad",
"filename" : "Icon-App-83.5x83.5@2x.png",
"scale" : "2x"
},
{
"size" : "1024x1024",
"idiom" : "ios-marketing",
"filename" : "Icon-App-1024x1024@1x.png",
"scale" : "1x"
} }
], ],
"info" : { "info" : {
"version" : 1, "author" : "xcode",
"author" : "xcode" "version" : 1
} }
} }
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
<key>CFBundleDevelopmentRegion</key> <key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string> <string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key> <key>CFBundleDisplayName</key>
<string>Flutter Book</string> <string>紫荆数智学堂</string>
<key>CFBundleExecutable</key> <key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string> <string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
......
...@@ -17,6 +17,10 @@ class ReadController extends FullLifeCycleController with GetSingleTickerProvide ...@@ -17,6 +17,10 @@ class ReadController extends FullLifeCycleController with GetSingleTickerProvide
// //默认显示 // //默认显示
// int currentPage = 1; // int currentPage = 1;
bool showChat = false;
final FocusNode discussTitleFocusNode = FocusNode();
final FocusNode discussContentFocusNode = FocusNode();
late AnimationController _controller; late AnimationController _controller;
bool _show = true; bool _show = true;
...@@ -58,11 +62,23 @@ class ReadController extends FullLifeCycleController with GetSingleTickerProvide ...@@ -58,11 +62,23 @@ class ReadController extends FullLifeCycleController with GetSingleTickerProvide
AnimationController get controller => _controller; AnimationController get controller => _controller;
void _onCommentFocusChanged() {
if (discussTitleFocusNode.hasFocus || discussContentFocusNode.hasFocus) {
setShowChat(true);
} else {
setShowChat(false);
}
}
void setShowChat(bool value) {
showChat = value;
update();
}
@override @override
void onInit() { void onInit() {
// pageController = PageController(initialPage: currentPage); // pageController = PageController(initialPage: currentPage);
discussTitleFocusNode.addListener(_onCommentFocusChanged);
/// 默认不显示状态栏 /// 默认不显示状态栏
// SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky); // SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky);
/// 初始化 /// 初始化
...@@ -82,6 +98,8 @@ class ReadController extends FullLifeCycleController with GetSingleTickerProvide ...@@ -82,6 +98,8 @@ class ReadController extends FullLifeCycleController with GetSingleTickerProvide
@override @override
void onClose() { void onClose() {
_controller.dispose(); _controller.dispose();
discussTitleFocusNode.removeListener(_onCommentFocusChanged);
discussTitleFocusNode.dispose();
super.onClose(); super.onClose();
} }
......
...@@ -25,3 +25,4 @@ part 'widgets/note.dart'; ...@@ -25,3 +25,4 @@ 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';
\ No newline at end of file
part of web; part of web;
final GlobalKey _chatContainerKey = GlobalKey();
class ReadPage extends StatefulWidget { class ReadPage extends StatefulWidget {
const ReadPage({Key? key}) : super(key: key); const ReadPage({Key? key}) : super(key: key);
...@@ -22,7 +24,16 @@ class _ReadPageState extends State<ReadPage> { ...@@ -22,7 +24,16 @@ class _ReadPageState extends State<ReadPage> {
return GetBuilder<ReadController>( return GetBuilder<ReadController>(
init: ReadController(), init: ReadController(),
builder: (readController) => Scaffold( builder: (readController) => Scaffold(
resizeToAvoidBottomInset: false,
floatingActionButton: readController.show?GestureDetector(
onTap: (){
readController.setShowChat(true);
// FocusScope.of(context).requestFocus(readController.commentFocusNode);
},
child: Image.asset('assets/images/chat.png'),
):null,
// floatingActionButtonAnimator: const NoAnimationFabAnimator(),
floatingActionButtonLocation:MyFloatingActionButtonLocation(),
body: Container( body: Container(
color: Colors.white, color: Colors.white,
child: Stack( child: Stack(
...@@ -84,7 +95,15 @@ class _ReadPageState extends State<ReadPage> { ...@@ -84,7 +95,15 @@ class _ReadPageState extends State<ReadPage> {
child: _createToolBar(readController) child: _createToolBar(readController)
), ),
), ),
Visibility(
visible: readController.showChat,
child: Positioned(
left: 0,
right: 0,
bottom:MediaQuery.of(context).viewInsets.bottom,
child: ReadInputDiscuss(controller: readController,)
),
),
], ],
), ),
), ),
...@@ -93,6 +112,7 @@ class _ReadPageState extends State<ReadPage> { ...@@ -93,6 +112,7 @@ class _ReadPageState extends State<ReadPage> {
} }
/// 目录 笔记 讨论 工具栏
Widget _createToolBar(ReadController controller){ Widget _createToolBar(ReadController controller){
return Container( return Container(
child: Row( child: Row(
...@@ -127,12 +147,13 @@ class _ReadPageState extends State<ReadPage> { ...@@ -127,12 +147,13 @@ class _ReadPageState extends State<ReadPage> {
); );
} }
/// 目录、评论、笔记
Widget _showContent(ReadController controller,ToolModel model) { Widget _showContent(ReadController controller,ToolModel model) {
print('++++++++++++++++++++++++${model.tag}'); print('++++++++++++++++++++++++${model.tag}');
if (controller.show){ if (controller.show){
if (model.tag == 0){ if (model.tag == 0){
return model.selected? Container( return model.selected? Container(
color: 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)),
...@@ -181,4 +202,189 @@ class _ReadPageState extends State<ReadPage> { ...@@ -181,4 +202,189 @@ class _ReadPageState extends State<ReadPage> {
} }
return const SizedBox(); return const SizedBox();
} }
Widget _discussInput(ReadController controller){
return Container(
margin: EdgeInsets.symmetric(horizontal: 15.w),
child: Column(
children: [
Container(
margin: EdgeInsets.symmetric(vertical: 10.w),
child: Row(
children: [
Text('话题',style: TextStyle(fontSize: 14.w,color: Colours.c3,height: 1.5,fontWeight: Fonts.medium),),
Gaps.hGaps5,
Expanded(
child: ClipRRect(
borderRadius: BorderRadius.circular(4),
child: TextField(
focusNode: controller.discussTitleFocusNode,
autofocus: true,
decoration: InputDecoration(
hintText: '请输入话题名称',
hintStyle:TextStyle(fontSize: 12.w,height: 1.5,color: Colours.c9,),
filled: true,
fillColor: Colours.cF8,
),
),
),
),
],
),
),
ClipRRect(
borderRadius: BorderRadius.circular(4.w),
child: Container(
color: Colours.cF8,
constraints: BoxConstraints(
minHeight: 100.w
),
child: Column(
children: [
TextField(
focusNode: controller.discussContentFocusNode,
maxLines: null,
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,
),
),
Column(
children: [
MediaQuery.removePadding(
context: context,
removeTop: true,
child: GridView.builder(
// padding: const EdgeInsets.only(left: 13,top: 10),
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 6,
crossAxisSpacing: 2.w,
mainAxisSpacing: 2.w,
childAspectRatio: 1
),
itemBuilder: (BuildContext context, int index) {
return Container(
color: Colors.red,
child: Center(child: Text('图片')),
);
},
itemCount: 0,
),
),
Container(
color: Colors.red,
child: MediaQuery.removePadding(
context: context,
removeTop: true,
child: ListView.builder(
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemBuilder: (BuildContext context, int index){
return Container(
height: 20.w,
margin: EdgeInsets.only(right: 130.w),
child: Container(
margin: EdgeInsets.only(top: 5.w),
padding: EdgeInsets.only(right:20.w,left: 10.w),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10.w),
color: Colours.cF9,
),
child: Row(
// mainAxisSize: MainAxisSize.min,
mainAxisAlignment:MainAxisAlignment.spaceBetween,
children: [
Image.asset('assets/images/audio.png'),
Text('0:00/1:52',style: TextStyle(fontSize: 10.w,height: 1.4,color: Colours.c9),)
],
),
),
);
},
itemCount: 0,
),
),
)
],
)
],
),
),
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Row(
children: [
Image.asset('assets/images/read_add_img.png'),
Gaps.hGaps10,
Image.asset('assets/images/read_add_audio.png'),
],
),
GestureDetector(
onTap: (){},
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),),
),
)
],
)
],
)
);
}
} }
class MyFloatingActionButtonLocation extends FloatingActionButtonLocation {
@override
Offset getOffset(ScaffoldPrelayoutGeometry scaffoldGeometry) {
// You can customize the position of the FloatingActionButton here
return Offset(scaffoldGeometry.scaffoldSize.width - 15.0.w - 45.w, scaffoldGeometry.scaffoldSize.height - 118.w-49.w);
}
@override
String toString() => 'MyFloatingActionButtonLocation';
}
// class NoAnimationFabAnimator extends FloatingActionButtonAnimator {
// // 通过构造函数参数提供动画
// const NoAnimationFabAnimator();
//
// @override
// Animation<double> getRotationAnimation({required Animation<double> parent}) {
// return AlwaysStoppedAnimation<double>(0);
// }
//
// @override
// Animation<double> getScaleAnimation({required Animation<double> parent}) {
// return AlwaysStoppedAnimation<double>(1);
// }
//
// @override
// Offset getOffset({required Offset begin, required Offset end, required double progress}) {
// return begin;
// }
// }
part of web;
class ReadInputDiscuss extends StatefulWidget {
final ReadController controller;
const ReadInputDiscuss({
Key? key,
required this.controller,
}) : super(key: key);
@override
State<ReadInputDiscuss> createState() => _ReadInputDiscussState();
}
class _ReadInputDiscussState extends State<ReadInputDiscuss> {
@override
Widget build(BuildContext context) {
return Container(
margin: EdgeInsets.symmetric(horizontal: 15.w),
child: Column(
children: [
Container(
margin: EdgeInsets.symmetric(vertical: 10.w),
child: Row(
children: [
Text('话题',style: TextStyle(fontSize: 14.w,color: Colours.c3,height: 1.5,fontWeight: Fonts.medium),),
Gaps.hGaps5,
Expanded(
child: ClipRRect(
borderRadius: BorderRadius.circular(4),
child: TextField(
focusNode: widget.controller.discussTitleFocusNode,
autofocus: true,
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,
),
),
),
),
],
),
),
ClipRRect(
borderRadius: BorderRadius.circular(4.w),
child: Container(
color: Colours.cF8,
constraints: BoxConstraints(
minHeight: 100.w
),
child: Column(
children: [
TextField(
focusNode: widget.controller.discussContentFocusNode,
maxLines: null,
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,
),
),
Column(
children: [
MediaQuery.removePadding(
context: context,
removeTop: true,
child: GridView.builder(
// padding: const EdgeInsets.only(left: 13,top: 10),
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 6,
crossAxisSpacing: 2.w,
mainAxisSpacing: 2.w,
childAspectRatio: 1
),
itemBuilder: (BuildContext context, int index) {
return Container(
color: Colors.red,
child: Center(child: Text('图片')),
);
},
itemCount: 0,
),
),
Container(
color: Colors.red,
child: MediaQuery.removePadding(
context: context,
removeTop: true,
child: ListView.builder(
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemBuilder: (BuildContext context, int index){
return Container(
height: 20.w,
margin: EdgeInsets.only(right: 130.w),
child: Container(
margin: EdgeInsets.only(top: 5.w),
padding: EdgeInsets.only(right:20.w,left: 10.w),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10.w),
color: Colours.cF9,
),
child: Row(
// mainAxisSize: MainAxisSize.min,
mainAxisAlignment:MainAxisAlignment.spaceBetween,
children: [
Image.asset('assets/images/audio.png'),
Text('0:00/1:52',style: TextStyle(fontSize: 10.w,height: 1.4,color: Colours.c9),)
],
),
),
);
},
itemCount: 0,
),
),
)
],
)
],
),
),
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Row(
children: [
Image.asset('assets/images/read_add_img.png'),
Gaps.hGaps10,
Image.asset('assets/images/read_add_audio.png'),
],
),
GestureDetector(
onTap: (){},
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),),
),
)
],
)
],
)
);
}
}
...@@ -201,10 +201,11 @@ class _RequestInterceptor extends Interceptor { ...@@ -201,10 +201,11 @@ class _RequestInterceptor extends Interceptor {
final response = err.response; final response = err.response;
final statusCode = response?.statusCode; final statusCode = response?.statusCode;
print('************* ${response?.data}'); print('************* ${response?.data}');
print('******statusCode******* $statusCode');
// Console.log(response?.data); // Console.log(response?.data);
var msg = '服务器错误'; var msg = '服务器错误';
switch (statusCode) { switch (statusCode) {
case 401: case 403:
msg = '$statusCode - Unauthorized'; msg = '$statusCode - Unauthorized';
final newToken = await refreshToken(); final newToken = await refreshToken();
if (newToken != null) { if (newToken != null) {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论