提交 5bc2bb0c authored 作者: maodou's avatar maodou

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

# Conflicts: # lib/routes/routes.dart
......@@ -14,7 +14,7 @@
</queries>
<application
android:label="紫荆云书"
android:label="紫荆数智学堂"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher">
<activity
......
......@@ -479,7 +479,7 @@
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = "紫荆云书";
INFOPLIST_KEY_CFBundleDisplayName = "紫荆数智学堂";
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.books";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
......@@ -646,7 +646,7 @@
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = "紫荆云书";
INFOPLIST_KEY_CFBundleDisplayName = "紫荆数智学堂";
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.books";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
......@@ -666,7 +666,7 @@
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = "紫荆云书";
INFOPLIST_KEY_CFBundleDisplayName = "紫荆数智学堂";
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.books";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
......
......@@ -204,5 +204,54 @@ abstract class MineAPI {
return false;
}
/// 12、笔记详情列表
///
static Future <List<NoteModel>> noteList({
int page = 1,
int limit = 10,
required String bookId,
required String types
}) async {
final result = await HttpService.to.post(
'/v1/members/Information/myBookNotes',
params: {
'page': page,
'page_size': limit,
'book_id':bookId,
'types': types
},
);
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]);
});
}
/// 12、笔记详情列表
///
static Future <List<DiscussModel>> discussList({
int page = 1,
int limit = 10,
required String bookId,
required String types
}) async {
final result = await HttpService.to.post(
'/v1/members/Information/myBookComment',
params: {
'page': page,
'page_size': limit,
'book_id':bookId,
'types': types
},
);
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
......@@ -40,7 +40,7 @@ class MyApp extends StatelessWidget {
builder: (context, child) => GetBuilder<ConfigStore>(
builder: (config) => MaterialApp.router(
debugShowCheckedModeBanner: false,
title: '紫荆云书',
title: '紫荆数智学堂',
theme: AppTheme.light,
darkTheme: AppTheme.dark,
themeMode: ThemeMode.light,
......
......@@ -205,7 +205,7 @@ class VersionModel {
}
/// 用户信息模型
class UserInfoModel {
UserInfoModel({
this.name,
......@@ -308,3 +308,182 @@ class UserInfoModel {
}
}
/// 笔记详情模型
class NoteModel {
NoteModel({
this.types,
this.chapterId,
this.content,
this.positioning,
this.noteContent,
this.color,
this.chapterName,});
NoteModel.fromJson(dynamic json) {
types = json['types'];
chapterId = json['chapter_id'];
content = json['content'];
positioning = json['positioning'];
noteContent = json['note_content'];
color = json['color'];
chapterName = json['chapter_name'];
}
num? types;
num? chapterId;
String? content;
String? positioning;
String? noteContent;
String? color;
String? chapterName;
NoteModel copyWith({ num? types,
num? chapterId,
String? content,
String? positioning,
String? noteContent,
String? color,
String? chapterName,
}) => NoteModel( types: types ?? this.types,
chapterId: chapterId ?? this.chapterId,
content: content ?? this.content,
positioning: positioning ?? this.positioning,
noteContent: noteContent ?? this.noteContent,
color: color ?? this.color,
chapterName: chapterName ?? this.chapterName,
);
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['types'] = types;
map['chapter_id'] = chapterId;
map['content'] = content;
map['positioning'] = positioning;
map['note_content'] = noteContent;
map['color'] = color;
map['chapter_name'] = chapterName;
return map;
}
}
/// 讨论模型
class DiscussModel {
DiscussModel({
this.id,
this.chapterId,
this.chapterName,
this.content,
this.quoteContent,
this.title,
this.replyId,
this.personType,
this.personId,
this.goodNum,
this.replyNum,
this.createTime,
this.replacePersonName,
this.replacePersonPic,
this.personName,
this.commentAll,
this.personPic,});
DiscussModel.fromJson(dynamic json) {
id = json['id'];
chapterId = json['chapter_id'];
chapterName = json['chapter_name'];
content = json['content'];
quoteContent = json['quote_content'];
title = json['title'];
replyId = json['reply_id'];
personType = json['person_type'];
personId = json['person_id'];
goodNum = json['good_num'];
replyNum = json['reply_num'];
createTime = json['create_time'];
replacePersonName = json['replace_person_name'];
replacePersonPic = json['replace_person_pic'];
personName = json['person_name'];
personPic = json['person_pic'];
if (json['comment_all'] != null) {
commentAll = [];
json['comment_all'].forEach((v) {
commentAll?.add(DiscussModel.fromJson(v));
});
}
}
num? id;
num? chapterId;
String? chapterName;
String? content;
String? quoteContent;
String? title;
num? replyId;
num? personType;
num? personId;
num? goodNum;
num? replyNum;
String? createTime;
String? replacePersonName;
String? replacePersonPic;
String? personName;
String? personPic;
List<DiscussModel>? commentAll;
DiscussModel copyWith({ num? id,
num? chapterId,
String? chapterName,
String? content,
String? quoteContent,
String? title,
num? replyId,
num? personType,
num? personId,
num? goodNum,
num? replyNum,
String? createTime,
String? replacePersonName,
String? replacePersonPic,
String? personName,
String? personPic,
List<DiscussModel>? commentAll,
}) => DiscussModel( id: id ?? this.id,
chapterId: chapterId ?? this.chapterId,
chapterName: chapterName ?? this.chapterName,
content: content ?? this.content,
quoteContent: quoteContent ?? this.quoteContent,
title: title ?? this.title,
replyId: replyId ?? this.replyId,
personType: personType ?? this.personType,
personId: personId ?? this.personId,
goodNum: goodNum ?? this.goodNum,
replyNum: replyNum ?? this.replyNum,
createTime: createTime ?? this.createTime,
replacePersonName: replacePersonName ?? this.replacePersonName,
replacePersonPic: replacePersonPic ?? this.replacePersonPic,
personName: personName ?? this.personName,
personPic: personPic ?? this.personPic,
commentAll: commentAll ?? this.commentAll,
);
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['id'] = id;
map['chapter_id'] = chapterId;
map['chapter_name'] = chapterName;
map['content'] = content;
map['quote_content'] = quoteContent;
map['title'] = title;
map['reply_id'] = replyId;
map['person_type'] = personType;
map['person_id'] = personId;
map['good_num'] = goodNum;
map['reply_num'] = replyNum;
map['create_time'] = createTime;
map['replace_person_name'] = replacePersonName;
map['replace_person_pic'] = replacePersonPic;
map['person_name'] = personName;
map['person_pic'] = personPic;
if (commentAll != null) {
map['comment_all'] = commentAll?.map((v) => v.toJson()).toList();
}
return map;
}
}
\ No newline at end of file
......@@ -51,7 +51,7 @@ class MineController extends GetxController {
ReadModel(name: '优惠券',value: userInfo.couponNums.toString(),link: Routes.coupon,icon: 'assets/images/coupon.png'),
ReadModel(name: '积分',value: userInfo.integralNums.toString(),link: Routes.point,icon: 'assets/images/point.png'),
ReadModel(name: '紫金币',value: userInfo.beanNums.toString(),link: Routes.coin,icon: 'assets/images/coin.png'),
ReadModel(name: '订单',value: userInfo.ordersNums.toString(),icon: 'assets/images/order.png')
ReadModel(name: '订单',value: userInfo.ordersNums.toString(),link: Routes.orderEvaluate,icon: 'assets/images/order.png')
];
update();
}
......
library order_evaluate;
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_star/custom_rating.dart';
import 'package:flutter_star/star.dart';
import '../../theme.dart';
import '../../utils/index.dart';
import '../../widgets/index.dart';
part 'view.dart';
\ No newline at end of file
part of order_evaluate;
class OrderEvaluatePage extends StatefulWidget {
const OrderEvaluatePage({Key? key}) : super(key: key);
@override
State<OrderEvaluatePage> createState() => _OrderEvaluatePageState();
}
class _OrderEvaluatePageState extends State<OrderEvaluatePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
centerTitle: true,
title: const Text('订单评价'),
),
body: Column(
children: [
Container(
margin: const EdgeInsets.all(10),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
color: const Color(0xFFF9F9F9),
boxShadow: [
BoxShadow(
color: const Color(0xFFC7C7C7).withOpacity(0.5),
offset: const Offset(3, 0),
blurRadius: 7.w,
spreadRadius: 0.w,
),
],
),
child: ClipRRect(
borderRadius: BorderRadius.circular(8),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
// 图书容器
Container(
color: Colours.cF8,
padding: EdgeInsets.symmetric(horizontal: 11,vertical: 12),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: 71,
height: 86,
color: Colors.cyan,
),
Gaps.hGaps10,
Text('一想到还有95%的问题留给人类,我就放',style: TextStyle(fontSize: 13,height: 1.5,fontWeight: Fonts.medium,color: Colours.c3),maxLines: 2,overflow: TextOverflow.ellipsis,)
],
),
),
// 评价容器
Container(
padding: const EdgeInsets.symmetric(vertical: 15),
width: double.infinity,
height: 160,
color: Colors.white,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Container(
padding: const EdgeInsets.only(left: 10),
child: const Text('评分'),
),
Gaps.hGaps20,
AbsorbPointer(
absorbing: false,
child: CustomRating(
max: 5,
score:0 ,
star: const Star(
fat: 0.5,
progress: 7,
fillColor: AppTheme.primary,
size: 16,
emptyColor: Colours.cE2,
), onRating: (double ) {},
),
),
],
),
Container(
// color: Colors.red,
child: const CustomInput(
decoration: InputDecoration(
focusedBorder: InputBorder.none,
border: InputBorder.none,
enabledBorder: InputBorder.none,
errorBorder: InputBorder.none,
fillColor:Colors.white,
hintStyle: TextStyle(fontSize: 14,height: 1.5,color: Colours.c6)
),
maxLines: 5,
hintText: '请简要描述',
),
),
],
),
),
],
),
),
),
const SizedBox(height: 50,),
Container(
margin: const EdgeInsets.symmetric(horizontal: 10),
child: CustomGradientButton(
text: '提交评价',
isEnabled: false,
onPressed: () {
print('11111111111111111');
},
),
)
],
),
);
}
}
......@@ -43,7 +43,7 @@ class _SplashPageState extends State<SplashPage> {
url: 'assets/images/logo.png',
fit: BoxFit.contain,
),
title: Text('云书'),
title: Text('紫荆数智学堂'),
),
)
),
......
......@@ -24,8 +24,8 @@ class AboutPage extends StatelessWidget {
child: const CustomImage.asset(url: 'assets/images/banner.png'),
),
Gaps.hGaps15,
const Text('云教材',style: TextStyle(fontSize: 17,fontWeight: Fonts.medium,color: Colours.c3),),
const Text('V1.0.1',style: TextStyle(fontSize: 13,color: Colours.c9)),
const Text('紫荆数智学堂',style: TextStyle(fontSize: 17,fontWeight: Fonts.medium,color: Colours.c3),),
const Text('V1.0.0',style: TextStyle(fontSize: 13,color: Colours.c9)),
],
),
SafeArea(
......
......@@ -13,6 +13,13 @@ class UserDiscussController extends GetxController {
int _page = 1;
bool _noMore = false;
@override
void onReady() {
onRefresh();
super.onReady();
}
@override
void onClose() {
refreshController.dispose();
......@@ -29,7 +36,6 @@ class UserDiscussController extends GetxController {
);
// 如果是刷新 清理数据
if (isRefresh) discuss.clear();
discuss.addAll(_test());
discuss.addAll(result);
_page ++;
_noMore = result.length < _limit;
......
......@@ -8,8 +8,10 @@ import 'package:flutter_book/theme.dart';
import 'package:flutter_book/widgets/index.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:go_router/go_router.dart';
import '../../models/index.dart';
import '../../routes/index.dart';
import '../../utils/index.dart';
......
......@@ -18,10 +18,10 @@ class _UserDiscussPageState extends State<UserDiscussPage> {
title: const Text('讨论'),
),
body: Container(
color: Colors.white,
color: Colors.transparent,
child: CustomPullScrollView(
controller: controller.refreshController,
onRefresh: controller.onRefresh,
// onRefresh: controller.onRefresh,
onLoading: controller.onLoading,
child:SingleChildScrollView(
child: Container(
......@@ -42,7 +42,12 @@ class _UserDiscussPageState extends State<UserDiscussPage> {
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemBuilder: (BuildContext context, int index){
return BuildItem(model: controller.discuss[index],index: index,num: controller.discuss.length,);
return GestureDetector(
onTap: (){
context.pushNamed(Routes.discussDes,extra: controller.discuss[index]);
},
child: BuildItem(model: controller.discuss[index],index: index,num: controller.discuss.length,)
);
},
itemCount: controller.discuss.length,
),
......
......@@ -14,6 +14,7 @@ class BuildItem extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
color: Colors.transparent,
// margin: const EdgeInsets.symmetric(horizontal: 10),
padding: const EdgeInsets.symmetric(horizontal: 10),
// color: Colors.red,
......
part of user_discuss_des;
class UserDiscussDesController extends GetxController {
final String tag;
final CourseModel model;
UserDiscussDesController(this.tag,this.model);
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 MineAPI.discussList(
page: _page,
limit: _limit,
bookId: model.bookId.toString(),
types: tag
);
// 如果是刷新 清理数据
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 user_discuss_des;
import 'package:easy_refresh/easy_refresh.dart';
import 'package:flutter/material.dart';
import 'package:flutter_book/widgets/index.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import '../../apis/index.dart';
import '../../models/index.dart';
import '../../theme.dart';
import '../../utils/index.dart';
part 'view.dart';
part 'controller.dart';
part 'widgets/list.dart';
part 'widgets/discuss.dart';
part 'widgets/item.dart';
part of user_discuss_des;
class UserDiscussDesPage extends StatefulWidget {
final CourseModel model;
const UserDiscussDesPage({
Key? key,
required this.model
}) : super(key: key);
@override
State<UserDiscussDesPage> createState() => _UserDiscussDesPageState();
}
class _UserDiscussDesPageState extends State<UserDiscussDesPage> {
List<Tab> tabs = [
const Tab(text: '全部',),
const Tab(text: '发起',),
const Tab(text: '参与',),
];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
centerTitle: true,
title: const Text('讨论详情'),
),
body: DefaultTabController(
length: tabs.length,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
BuildItem(model: widget.model),
ClipRRect(
borderRadius:const BorderRadius.only(topLeft: Radius.circular(5),topRight: Radius.circular(5)),
child: Container(
width: double.infinity,
color: Colors.white,
height: 35,
child: TabBar(
indicator: UnderlineTabIndicator(
borderRadius: BorderRadius.circular(0.75),
borderSide: const BorderSide(width: 1.5,color: AppTheme.primary),
insets: const EdgeInsets.symmetric(horizontal: 22), // 设置标签下面指示器的水平内边距
),
labelPadding: const EdgeInsets.symmetric(horizontal: 20),
indicatorSize: TabBarIndicatorSize.label,
indicatorColor: AppTheme.primary,
indicatorWeight: 1.5,
labelStyle: const TextStyle(color: AppTheme.primary,fontSize: 15,height: 1.5,fontWeight: Fonts.medium),
unselectedLabelColor: Colours.c9,
unselectedLabelStyle: const TextStyle(color: Colours.c9,fontSize: 15,height: 1.5),
isScrollable: true,
tabs: tabs
),
),
),
Expanded(
child: TabBarView(
children: List.generate(tabs.length, (index){
return BuildListPage(tag:'$index',model:widget.model);
})
),
)
],
)
),
);
}
}
part of user_discuss_des;
class BuildDiscuss extends StatelessWidget {
final DiscussModel model;
const BuildDiscuss({
Key? key,
required this.model
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
margin: const EdgeInsets.only(left: 10,right: 10,top: 10),
padding: const EdgeInsets.all(10),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4),
color: Colors.white,
boxShadow: [
BoxShadow(
color: const Color(0xFFC7C7C7).withOpacity(0.5),
offset: const Offset(1.5, 0),
blurRadius: 7.w,
spreadRadius: 0.w,
),
],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
RichText(text: TextSpan(
children: [
const TextSpan(text: '话题:',style: TextStyle(
fontSize: 14,
height: 1.5,
color: Colours.c3,
)),
TextSpan(text: model.title,style: const TextStyle(
fontSize: 14,
height: 1.5,
color: Colours.c3,
fontWeight: Fonts.medium
)),
]
)),
Gaps.vGaps10,
Container(
height: 0.5,
color: Colours.cF2,
),
_buildItem(model),
Container(
margin:const EdgeInsets.only(left: 15),
child: _buildListView(model.commentAll != null ? model.commentAll!:[])
),
Gaps.vGaps13,
Container(
width: double.infinity,
padding: const EdgeInsets.symmetric(vertical: 5,horizontal: 10),
color: Colours.cF8,
child:Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(model.chapterName??'',style: const TextStyle(fontSize: 12,height: 1.5,color: Colours.c9),),
Text('内容:${model.quoteContent??''}',style: const TextStyle(fontSize: 12,height: 1.5,color: Colours.c9),),
],
)
)
],
),
);
}
Widget _buildItem(DiscussModel model,{int type =0}){
return Row(
children: [
ClipRRect(
borderRadius: BorderRadius.circular(17.5),
child: Container(
width: 35,
height: 35,
color: Colors.red,
child: CustomImage.network(url: model.personPic??''),
),
),
Expanded(
child: Container(
margin: const EdgeInsets.only(left: 10,top: 10),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
children: [
Text(model.personName??'',style: const TextStyle(fontSize: 12,height: 1.5,color: Colours.c9),),
Gaps.hGaps10,
type ==0?const SizedBox():const Text('发起人',style: TextStyle(fontSize: 11,height: 1.5,color: AppTheme.primary),)
],
),
Text(model.createTime??'',style: const TextStyle(fontSize: 12,height: 1.5,color: Colours.c9),)
],
),
Text(model.content??'',style: const TextStyle(fontSize: 13,height: 1.5,color: Colours.c3),),
Row(
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
SizedBox(
height: 15,
width: 15,
// color: Colors.green,
child: Image.asset('assets/images/love.png'),
),
Text(model.goodNum.toString(),style: const TextStyle(fontSize:12,height: 1.5,color: Colours.c9))
],
),
Gaps.hGaps15,
Row(
children: [
SizedBox(
height: 15,
width: 15,
// color: Colors.yellow,
child: Image.asset('assets/images/discuss_big.png'),
),
Text(model.replyNum.toString(),style: const TextStyle(fontSize:12,height: 1.5,color: Colours.c9))
],
)
],
)
],
),
),
)
],
);
}
Widget _buildListView(List<DiscussModel> data){
return ListView.builder(
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemBuilder: (BuildContext context,int index){
return _buildItem(data[index]);
},
itemCount: data.length,
);
}
}
part of user_discuss_des;
class BuildItem extends StatelessWidget {
final CourseModel model;
const BuildItem({
Key? key,
required this.model,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
margin: const EdgeInsets.all(10),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
color: Colors.white,
boxShadow: [
BoxShadow(
color: const Color(0xFFC7C7C7).withOpacity(0.5),
offset: const Offset(3, 0),
blurRadius: 10.w,
spreadRadius: 0.w,
),
],
),
padding: const EdgeInsets.symmetric(horizontal: 10),
child: Column(
children: [
Container(
padding: const EdgeInsets.only(top: 12,bottom: 15),
// color: Colors.red,
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
height: 87,
width: 73,
color: Colors.cyan,
),
Container(
height: 87,
margin: const EdgeInsets.only(left: 13),
// color: Colors.green,
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(model.bookName??'',style: const TextStyle(fontSize: 14,height: 1.5,fontWeight: Fonts.medium,color: Colours.c3),),
Text(model.authors??'',style: const TextStyle(fontSize: 12,height: 1.5,color: Colours.c6),),
],
),
Text('${model.commentNum.toString()}个讨论',style: const TextStyle(fontSize: 11,height: 1.5,color: AppTheme.primary)),
],
),
)
],
),
)
],
),
);
}
}
part of user_discuss_des;
class BuildListPage extends StatefulWidget {
final String tag;
final CourseModel model;
const BuildListPage({
Key? key,
required this.tag,
required this.model
}) : super(key: key);
@override
State<BuildListPage> createState() => _BuildListPageState();
}
class _BuildListPageState extends State<BuildListPage> with AutomaticKeepAliveClientMixin{
@override
Widget build(BuildContext context) {
return GetBuilder<UserDiscussDesController>(
tag: widget.tag,
init: UserDiscussDesController(widget.tag,widget.model),
builder: (controller) =>CustomPullScrollView(
controller: controller.refreshController,
onLoading: controller.onLoading,
child: ListView.builder(
itemBuilder: (BuildContext context,int index){
DiscussModel model = controller.discuss[index];
return BuildDiscuss(model: model,);
},
itemCount: controller.discuss.length,
),
),
);
}
@override
bool get wantKeepAlive => true;
}
......@@ -36,6 +36,8 @@ class _UserNotePageState extends State<UserNotePage> {
),
],
),
child: ClipRRect(
borderRadius: BorderRadius.circular(8),
child: ListView.builder(
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
......@@ -50,6 +52,7 @@ class _UserNotePageState extends State<UserNotePage> {
itemCount: controller.notes.length,
),
),
),
)
),
),
......
......@@ -2,8 +2,74 @@ part of user_notes_des;
class UserNotesDesController extends GetxController {
final String tag;
UserNotesDesController(this.tag);
final CourseModel model;
UserNotesDesController(this.tag,this.model);
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 MineAPI.noteList(
page: _page,
limit: _limit,
bookId: model.bookId.toString(),
types: tag
);
// 如果是刷新 清理数据
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);
}
}
......
library user_notes_des;
import 'package:easy_refresh/easy_refresh.dart';
import 'package:flutter/material.dart';
import 'package:flutter_book/widgets/index.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import '../../apis/index.dart';
import '../../models/index.dart';
import '../../theme.dart';
import '../../utils/index.dart';
......@@ -13,3 +16,6 @@ part 'view.dart';
part 'controller.dart';
part 'widgets/item.dart';
part 'widgets/list.dart';
part 'widgets/line.dart';
part 'widgets/note.dart';
part 'widgets/high.dart';
\ No newline at end of file
......@@ -60,7 +60,7 @@ class _UserNotesDesPageState extends State<UserNotesDesPage> {
Expanded(
child: TabBarView(
children: List.generate(tabs.length, (index){
return BuildListPage(tag:'$index');
return BuildListPage(tag:'$index',model:widget.model);
})
),
)
......
part of user_notes_des;
class BuildHigh extends StatelessWidget {
final NoteModel model;
const BuildHigh({
Key? key,
required this.model
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
margin: const EdgeInsets.only(left: 10,right: 10,top: 10),
padding: const EdgeInsets.all(10),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4),
color: Colors.white,
boxShadow: [
BoxShadow(
color: const Color(0xFFC7C7C7).withOpacity(0.5),
offset: const Offset(1.5, 0),
blurRadius: 7.w,
spreadRadius: 0.w,
),
],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(model.content??'',style: const TextStyle(
fontSize: 14,
height: 1.5,
color: Colors.red,
),),
Gaps.vGaps8,
Container(
width: double.infinity,
padding: const EdgeInsets.symmetric(vertical: 5,horizontal: 10),
color: Colours.cF8,
child: Text(model.chapterName??'',style: const TextStyle(fontSize: 12,height: 1.5,color: Colours.c9),),
)
],
),
);
}
}
part of user_notes_des;
class BuildLine extends StatelessWidget {
final NoteModel model;
const BuildLine({
Key? key,
required this.model
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
margin: const EdgeInsets.only(left: 10,right: 10,top: 10),
padding: const EdgeInsets.all(10),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4),
color: Colors.white,
boxShadow: [
BoxShadow(
color: const Color(0xFFC7C7C7).withOpacity(0.5),
offset: const Offset(1.5, 0),
blurRadius: 7.w,
spreadRadius: 0.w,
),
],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(model.content??'',style: const TextStyle(
fontSize: 14,
height: 1.5,
color: Colours.c3,
decoration: TextDecoration.underline,
decorationColor: Colors.red,
decorationThickness: 2
),),
Gaps.vGaps8,
Container(
width: double.infinity,
padding: const EdgeInsets.symmetric(vertical: 5,horizontal: 10),
color: Colours.cF8,
child: Text(model.chapterName??'',style: const TextStyle(fontSize: 12,height: 1.5,color: Colours.c9),),
)
],
),
);
}
}
......@@ -2,9 +2,11 @@ part of user_notes_des;
class BuildListPage extends StatefulWidget {
final String tag;
final CourseModel model;
const BuildListPage({
Key? key,
required this.tag
required this.tag,
required this.model
}) : super(key: key);
......@@ -12,21 +14,37 @@ class BuildListPage extends StatefulWidget {
State<BuildListPage> createState() => _BuildListPageState();
}
class _BuildListPageState extends State<BuildListPage> {
class _BuildListPageState extends State<BuildListPage> with AutomaticKeepAliveClientMixin{
@override
Widget build(BuildContext context) {
return GetBuilder<UserNotesDesController>(
tag: widget.tag,
init: UserNotesDesController(widget.tag),
builder: (controller) =>ListView.builder(
init: UserNotesDesController(widget.tag,widget.model),
builder: (controller) =>CustomPullScrollView(
controller: controller.refreshController,
onLoading: controller.onLoading,
child: ListView.builder(
itemBuilder: (BuildContext context,int index){
return Container(
height: 20,
color: Colors.red,
);
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: 3,
itemCount: controller.notes.length,
),
),
);
}
@override
bool get wantKeepAlive => true;
}
part of user_notes_des;
class BuildNote extends StatelessWidget {
final NoteModel model;
const BuildNote({
Key? key,
required this.model
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
margin: const EdgeInsets.only(left: 10,right: 10,top: 10),
padding: const EdgeInsets.all(10),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4),
color: Colors.white,
boxShadow: [
BoxShadow(
color: const Color(0xFFC7C7C7).withOpacity(0.5),
offset: const Offset(1.5, 0),
blurRadius: 7.w,
spreadRadius: 0.w,
),
],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('看来谁都不记得自己为何出现在此',style: TextStyle(
fontSize: 14,
height: 1.5,
color: Colors.red,
),),
Gaps.vGaps13,
_buildImageGridView(),
Gaps.vGaps13,
_buildAudioGridView(),
Gaps.vGaps13,
Container(
width: double.infinity,
padding: const EdgeInsets.symmetric(vertical: 5,horizontal: 10),
color: Colours.cF8,
child:Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(model.chapterName??'',style: const TextStyle(fontSize: 12,height: 1.5,color: Colours.c9),),
Text('内容:${model.content??''}',style: const TextStyle(fontSize: 12,height: 1.5,color: Colours.c9),),
],
)
)
],
),
);
}
// 图片
Widget _buildImageGridView(){
return GridView.builder(
// padding: const EdgeInsets.only(left: 13,top: 10),
physics: NeverScrollableScrollPhysics(),
shrinkWrap: true,
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 6,
crossAxisSpacing: 2,
mainAxisSpacing: 2,
childAspectRatio: 1
),
itemBuilder: (BuildContext context, int index) {
return Container(
color: Colors.red,
child: Center(child: Text('图片')),
);
},
itemCount: 3,
);
}
Widget _buildAudioGridView(){
return GridView.builder(
// padding: const EdgeInsets.only(left: 13,top: 10),
physics: NeverScrollableScrollPhysics(),
shrinkWrap: true,
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 6,
crossAxisSpacing: 2,
mainAxisSpacing: 2,
childAspectRatio: 1
),
itemBuilder: (BuildContext context, int index) {
return Container(
color: Colors.red,
child: Center(child: Text('音频')),
);
},
itemCount: 3,
);
}
}
......@@ -21,6 +21,7 @@ import 'package:flutter_book/pages/study_report/index.dart';
import 'package:flutter_book/pages/user_coin/index.dart';
import 'package:flutter_book/pages/user_coupon/index.dart';
import 'package:flutter_book/pages/user_discuss/index.dart';
import 'package:flutter_book/pages/user_discuss_des/index.dart';
import 'package:flutter_book/pages/user_feedback/index.dart';
import 'package:flutter_book/pages/user_gender/index.dart';
import 'package:flutter_book/pages/user_info/index.dart';
......@@ -38,6 +39,7 @@ import 'package:flutter_book/pages/web/index.dart';
import 'package:go_router/go_router.dart';
import '../models/index.dart';
import '../pages/order_evaluate/index.dart';
import '../pages/user_about/index.dart';
import '../pages/user_terms/index.dart';
import '../pages/version/index.dart';
......
......@@ -80,6 +80,8 @@ abstract class Routes {
static const wrong = 'wrong';
// 讨论
static const discuss = 'discuss';
// 讨论详情
static const discussDes = 'discuss_des';
// 优惠券
static const coupon = 'coupon';
// 账号安全
......@@ -90,6 +92,8 @@ abstract class Routes {
static const changePwd = 'change_pwd';
// 意见反馈
static const feedback = 'feedback';
// 订单评价
static const orderEvaluate= 'order_evaluate';
......@@ -218,7 +222,7 @@ abstract class Routes {
pageBuilder: (context, state) =>CupertinoPage(
name: state.uri.toString(),
key: state.pageKey,
child: UserNickPage(userInfo: state.extra as UserInfoModel,)
child: const UserNickPage()
)
),
GoRoute(
......@@ -406,7 +410,7 @@ abstract class Routes {
)
),
GoRoute(
path: '/$feedback', // 意见反馈
path: '/$feedback',
name: feedback,
pageBuilder: (context, state) =>CupertinoPage(
name: state.uri.toString(),
......@@ -432,6 +436,25 @@ abstract class Routes {
child: UserGenderPage(userInfo: state.extra as UserInfoModel,)
)
),
GoRoute(
path: '/$discussDes',
name: discussDes,
pageBuilder: (context, state) =>CupertinoPage(
name: state.uri.toString(),
key: state.pageKey,
child: UserDiscussDesPage(model: state.extra as CourseModel,)
)
),
GoRoute(
path: '/$orderEvaluate',
name: orderEvaluate,
pageBuilder: (context, state) =>CupertinoPage(
name: state.uri.toString(),
key: state.pageKey,
child: const OrderEvaluatePage()
)
),
]
);
......
......@@ -32,6 +32,7 @@ class Colours {
static const cFF = Color(0xFFFFFFFF);
static const cF2 = Color(0xFFF2F2F2);
static const cF4 = Color(0xFFF4F4F4);
static const cF8 = Color(0xFFF8F8F8);
static const cF9 = Color(0xFFF9F9F9);
static const cC7 = Color(0xFFC7C7C7);
static const cAB1941 = Color(0xB3AB1941);
......@@ -44,6 +45,7 @@ class Gaps {
static const Widget hGaps20 = SizedBox(width: 20,);
static const Widget vGaps5 = SizedBox(height: 5,);
static const Widget vGaps8 = SizedBox(height: 8,);
static const Widget vGaps10 = SizedBox(height: 10,);
static const Widget vGaps13 = SizedBox(height: 13,);
static const Widget vGaps15 = SizedBox(height: 15,);
......
......@@ -6,7 +6,7 @@ packages:
description:
name: async
sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.11.0"
audio_session:
......@@ -14,7 +14,7 @@ packages:
description:
name: audio_session
sha256: "6fdf255ed3af86535c96452c33ecff1245990bb25a605bfb1958661ccc3d467f"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.1.18"
badges:
......@@ -22,7 +22,7 @@ packages:
description:
name: badges
sha256: a7b6bbd60dce418df0db3058b53f9d083c22cdb5132a052145dc267494df0b84
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.1.2"
boolean_selector:
......@@ -30,7 +30,7 @@ packages:
description:
name: boolean_selector
sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.1"
carousel_slider:
......@@ -38,7 +38,7 @@ packages:
description:
name: carousel_slider
sha256: "9c695cc963bf1d04a47bd6021f68befce8970bcd61d24938e1fb0918cf5d9c42"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "4.2.1"
characters:
......@@ -46,7 +46,7 @@ packages:
description:
name: characters
sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.3.0"
clock:
......@@ -54,7 +54,7 @@ packages:
description:
name: clock
sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.1.1"
collection:
......@@ -62,7 +62,7 @@ packages:
description:
name: collection
sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.17.1"
convert:
......@@ -70,7 +70,7 @@ packages:
description:
name: convert
sha256: f08428ad63615f96a27e34221c65e1a451439b5f26030f78d790f461c686d65d
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.0.1"
cross_file:
......@@ -86,7 +86,7 @@ packages:
description:
name: crypto
sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.0.3"
cupertino_icons:
......@@ -94,7 +94,7 @@ packages:
description:
name: cupertino_icons
sha256: d57953e10f9f8327ce64a508a355f0b1ec902193f66288e8cb5070e7c47eeb2d
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.6"
decimal:
......@@ -102,7 +102,7 @@ packages:
description:
name: decimal
sha256: "24a261d5d5c87e86c7651c417a5dbdf8bcd7080dd592533910e8d0505a279f21"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.3.3"
dio:
......@@ -110,7 +110,7 @@ packages:
description:
name: dio
sha256: "417e2a6f9d83ab396ec38ff4ea5da6c254da71e4db765ad737a42af6930140b7"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "5.3.3"
easy_refresh:
......@@ -118,7 +118,7 @@ packages:
description:
name: easy_refresh
sha256: "77b025ea49f27b5ebc5eef40a6678be52564c293bd97ce91a4088d6646478329"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.3.2+1"
extended_image:
......@@ -126,7 +126,7 @@ packages:
description:
name: extended_image
sha256: e77d18f956649ba6e5ecebd0cb68542120886336a75ee673788145bd4c3f0767
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "8.0.2"
extended_image_library:
......@@ -134,7 +134,7 @@ packages:
description:
name: extended_image_library
sha256: bb8d08c504ebc73d476ec1c99451a61f12e95538869e734fc4f55a3a2d5c98ec
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.5.3"
fake_async:
......@@ -142,7 +142,7 @@ packages:
description:
name: fake_async
sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.3.1"
ffi:
......@@ -150,7 +150,7 @@ packages:
description:
name: ffi
sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.0"
file:
......@@ -158,7 +158,7 @@ packages:
description:
name: file
sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "7.0.0"
flutter:
......@@ -171,7 +171,7 @@ packages:
description:
name: flutter_easyloading
sha256: ba21a3c883544e582f9cc455a4a0907556714e1e9cf0eababfcb600da191d17c
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.0.5"
flutter_inappwebview:
......@@ -179,7 +179,7 @@ packages:
description:
name: flutter_inappwebview
sha256: d198297060d116b94048301ee6749cd2e7d03c1f2689783f52d210a6b7aba350
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "5.8.0"
flutter_lints:
......@@ -187,7 +187,7 @@ packages:
description:
name: flutter_lints
sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.0.3"
flutter_localizations:
......@@ -208,7 +208,7 @@ packages:
description:
name: flutter_screenutil
sha256: b3e155ee4f2cf5b21a2e15182d1c49c848147ed47f62083fc9a9beccb85f59f9
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "5.8.2"
flutter_slidable:
......@@ -216,7 +216,7 @@ packages:
description:
name: flutter_slidable
sha256: "19ed4813003a6ff4e9c6bcce37e792a2a358919d7603b2b31ff200229191e44c"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.0.1"
flutter_sound:
......@@ -224,7 +224,7 @@ packages:
description:
name: flutter_sound
sha256: "090a4694b11ecc744c2010621c4ffc5fe7c3079d304ea014961a72c7b72cfe6c"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "9.2.13"
flutter_sound_platform_interface:
......@@ -232,7 +232,7 @@ packages:
description:
name: flutter_sound_platform_interface
sha256: "4537eaeb58a32748c42b621ad6116f7f4c6ee0a8d6ffaa501b165fe1c9df4753"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "9.2.13"
flutter_sound_web:
......@@ -240,7 +240,7 @@ packages:
description:
name: flutter_sound_web
sha256: ad4ca92671a1879e1f613e900bbbdb8170b20d57d1e4e6363018fe56b055594f
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "9.2.13"
flutter_spinkit:
......@@ -248,7 +248,7 @@ packages:
description:
name: flutter_spinkit
sha256: b39c753e909d4796906c5696a14daf33639a76e017136c8d82bf3e620ce5bb8e
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "5.2.0"
flutter_star:
......@@ -256,7 +256,7 @@ packages:
description:
name: flutter_star
sha256: "7dc10b8b3667ace2aa575a37ea0c00558a7514019cfe7e76322573d85b72a472"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.2.0"
flutter_test:
......@@ -269,7 +269,7 @@ packages:
description:
name: flutter_tts
sha256: cbb3fd43b946e62398560235469e6113e4fe26c40eab1b7cb5e7c417503fb3a8
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.8.5"
flutter_web_plugins:
......@@ -282,7 +282,7 @@ packages:
description:
name: fluwx
sha256: "7a1596e8fad1b2191cf62f4cc80f3c63c01306bd6d8fa4f5c815f5e309da1dba"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "4.4.9"
get:
......@@ -290,7 +290,7 @@ packages:
description:
name: get
sha256: "2ba20a47c8f1f233bed775ba2dd0d3ac97b4cf32fc17731b3dfc672b06b0e92a"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "4.6.5"
go_router:
......@@ -298,7 +298,7 @@ packages:
description:
name: go_router
sha256: "2aa884667eeda3a1c461f31e72af1f77984ab0f29450d8fb12ec1f7bc53eea14"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "10.1.0"
http:
......@@ -306,7 +306,7 @@ packages:
description:
name: http
sha256: "759d1a329847dd0f39226c688d3e06a6b8679668e350e2891a6474f8b4bb8525"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.1.0"
http_client_helper:
......@@ -314,7 +314,7 @@ packages:
description:
name: http_client_helper
sha256: "8a9127650734da86b5c73760de2b404494c968a3fd55602045ffec789dac3cb1"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.0.0"
http_parser:
......@@ -322,7 +322,7 @@ packages:
description:
name: http_parser
sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "4.0.2"
image_picker:
......@@ -370,7 +370,7 @@ packages:
description:
name: intl
sha256: a3715e3bc90294e971cb7dc063fbf3cd9ee0ebf8604ffeafabd9e6f16abbdbe6
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.18.0"
ionicons:
......@@ -378,7 +378,7 @@ packages:
description:
name: ionicons
sha256: "5496bc65a16115ecf05b15b78f494ee4a8869504357668f0a11d689e970523cf"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.2.2"
js:
......@@ -386,7 +386,7 @@ packages:
description:
name: js
sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.6.7"
lints:
......@@ -394,7 +394,7 @@ packages:
description:
name: lints
sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.1"
logger:
......@@ -402,7 +402,7 @@ packages:
description:
name: logger
sha256: db2ff852ed77090ba9f62d3611e4208a3d11dfa35991a81ae724c113fcb3e3f7
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.3.0"
logging:
......@@ -410,7 +410,7 @@ packages:
description:
name: logging
sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.2.0"
matcher:
......@@ -418,7 +418,7 @@ packages:
description:
name: matcher
sha256: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.12.15"
material_color_utilities:
......@@ -426,7 +426,7 @@ packages:
description:
name: material_color_utilities
sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.2.0"
meta:
......@@ -434,7 +434,7 @@ packages:
description:
name: meta
sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.9.1"
mime:
......@@ -450,7 +450,7 @@ packages:
description:
name: nested
sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.0"
oktoast:
......@@ -458,7 +458,7 @@ packages:
description:
name: oktoast
sha256: f1366c5c793ddfb8f55bc6fc3e45db43c45debf173b765fb4c5ec096cbdeb84a
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.4.0"
path:
......@@ -466,7 +466,7 @@ packages:
description:
name: path
sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.8.3"
path_drawing:
......@@ -474,7 +474,7 @@ packages:
description:
name: path_drawing
sha256: bbb1934c0cbb03091af082a6389ca2080345291ef07a5fa6d6e078ba8682f977
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.1"
path_parsing:
......@@ -482,7 +482,7 @@ packages:
description:
name: path_parsing
sha256: e3e67b1629e6f7e8100b367d3db6ba6af4b1f0bb80f64db18ef1fbabd2fa9ccf
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.1"
path_provider:
......@@ -490,7 +490,7 @@ packages:
description:
name: path_provider
sha256: b27217933eeeba8ff24845c34003b003b2b22151de3c908d0e679e8fe1aa078b
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.2"
path_provider_android:
......@@ -498,7 +498,7 @@ packages:
description:
name: path_provider_android
sha256: "477184d672607c0a3bf68fbbf601805f92ef79c82b64b4d6eb318cbca4c48668"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.2.2"
path_provider_foundation:
......@@ -506,7 +506,7 @@ packages:
description:
name: path_provider_foundation
sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.3.2"
path_provider_linux:
......@@ -514,7 +514,7 @@ packages:
description:
name: path_provider_linux
sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.2.1"
path_provider_platform_interface:
......@@ -522,7 +522,7 @@ packages:
description:
name: path_provider_platform_interface
sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.2"
path_provider_windows:
......@@ -530,7 +530,7 @@ packages:
description:
name: path_provider_windows
sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.2.1"
permission_handler:
......@@ -538,7 +538,7 @@ packages:
description:
name: permission_handler
sha256: "284a66179cabdf942f838543e10413246f06424d960c92ba95c84439154fcac8"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "11.0.1"
permission_handler_android:
......@@ -546,7 +546,7 @@ packages:
description:
name: permission_handler_android
sha256: f9fddd3b46109bd69ff3f9efa5006d2d309b7aec0f3c1c5637a60a2d5659e76e
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "11.1.0"
permission_handler_apple:
......@@ -554,7 +554,7 @@ packages:
description:
name: permission_handler_apple
sha256: "99e220bce3f8877c78e4ace901082fb29fa1b4ebde529ad0932d8d664b34f3f5"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "9.1.4"
permission_handler_platform_interface:
......@@ -562,7 +562,7 @@ packages:
description:
name: permission_handler_platform_interface
sha256: "6760eb5ef34589224771010805bea6054ad28453906936f843a8cc4d3a55c4a4"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.12.0"
permission_handler_windows:
......@@ -570,7 +570,7 @@ packages:
description:
name: permission_handler_windows
sha256: cc074aace208760f1eee6aa4fae766b45d947df85bc831cde77009cdb4720098
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.1.3"
platform:
......@@ -578,7 +578,7 @@ packages:
description:
name: platform
sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.1.4"
plugin_platform_interface:
......@@ -586,7 +586,7 @@ packages:
description:
name: plugin_platform_interface
sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.8"
provider:
......@@ -594,7 +594,7 @@ packages:
description:
name: provider
sha256: "9a96a0a19b594dbc5bf0f1f27d2bc67d5f95957359b461cd9feb44ed6ae75096"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "6.1.1"
pull_to_refresh_flutter3:
......@@ -602,7 +602,7 @@ packages:
description:
name: pull_to_refresh_flutter3
sha256: "223a6241067162dc15cf8c46c05af998ce7aa85e0703d8f696101eb1b5629d76"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.0.1"
rational:
......@@ -610,7 +610,7 @@ packages:
description:
name: rational
sha256: ba58e9e18df9abde280e8b10051e4bce85091e41e8e7e411b6cde2e738d357cf
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.2.2"
recase:
......@@ -618,7 +618,7 @@ packages:
description:
name: recase
sha256: e4eb4ec2dcdee52dcf99cb4ceabaffc631d7424ee55e56f280bc039737f89213
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "4.1.0"
rxdart:
......@@ -626,7 +626,7 @@ packages:
description:
name: rxdart
sha256: "0c7c0cedd93788d996e33041ffecda924cc54389199cde4e6a34b440f50044cb"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.27.7"
shared_preferences:
......@@ -634,7 +634,7 @@ packages:
description:
name: shared_preferences
sha256: "16d3fb6b3692ad244a695c0183fca18cf81fd4b821664394a781de42386bf022"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.1"
shared_preferences_android:
......@@ -642,7 +642,7 @@ packages:
description:
name: shared_preferences_android
sha256: "8568a389334b6e83415b6aae55378e158fbc2314e074983362d20c562780fb06"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.2.1"
shared_preferences_foundation:
......@@ -650,7 +650,7 @@ packages:
description:
name: shared_preferences_foundation
sha256: "7708d83064f38060c7b39db12aefe449cb8cdc031d6062280087bc4cdb988f5c"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.3.5"
shared_preferences_linux:
......@@ -658,7 +658,7 @@ packages:
description:
name: shared_preferences_linux
sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.3.2"
shared_preferences_platform_interface:
......@@ -666,7 +666,7 @@ packages:
description:
name: shared_preferences_platform_interface
sha256: "22e2ecac9419b4246d7c22bfbbda589e3acf5c0351137d87dd2939d984d37c3b"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.3.2"
shared_preferences_web:
......@@ -674,7 +674,7 @@ packages:
description:
name: shared_preferences_web
sha256: d762709c2bbe80626ecc819143013cc820fa49ca5e363620ee20a8b15a3e3daf
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.2.1"
shared_preferences_windows:
......@@ -682,7 +682,7 @@ packages:
description:
name: shared_preferences_windows
sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.3.2"
sky_engine:
......@@ -695,7 +695,7 @@ packages:
description:
name: source_span
sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.9.1"
stack_trace:
......@@ -703,7 +703,7 @@ packages:
description:
name: stack_trace
sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.11.0"
stream_channel:
......@@ -711,7 +711,7 @@ packages:
description:
name: stream_channel
sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.1"
string_scanner:
......@@ -719,7 +719,7 @@ packages:
description:
name: string_scanner
sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.2.0"
synchronized:
......@@ -727,7 +727,7 @@ packages:
description:
name: synchronized
sha256: "539ef412b170d65ecdafd780f924e5be3f60032a1128df156adad6c5b373d558"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.1.0+1"
term_glyph:
......@@ -735,7 +735,7 @@ packages:
description:
name: term_glyph
sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.2.1"
test_api:
......@@ -743,7 +743,7 @@ packages:
description:
name: test_api
sha256: eb6ac1540b26de412b3403a163d919ba86f6a973fe6cc50ae3541b80092fdcfb
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.5.1"
typed_data:
......@@ -751,7 +751,7 @@ packages:
description:
name: typed_data
sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.3.2"
uuid:
......@@ -759,7 +759,7 @@ packages:
description:
name: uuid
sha256: "648e103079f7c64a36dc7d39369cabb358d377078a051d6ae2ad3aa539519313"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.0.7"
vector_math:
......@@ -767,7 +767,7 @@ packages:
description:
name: vector_math
sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.4"
win32:
......@@ -775,7 +775,7 @@ packages:
description:
name: win32
sha256: "350a11abd2d1d97e0cc7a28a81b781c08002aa2864d9e3f192ca0ffa18b06ed3"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "5.0.9"
xdg_directories:
......@@ -783,7 +783,7 @@ packages:
description:
name: xdg_directories
sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.4"
sdks:
......
name: flutter_book
description: 紫荆云书
description: 紫荆数智学堂
# The following line prevents the package from being accidentally published to
# pub.dev using `flutter pub publish`. This is preferred for private packages.
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论