提交 3b6660e4 authored 作者: maodou's avatar maodou

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

......@@ -8,6 +8,7 @@
/* Begin PBXBuildFile section */
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
18D185D62B6745D100561CC8 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 18D185D52B6745D100561CC8 /* StoreKit.framework */; };
297D4B521D4A45CEFC018F23 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D9746A3A42B49971E109B58 /* libPods-Runner.a */; };
331C80F4294D02FB00263BE5 /* RunnerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 331C80F3294D02FB00263BE5 /* RunnerTests.m */; };
389E384DCE26FA37EA2BA4FF /* libPods-RunnerTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E360DC6E27A1D286B37E030A /* libPods-RunnerTests.a */; };
......@@ -45,6 +46,8 @@
/* Begin PBXFileReference section */
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
18D185D52B6745D100561CC8 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; };
18D185D72B674B4300561CC8 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = "<group>"; };
1D32EB398235AD2BE8600068 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
331C80F1294D02FB00263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
331C80F3294D02FB00263BE5 /* RunnerTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RunnerTests.m; sourceTree = "<group>"; };
......@@ -83,6 +86,7 @@
buildActionMask = 2147483647;
files = (
297D4B521D4A45CEFC018F23 /* libPods-Runner.a in Frameworks */,
18D185D62B6745D100561CC8 /* StoreKit.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
......@@ -132,6 +136,7 @@
97C146F01CF9000F007C117D /* Runner */ = {
isa = PBXGroup;
children = (
18D185D72B674B4300561CC8 /* Runner.entitlements */,
7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */,
7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */,
97C146FA1CF9000F007C117D /* Main.storyboard */,
......@@ -169,6 +174,7 @@
DEAEA83548321DAC7AAEFA5B /* Frameworks */ = {
isa = PBXGroup;
children = (
18D185D52B6745D100561CC8 /* StoreKit.framework */,
7D9746A3A42B49971E109B58 /* libPods-Runner.a */,
E360DC6E27A1D286B37E030A /* libPods-RunnerTests.a */,
);
......@@ -476,6 +482,7 @@
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = MYN43C5WGE;
ENABLE_BITCODE = NO;
......@@ -644,6 +651,7 @@
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = MYN43C5WGE;
ENABLE_BITCODE = NO;
......@@ -665,6 +673,7 @@
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = MYN43C5WGE;
ENABLE_BITCODE = NO;
......
......@@ -22,6 +22,19 @@
<string>$(FLUTTER_BUILD_NAME)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>alipay</string>
<key>CFBundleURLSchemes</key>
<array>
<string>zijingbook</string>
</array>
</dict>
</array>
<key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>LSRequiresIPhoneOS</key>
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.developer.associated-domains</key>
<array/>
</dict>
</plist>
......@@ -163,29 +163,6 @@ abstract class CommonAPI {
return result.data['filesUrl'];
}
/// 11、创建订单
///
static Future <PayOrderModel> createOrder({
required String bookIdsList,
required String totalPrice,
required String couponRecId,
required String integral,
required String type
}) async {
final result = await HttpService.to.post(
'/v1/orders/Orders/createOrders',
params: {
'book_ids_list':bookIdsList,
'total_price':totalPrice,
'coupon_rec_id':couponRecId,
'integral':integral,
'type':type,
},
);
if (result.data is! Map) return PayOrderModel();
return PayOrderModel.fromJson(result.data);
}
}
\ No newline at end of file
......@@ -141,5 +141,49 @@ abstract class LibraryAPI {
return ReportModel.fromJson(result.data);
}
/// 7、阅读页的笔记列表
///
static Future<List<NoteModel>> noteList(
{int page = 1,
int limit = 10,
required String bookId,
required String chapterId}) async {
final result = await HttpService.to.post(
'/v1/book/Information/getChapterNotesList',
params: {
'page': page,
'page_size': limit,
'book_id': bookId,
'chapter_id': chapterId
},
);
if (result.data is! Map && result.data['list'] is! List) return [];
return List.generate(result.data['list'].length, (index) {
return NoteModel.fromJson(result.data['list'][index]);
});
}
/// 8、笔记详情列表
///
static Future<List<DiscussModel>> discussList(
{int page = 1,
int limit = 10,
required String bookId,
required String chapterId}) async {
final result = await HttpService.to.post(
'/v1/book/Information/getChapterCommentList',
params: {
'page': page,
'page_size': limit,
'book_id': bookId,
'chapter_id': chapterId
},
);
if (result.data is! Map && result.data['list'] is! List) return [];
return List.generate(result.data['list'].length, (index) {
return DiscussModel.fromJson(result.data['list'][index]);
});
}
}
\ No newline at end of file
......@@ -109,5 +109,45 @@ abstract class ShopAPI {
return CouponNumModel.fromJson(result.data);
}
/// 8、创建订单
///
static Future <PayOrderModel> createOrder({
required String bookIdsList,
required String totalPrice,
required String couponRecId,
required String integral,
required String type
}) async {
final result = await HttpService.to.post(
'/v1/orders/Orders/createOrders',
params: {
'book_ids_list':bookIdsList,
'total_price':totalPrice,
'coupon_rec_id':couponRecId,
'integral':integral,
'type':type,
},
);
if (result.data is! Map) return PayOrderModel();
return PayOrderModel.fromJson(result.data);
}
/// 9、获取订单状态
static Future <bool> orderStatus({
required String orderNumber,
}) async {
final result = await HttpService.to.post(
'/v1/orders/Orders/getOrdersStatus',
params: {
'ordersnum':orderNumber,
},
);
if (result.data is Map && result.data['pay_success'] == 1){
return true;
}
return false;
}
}
\ No newline at end of file
......@@ -27,6 +27,10 @@ class BookPayController extends GetxController {
PayModel(type: 3, name: '紫荆币', icon: 'assets/images/pay_coin.png', selected: false),
];
// 支付宝
Tobias tobias = Tobias();
Fluwx fluwx = Fluwx();
// 时候展示底部视图
bool showDetail = false;
......@@ -137,6 +141,8 @@ class BookPayController extends GetxController {
/// 创建订单
void createOrder() async {
fluwx.registerApi(appId: "wxd930ea5d5a228f5f",universalLink: "https://your.univerallink.com/link/");
List<Map<String, dynamic>> bookIdsList = [];
for (CourseModel model in buy){
Map<String, dynamic> tempMap = {
......@@ -148,11 +154,30 @@ class BookPayController extends GetxController {
}
// 书豆支付的话先判断书豆数量
if (payModel.type == 3){
if (finalPrice.toDouble() > double.parse(showModel.membersBean.toString())){
Toast.show('紫金币不足,请先充值紫荆币');
return;
}
final result = await CommonAPI.createOrder(
}
// 支付宝
if (payModel.type == 2){
final result = await tobias.isAliPayInstalled;
if(!result){
Toast.show('请先安装支付宝');
return;
}
}
// 微信
if (payModel.type ==1){
final result = await fluwx.isWeChatInstalled;
if(!result){
Toast.show('请先安装微信');
return;
}
}
final result = await ShopAPI.createOrder(
bookIdsList:jsonEncode(bookIdsList) ,
totalPrice: finalPrice.toString(),
couponRecId: useCouponModel.couponRecId.toString(),
......@@ -164,26 +189,72 @@ class BookPayController extends GetxController {
// 微信
if(payModel.type == 1){
String orderNumber = payOrderModel.ordersnum.toString();
//TODO: 拿到订单编号进行微信支付操作
requestWechat();
}
// 支付宝
else if(payModel.type == 2){
String orderNumber = payOrderModel.ordersnum.toString();
//TODO: 拿到订单编号进行支付宝支付操作
requestAliPay();
}
// 书豆
else if (payModel.type == 3){
if(payOrderModel.code == -1){
Toast.show('紫金币不足,请先充值紫荆币');
return;
}
String orderNumber = payOrderModel.ordersnum.toString();
//TODO: 拿到订单编号进行后续操作
}
}
// 支付宝支付
void requestAliPay(){
print('================================================================${payOrderModel.encryptionOrder!}');
tobias.pay(payOrderModel.encryptionOrder!).then((payResult){
if (payResult['resultStatus'] == '9000') {
requestOrderStatus();
} else {
Toast.show(payResult['memo'].toString());
}
});
}
// 微信支付
void requestWechat(){
Payment payment = Payment(
appId: payOrderModel.appid??'',
partnerId: payOrderModel.partnerid??'',
prepayId: payOrderModel.prepayid??'',
packageValue: payOrderModel.package??'',
nonceStr: payOrderModel.noncestr??'',
timestamp: payOrderModel.timestamp!.toInt(),
sign: payOrderModel.sign??''
);
fluwx.pay(which: payment);
fluwx.addSubscriber((response) {
if (response.errCode == 0) {
requestOrderStatus();
}
else{
Toast.show('${response.errStr}');
}
});
}
void requestOrderStatus() async {
final result = await ShopAPI.orderStatus(orderNumber: payOrderModel.ordersnum??'');
if (result){
Toast.show('订单支付完成');
}
}
}
\ No newline at end of file
......@@ -10,8 +10,10 @@ import 'package:flutter_book/apis/index.dart';
import 'package:flutter_book/theme.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_slidable/flutter_slidable.dart';
import 'package:fluwx/fluwx.dart';
import 'package:get/get.dart';
import 'package:go_router/go_router.dart';
import 'package:tobias/tobias.dart';
import '../../models/index.dart';
import '../../routes/index.dart';
......
......@@ -87,10 +87,10 @@ class LoginController extends GetxController {
// 定时器回调
});
/// 测试账号
if (kDebugMode) {
phoneInput.text = '13521054068';
passwordInput.text = '123456';
}
// if (kDebugMode) {
// phoneInput.text = '13521054068';
// passwordInput.text = '123456';
// }
super.onInit();
}
......
......@@ -31,7 +31,7 @@ class _SplashPageState extends State<SplashPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
// extendBodyBehindAppBar: true,
extendBodyBehindAppBar: true,
appBar: AppBar(),
body: const Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
......
......@@ -12,7 +12,7 @@ class BuildItem extends StatelessWidget {
return Container(
margin: EdgeInsets.only(left: 10.w,right: 10.w,top:10.w),
padding: const EdgeInsets.symmetric(horizontal: 10,vertical: 10),
height: 75.w,
// height: 75.w,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8.w),
color: Colors.white
......
part of web;
class ReadController extends FullLifeCycleController with GetSingleTickerProviderStateMixin{
// 目录
List <ChapterModel> chapters = [];
// late final PageController pageController;
//
// //默认显示
// int currentPage = 1;
late AnimationController _controller;
bool _show = false;
bool _show = true;
bool get show => _show;
void setShow(bool value) {
......@@ -15,7 +25,7 @@ class ReadController extends FullLifeCycleController with GetSingleTickerProvide
}
else {
/// 不显示状态栏
SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky);
// SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky);
/// 收回动画
_controller.reverse();
}
......@@ -28,8 +38,10 @@ class ReadController extends FullLifeCycleController with GetSingleTickerProvide
@override
void onInit() {
// pageController = PageController(initialPage: currentPage);
/// 默认不显示状态栏
SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky);
// SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky);
/// 初始化
_controller = AnimationController(
vsync: this,
......@@ -38,12 +50,24 @@ class ReadController extends FullLifeCycleController with GetSingleTickerProvide
super.onInit();
}
@override
void onReady() {
_getChapters();
super.onReady();
}
@override
void onClose() {
_controller.dispose();
super.onClose();
}
void onPageChanged(int page) {
// currentPage = page;
update(['navigation']);
}
void onResumed(){
print('onResumed');
}
......@@ -56,4 +80,12 @@ class ReadController extends FullLifeCycleController with GetSingleTickerProvide
void onDetached(){
print('onDetached');
}
/// 获取目录信息
void _getChapters() async {
chapters = await LibraryAPI.chapters(bookId: '110');
update();
}
}
\ No newline at end of file
part of web;
class DiscussController extends GetxController {
List<DiscussModel> discuss = [];
final EasyRefreshController refreshController = EasyRefreshController(
controlFinishLoad: true,
controlFinishRefresh: true,
);
final int _limit = 10;
int _page = 1;
bool _noMore = false;
@override
void onReady() {
onRefresh();
super.onReady();
}
@override
void onClose() {
refreshController.dispose();
super.onClose();
}
/// 获取讨论详情
Future<void> _getDiscuss([bool isRefresh = false]) async {
if (isRefresh) _page = 1;
// 网路请求
final result = await LibraryAPI.discussList(
page: _page,
limit: _limit,
bookId: '110',
chapterId: '1'
);
// 如果是刷新 清理数据
if (isRefresh) discuss.clear();
discuss.addAll(result);
_page ++;
_noMore = result.length < _limit;
update();
}
void onRefresh() async {
try {
await _getDiscuss(true);
refreshController.finishRefresh(IndicatorResult.success);
refreshController.resetFooter();
} catch (error) {
refreshController.finishRefresh(IndicatorResult.fail);
}
}
void onLoading() async {
if (_noMore) {
refreshController.finishLoad(IndicatorResult.noMore);
return;
}
try {
await _getDiscuss();
refreshController.finishLoad();
} catch (error) {
refreshController.finishLoad(IndicatorResult.fail);
}
}
}
\ No newline at end of file
library web;
import 'package:easy_refresh/easy_refresh.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:flutter_book/utils/index.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import '../../apis/index.dart';
import '../../models/index.dart';
import '../../widgets/index.dart';
import '../book_category/index.dart';
import '../user_discuss_des/index.dart';
import '../user_notes_des/index.dart';
part 'view.dart';
part 'controller.dart';
part 'widgets/category.dart';
part 'widgets/discuss.dart';
part 'widgets/note.dart';
part 'widgets/book.dart';
part 'note_controller.dart';
part 'discuss_controller.dart';
part of web;
class NoteController extends GetxController {
List<NoteModel> notes = [];
final EasyRefreshController refreshController = EasyRefreshController(
controlFinishLoad: true,
controlFinishRefresh: true,
);
final int _limit = 10;
int _page = 1;
bool _noMore = false;
@override
void onReady() {
onRefresh();
super.onReady();
}
@override
void onClose() {
refreshController.dispose();
super.onClose();
}
/// 获取笔记列表
Future<void> _getNotes([bool isRefresh = false]) async {
if (isRefresh) _page = 1;
// 网路请求
final result = await LibraryAPI.noteList(
page: _page,
limit: _limit,
bookId: '110',
chapterId: '1'
);
// 如果是刷新 清理数据
if (isRefresh) notes.clear();
notes.addAll(result);
_page ++;
_noMore = result.length < _limit;
update();
}
void onRefresh() async {
try {
await _getNotes(true);
refreshController.finishRefresh(IndicatorResult.success);
refreshController.resetFooter();
} catch (error) {
refreshController.finishRefresh(IndicatorResult.fail);
}
}
void onLoading() async {
if (_noMore) {
refreshController.finishLoad(IndicatorResult.noMore);
return;
}
try {
await _getNotes();
refreshController.finishLoad();
} catch (error) {
refreshController.finishLoad(IndicatorResult.fail);
}
}
}
\ No newline at end of file
......@@ -8,6 +8,8 @@ class ReadPage extends StatefulWidget {
}
class _ReadPageState extends State<ReadPage> {
int currentIndex = 0;
final GlobalKey webViewKey = GlobalKey();
InAppWebViewController? webViewController;
late ContextMenu contextMenu;
......@@ -20,7 +22,7 @@ class _ReadPageState extends State<ReadPage> {
return GetBuilder<ReadController>(
init: ReadController(),
builder: (readController) => Scaffold(
appBar: AppBar(title:const Text('阅读'),),
body: Container(
color: Colors.white,
child: Stack(
......@@ -37,61 +39,6 @@ class _ReadPageState extends State<ReadPage> {
onWebViewCreated: (InAppWebViewController controller) {
webViewController = controller;
},
// onLoadError: (InAppWebViewController controller, Uri url, int code ,String msg){
//
// },
contextMenu: ContextMenu(
menuItems: [
ContextMenuItem(title: '划线',androidId: 1,iosId: '1',action: (){
const snackBar = SnackBar(
content: Text("划线"),
duration: Duration(seconds: 1),
);
ScaffoldMessenger.of(context).showSnackBar(snackBar);
}),
ContextMenuItem(title: '提问',androidId: 2,iosId: '2',action: (){
}),
ContextMenuItem(title: '笔记',androidId: 3,iosId: '3',action: (){
}),
],
onCreateContextMenu: (hitTestResult) async {
String selectedText = await webViewController?.getSelectedText() ?? "";
final snackBar = SnackBar(
content: Text(
"Selected text: '$selectedText', of type: ${hitTestResult.type.toString()}"),
duration: const Duration(seconds: 1),
);
ScaffoldMessenger.of(context).showSnackBar(snackBar);
},
// options: ContextMenuOptions(
// hideDefaultSystemContextMenuItems: true,
// ),
onContextMenuActionItemClicked: (ContextMenuItem menuItem) async {
final snackBar = SnackBar(
content: Text(
"Menu item with ID ${menuItem.iosId} and title '${menuItem.title}' clicked!"),
duration: const Duration(seconds: 1),
);
ScaffoldMessenger.of(context).showSnackBar(snackBar);
// switch (item.title){
// case '划线':
// Console.log('----------划线-----------');
// break;
// case '提问':
// Console.log('----------提问-----------');
// break;
// case '笔记':
// Console.log('----------笔记-----------');
// break;
//
// }
}
),
onLoadStop: (controller, url) {
controller.addJavaScriptHandler(handlerName: 'onTap', callback: (args){
readController.setShow(readController.show);
......@@ -117,17 +64,61 @@ class _ReadPageState extends State<ReadPage> {
child: Text('top View'),
),
),
Positioned(
left: 0,
right: 0,
top: 0,
bottom: 49 + MediaQuery.of(context).viewInsets.bottom,
child: _showContent(readController,currentIndex)
),
AnimatedPositioned(
duration: readController.controller.duration!,
curve: Curves.easeInOut,
bottom: readController.show ? 0 : -100, // 负值隐藏,0 显示
bottom: readController.show ? 0 : -49 - MediaQuery.of(context).viewInsets.bottom, // 负值隐藏,0 显示
left: 0,
right: 0,
height: 100,
height: 49,
child: Container(
color: Colors.limeAccent,
alignment: Alignment.center,
child: Text('Bottom View'),
child: BottomNavigationBar(
currentIndex: currentIndex,
onTap: (index){
setState(() {
currentIndex = index;
});
// _showBottomSheet(context, index);
},
items: [
BottomNavigationBarItem(
label: '目录',
icon: Image.asset(
'assets/images/category_unselect.png',
),
activeIcon: Image.asset(
'assets/images/category_select.png',
),
),
BottomNavigationBarItem(
label: '笔记',
icon: Image.asset(
'assets/images/note_unselect.png',
),
activeIcon: Image.asset(
'assets/images/note_select.png',
)
),
BottomNavigationBarItem(
label: '讨论',
icon: Image.asset(
'assets/images/discuss_unselect.png',
),
activeIcon: Image.asset(
'assets/images/discuss_select.png',
)
),
],
)
),
),
......@@ -138,4 +129,52 @@ class _ReadPageState extends State<ReadPage> {
);
}
Widget _showContent(ReadController controller,int index) {
print('++++++++++++++++++++++++$index');
if (controller.show){
if (index == 0){
return Container(
color: 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: ReadCategoryPage(controller: controller,),
),
),
// child: ReadCategoryPage(),
);
}
else if (index == 1){
return Container(
color: Color(0xFF000000).withOpacity(0.5),
padding: EdgeInsets.only(top: MediaQuery.of(context).size.height * 0.2),
child: ClipRRect(
borderRadius: BorderRadius.only(topRight: Radius.circular(8.w),topLeft: Radius.circular(8.w)),
child: Container(
color: Colors.white,
child: ReadNotePage(),
),
),
// child: ReadCategoryPage(),
);
}
else if (index == 2){
return Container(
color: Color(0xFF000000).withOpacity(0.5),
padding: EdgeInsets.only(top: MediaQuery.of(context).size.height * 0.2),
child: ClipRRect(
borderRadius: BorderRadius.only(topRight: Radius.circular(8.w),topLeft: Radius.circular(8.w)),
child: Container(
color: Colors.white,
child: ReadNotePage(),
),
),
// child: ReadCategoryPage(),
);
}
}
return const SizedBox();
}
}
part of web;
class BuildBook extends StatelessWidget {
const BuildBook({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
padding: EdgeInsets.symmetric(horizontal: 15.w),
child: Column(
children: [
Container(
padding: EdgeInsets.only(top: 12.w,bottom: 15.w),
// color: Colors.red,
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
CustomCard(
width: 72.w,
height: 86.w,
url: '',
),
Container(
height: 87.w,
margin: EdgeInsets.only(left: 13.w),
// color: Colors.green,
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('书名',style: TextStyle(fontSize: 14.w,height: 1.5,fontWeight: Fonts.medium,color: Colours.c3),),
Text('作者',style: TextStyle(fontSize: 12.w,height: 1.5,color: Colours.c6),),
],
),
],
),
)
],
),
)
],
),
);
}
}
part of web;
class ReadCategoryPage extends StatefulWidget {
final ReadController controller;
const ReadCategoryPage({
Key? key,
required this.controller,
}) : super(key: key);
@override
State<ReadCategoryPage> createState() => _ReadCategoryPageState();
}
class _ReadCategoryPageState extends State<ReadCategoryPage> {
late TextEditingController searchController = TextEditingController();
@override
Widget build(BuildContext context) {
return Scaffold(
resizeToAvoidBottomInset: false,
body: Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Container(
margin: EdgeInsets.only(left: 15.w,right: 15.w,top: 15.w,bottom: 15.w),
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: '请输入书籍名称',
onTap: () {
// context.pushNamed(Routes.msgs);
},
onEditingComplete: () {
},
),
),
),
BuildBook(),
// Expanded(
// child: ListView.builder(
// itemBuilder:(BuildContext context, int index){
// return BuildItem(model: widget.controller.chapters[index],);
// },
// itemCount: widget.controller.chapters.length,
// ),
// ),
],
),
);
}
}
part of web;
class ReadDiscussPage extends StatefulWidget {
const ReadDiscussPage({Key? key}) : super(key: key);
@override
State<ReadDiscussPage> createState() => _ReadDiscussPageState();
}
class _ReadDiscussPageState extends State<ReadDiscussPage> {
late TextEditingController searchController = TextEditingController();
@override
Widget build(BuildContext context) {
return GetBuilder<DiscussController>(
init: DiscussController(),
builder:(controller) => Scaffold(
resizeToAvoidBottomInset: false,
body: Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Container(
margin: EdgeInsets.only(left: 15.w,right: 15.w,top: 15.w,bottom: 15.w),
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: '请输入书籍名称',
onTap: () {
// context.pushNamed(Routes.msgs);
},
onEditingComplete: () {
},
),
),
),
BuildBook(),
ListView.builder(
itemBuilder: (BuildContext context,int index){
DiscussModel model = controller.discuss[index];
return BuildDiscuss(model: model,);
},
itemCount: controller.discuss.length,
)
],
),
),
);
}
}
part of web;
class ReadNotePage extends StatefulWidget {
const ReadNotePage({Key? key}) : super(key: key);
@override
State<ReadNotePage> createState() => _ReadNotePageState();
}
class _ReadNotePageState extends State<ReadNotePage> {
late TextEditingController searchController = TextEditingController();
@override
Widget build(BuildContext context) {
return GetBuilder<NoteController>(
init: NoteController(),
builder:(controller) =>Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Container(
margin: EdgeInsets.only(left: 15.w,right: 15.w,top: 15.w,bottom: 15.w),
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: '请输入书籍名称',
onTap: () {
// context.pushNamed(Routes.msgs);
},
onEditingComplete: () {
},
),
),
),
BuildBook(),
Expanded(
child: ListView.builder(
itemBuilder: (BuildContext context,int index){
NoteModel model = controller.notes[index];
// 划线
if(model.types == 1){
return BuildLine(model: model,);
}
// 高亮
else if(model.types == 2){
return BuildHigh(model: model,);
}
// 笔记
else if(model.types == 3){
return BuildNote(model: model,);
}
},
itemCount: controller.notes.length,
),
),
],
),
);
}
}
差异被折叠。
......@@ -99,6 +99,8 @@ dependencies:
flutter_app_update: ^3.0.4
# 能指定滑动位置的listView
azlistview: ^2.0.0
# 支付宝
tobias: ^3.3.0
dev_dependencies:
flutter_test:
......@@ -151,3 +153,5 @@ flutter:
#
# For details regarding fonts from package dependencies,
# see https://flutter.dev/custom-fonts/#from-packages
tobias:
url_scheme: zijingbook
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论