提交 9feb9302 authored 作者: yueweilu's avatar yueweilu

设置界面

上级 4b8b09ce
......@@ -127,6 +127,7 @@ abstract class MineAPI {
}
/// 8、优惠券列表
///
static Future <List<CouponModel>> coupon({
int page = 1,
int limit = 10,
......@@ -147,4 +148,34 @@ abstract class MineAPI {
}
/// 9、获取最新版本
///
static Future <UpdateModel> update() async {
final result = await HttpService.to.post(
'/v1/members/Information/getVersion',
params: {},
);
if (result.data is! Map) return UpdateModel();
return UpdateModel.fromJson(result.data);
}
/// 10、版本介绍
static Future <List<VersionModel>> versions({
int page = 1,
int limit = 10,
}) async {
final result = await HttpService.to.post(
'/v1/members/Information/getAllVersionList',
params: {
'page': page,
'page_size': limit,
},
);
if (result.data is! Map && result.data['list'] is! List) return [];
return List.generate(result.data['list'].length, (index){
return VersionModel.fromJson(result.data['list'][index]);
});
}
}
\ No newline at end of file
......@@ -123,3 +123,84 @@ class CouponModel {
}
}
/// 更新模型
class UpdateModel {
UpdateModel({
this.version,
this.url,
this.remarks,});
UpdateModel.fromJson(dynamic json) {
version = json['version'];
url = json['url'];
remarks = json['remarks'];
}
String? version;
String? url;
String? remarks;
UpdateModel copyWith({ String? version,
String? url,
String? remarks,
}) => UpdateModel( version: version ?? this.version,
url: url ?? this.url,
remarks: remarks ?? this.remarks,
);
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['version'] = version;
map['url'] = url;
map['remarks'] = remarks;
return map;
}
}
/// 版本介绍模型
class VersionModel {
VersionModel({
this.id,
this.version,
this.remarks,
this.url,
this.createTime,
this.updateTime,});
VersionModel.fromJson(dynamic json) {
id = json['id'];
version = json['version'];
remarks = json['remarks'];
url = json['url'];
createTime = json['create_time'];
updateTime = json['update_time'];
}
num? id;
String? version;
String? remarks;
String? url;
String? createTime;
String? updateTime;
VersionModel copyWith({ num? id,
String? version,
String? remarks,
String? url,
String? createTime,
String? updateTime,
}) => VersionModel( id: id ?? this.id,
version: version ?? this.version,
remarks: remarks ?? this.remarks,
url: url ?? this.url,
createTime: createTime ?? this.createTime,
updateTime: updateTime ?? this.updateTime,
);
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['id'] = id;
map['version'] = version;
map['remarks'] = remarks;
map['url'] = url;
map['create_time'] = createTime;
map['update_time'] = updateTime;
return map;
}
}
\ No newline at end of file
......@@ -35,7 +35,7 @@ class _MinePageState extends State<MinePage> {
icon: Image.asset(
'assets/images/set.png',
),
onPressed: () => context.pushNamed(Routes.msgs),
onPressed: () => context.pushNamed(Routes.set),
),
GestureDetector(
onTap: (){
......
......@@ -29,6 +29,7 @@ class UserDiscussController extends GetxController {
);
// 如果是刷新 清理数据
if (isRefresh) discuss.clear();
discuss.addAll(_test());
discuss.addAll(result);
_page ++;
_noMore = result.length < _limit;
......@@ -59,4 +60,11 @@ class UserDiscussController extends GetxController {
}
}
List<CourseModel> _test(){
return [
CourseModel(),
CourseModel(),
CourseModel(),
];
}
}
\ No newline at end of file
......@@ -17,18 +17,40 @@ class _UserDiscussPageState extends State<UserDiscussPage> {
centerTitle: true,
title: const Text('讨论'),
),
body: CustomPullScrollView(
body: Container(
color: Colors.white,
child: CustomPullScrollView(
controller: controller.refreshController,
onRefresh: controller.onRefresh,
onLoading: controller.onLoading,
child:ListView.builder(
child:SingleChildScrollView(
child: 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,
),
],
),
child: ListView.builder(
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemBuilder: (BuildContext context, int index){
return BuildItem(model: controller.discuss[index],index: index,num: controller.discuss.length,);
},
itemCount: controller.discuss.length,
),
),
)
),
),
),
);
}
}
......@@ -14,21 +14,22 @@ class BuildItem extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
margin: const EdgeInsets.symmetric(horizontal: 10),
// margin: const EdgeInsets.symmetric(horizontal: 10),
padding: const EdgeInsets.symmetric(horizontal: 10),
// color: Colors.red,
// 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,
),
],
),
// 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,
// ),
// ],
// ),
child: Column(
children: [
index == 0 ? Container(
......@@ -75,7 +76,7 @@ class BuildItem extends StatelessWidget {
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)),
Text('${model.commentNum.toString()}讨论',style: const TextStyle(fontSize: 11,height: 1.5,color: AppTheme.primary)),
],
),
)
......
......@@ -21,11 +21,30 @@ class _UserNotePageState extends State<UserNotePage> {
controller: controller.refreshController,
onRefresh: controller.onRefresh,
onLoading: controller.onLoading,
child:ListView.builder(
child:SingleChildScrollView(
child: 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,
),
],
),
child: ListView.builder(
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemBuilder: (BuildContext context, int index){
return BuildItem(model: controller.notes[index],index: index,num: controller.notes.length,);
},
itemCount: controller.notes.length,
),
),
)
),
),
......
......@@ -14,16 +14,44 @@ class BuildItem extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
margin: const EdgeInsets.symmetric(horizontal: 10),
// margin: const EdgeInsets.symmetric(horizontal: 10),
padding: const EdgeInsets.symmetric(horizontal: 10),
// 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,
// ),
// ],
// ),
child: Column(
children: [
index == 0 ? Container(
// padding: const EdgeInsets.only(left: 10),
height: 32,
width: double.infinity,
decoration: const BoxDecoration(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(8),
topRight: Radius.circular(8),
),
color: Colors.white,
),
alignment: Alignment.centerLeft,
child: Text('共$num本书',style: const TextStyle(fontSize: 13,height: 1.5,color: Colours.c6),),
):const SizedBox(),
Container(
height: 0.5,
color: Colours.cF0,
),
Container(
padding: const EdgeInsets.only(top: 12,bottom: 15),
color: Colors.red,
// color: Colors.red,
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
......@@ -35,7 +63,7 @@ class BuildItem extends StatelessWidget {
Container(
height: 87,
margin: const EdgeInsets.only(left: 13),
color: Colors.green,
// color: Colors.green,
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
......@@ -47,7 +75,7 @@ class BuildItem extends StatelessWidget {
Text(model.authors??'',style: const TextStyle(fontSize: 12,height: 1.5,color: Colours.c6),),
],
),
Text(model.notesNum.toString(),style: const TextStyle(fontSize: 11,height: 1.5,color: AppTheme.primary)),
Text('${model.notesNum.toString()}个笔记',style: const TextStyle(fontSize: 11,height: 1.5,color: AppTheme.primary)),
],
),
)
......
part of user_set;
\ No newline at end of file
library user_set;
import 'package:flutter/material.dart';
import 'package:flutter_book/theme.dart';
import 'package:flutter_book/utils/index.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:go_router/go_router.dart';
import '../../apis/index.dart';
import '../../models/index.dart';
import '../../routes/index.dart';
import '../../store/index.dart';
part 'view.dart';
part 'controller.dart';
\ No newline at end of file
part of user_set;
class UserSetPage extends StatefulWidget {
const UserSetPage({Key? key}) : super(key: key);
@override
State<UserSetPage> createState() => _UserSetPageState();
}
class _UserSetPageState extends State<UserSetPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
centerTitle: true,
title: const Text('设置'),
),
body: Column(
children: [
Container(
margin: const EdgeInsets.symmetric(vertical: 10,horizontal: 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,
),
],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
GestureDetector(
onTap: () async{
clearCache();
},
child: Container(
color: Colors.white,
margin: const EdgeInsets.only(left: 15),
height:45,
alignment: Alignment.centerLeft,
child: const Text('清除缓存',style: TextStyle(fontSize: 14,color: Colours.c3)),
),
),
Container(
margin: const EdgeInsets.symmetric(horizontal: 10),
height: 0.5,
color:Colours.cF0,
),
GestureDetector(
onTap: () async{
UpdateModel model = await MineAPI.update();
// 有新版本
if (model.version !=null){
}
},
child: Container(
color: Colors.white,
margin: const EdgeInsets.only(left: 15),
height:45,
alignment: Alignment.centerLeft,
child: const Text('查看更新 >',style: TextStyle(fontSize: 14,color: Colours.c3)),
),
),
Container(
margin: const EdgeInsets.symmetric(horizontal: 10),
height: 0.5,
color:Colours.cF0,
),
GestureDetector(
onTap: (){
context.pushNamed(Routes.version);
},
child: Container(
color: Colors.white,
margin: const EdgeInsets.only(left: 15),
height:45,
alignment: Alignment.centerLeft,
child: const Text('版本介绍 >',style: TextStyle(fontSize: 14,color: Colours.c3)),
),
)
],
),
),
GestureDetector(
onTap: () async{
final result = await AccountAPI.logout();
if (result){
Toast.show('退出成功');
await UserStore.to.logout();
if(context.mounted){
context.goNamed(Routes.main);
}
}
},
child: Container(
color: Colors.white,
height: 42,
width: double.infinity,
alignment: Alignment.center,
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,
),
],
),
margin: const EdgeInsets.symmetric(horizontal: AppTheme.margin),
child: const Text('退出登录',style: TextStyle(fontSize: 14,color: Colours.c3),),
),
)
],
),
);
}
void clearCache() {
ClearCache().clearApplicationCache();
Toast.show('清除完成');
}
}
......@@ -21,11 +21,30 @@ class _UserWrongPageState extends State<UserWrongPage> {
controller: controller.refreshController,
onRefresh: controller.onRefresh,
onLoading: controller.onLoading,
child:ListView.builder(
child:SingleChildScrollView(
child: 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,
),
],
),
child: ListView.builder(
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemBuilder: (BuildContext context, int index){
return BuildItem(model: controller.wrongs[index],index: index,num: controller.wrongs.length,);
},
itemCount: controller.wrongs.length,
),
),
)
),
),
......
......@@ -14,16 +14,44 @@ class BuildItem extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
margin: const EdgeInsets.symmetric(horizontal: 10),
// margin: const EdgeInsets.symmetric(horizontal: 10),
padding: const EdgeInsets.symmetric(horizontal: 10),
// 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,
// ),
// ],
// ),
child: Column(
children: [
index == 0 ? Container(
// padding: const EdgeInsets.only(left: 10),
height: 32,
width: double.infinity,
decoration: const BoxDecoration(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(8),
topRight: Radius.circular(8),
),
color: Colors.white,
),
alignment: Alignment.centerLeft,
child: Text('共$num本书',style: const TextStyle(fontSize: 13,height: 1.5,color: Colours.c6),),
):const SizedBox(),
Container(
height: 0.5,
color: Colours.cF0,
),
Container(
padding: const EdgeInsets.only(top: 12,bottom: 15),
color: Colors.red,
// color: Colors.red,
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
......@@ -35,7 +63,7 @@ class BuildItem extends StatelessWidget {
Container(
height: 87,
margin: const EdgeInsets.only(left: 13),
color: Colors.green,
// color: Colors.green,
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
......@@ -47,7 +75,7 @@ class BuildItem extends StatelessWidget {
Text(model.authors??'',style: const TextStyle(fontSize: 12,height: 1.5,color: Colours.c6),),
],
),
Text(model.wrongNum.toString(),style: const TextStyle(fontSize: 11,height: 1.5,color: AppTheme.primary)),
Text('${model.wrongNum.toString()}个错题',style: const TextStyle(fontSize: 11,height: 1.5,color: AppTheme.primary)),
],
),
)
......
part of version;
class VersionController extends GetxController {
final EasyRefreshController refreshController = EasyRefreshController(
controlFinishLoad: true,
controlFinishRefresh: true,
);
final int _limit = 10;
int _page = 1;
bool _noMore = false;
List<VersionModel> versions = [];
@override
void onClose() {
refreshController.dispose();
super.onClose();
}
/// 获取课程内图书列表
Future<void> _getVersions([bool isRefresh = false]) async {
if (isRefresh) _page = 1;
// 网路请求
final result = await MineAPI.versions(
page: _page,
limit: _limit
);
// 如果是刷新 清理数据
if (isRefresh) versions.clear();
versions.addAll(result);
_page ++;
_noMore = result.length < _limit;
update();
}
void onRefresh() async {
try {
await _getVersions(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 _getVersions();
refreshController.finishLoad();
} catch (error) {
refreshController.finishLoad(IndicatorResult.fail);
}
}
List<VersionModel> test(){
return [
VersionModel(version: '1.11',updateTime: '2024-01-03 11:14:40'),
VersionModel(version: '1.21',updateTime: '2023-01-03 11:14:40')
];
}
}
\ No newline at end of file
library version;
import 'package:easy_refresh/easy_refresh.dart';
import 'package:flutter/material.dart';
import 'package:flutter_book/apis/index.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';
part 'view.dart';
part 'controller.dart';
part 'widgets/item.dart';
\ No newline at end of file
part of version;
class VersionPage extends StatefulWidget {
const VersionPage({Key? key}) : super(key: key);
@override
State<VersionPage> createState() => _VersionPageState();
}
class _VersionPageState extends State<VersionPage> {
@override
Widget build(BuildContext context) {
return GetBuilder<VersionController>(
init: VersionController(),
builder: (controller) => Scaffold(
appBar: AppBar(
centerTitle: true,
title: const Text('版本介绍'),
),
body: CustomPullScrollView(
controller: controller.refreshController,
onRefresh: controller.onRefresh,
onLoading: controller.onLoading,
child: SingleChildScrollView(
child: 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,
),
],
),
child: ListView.builder(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
itemCount: controller.versions.length,
itemBuilder: (BuildContext context, int index){
VersionModel model = controller.versions[index];
return GestureDetector(
child: BuildItem(model: model,),
onTap: (){
context.pushNamed(Routes.versionDes,extra: model);
},
);
}),
),
),
),
));
}
}
part of version;
class BuildItem extends StatelessWidget {
final VersionModel model;
const BuildItem({
Key? key,
required this.model
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
color: Colors.white,
padding: const EdgeInsets.only(top: 10,right: 15,left: 15),
child: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(model.version??'',style: const TextStyle(fontSize: 14,height: 1.5,color: Colours.c3),),
Text(model.updateTime??'',style: const TextStyle(fontSize: 12,height: 1.5,color: Colours.c9),),
],
),
Image.asset('assets/images/right_arrow.png')
],
),
Gaps.vGaps10,
Container(
height: 0.5,
color: Colours.cF0,
)
],
),
);
}
}
library version_des;
import 'package:flutter/material.dart';
import '../../models/index.dart';
import '../../utils/index.dart';
part 'view.dart';
\ No newline at end of file
part of version_des;
class VersionDesPage extends StatelessWidget {
final VersionModel model;
const VersionDesPage({
Key? key,
required this.model
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
centerTitle: true,
title: const Text('版本介绍'),
),
body: Container(
margin: const EdgeInsets.all(15),
child: Text(model.remarks??'',style: const TextStyle(fontSize: 14,height: 1.5,color: Colours.c3),),
),
);
}
}
......@@ -26,12 +26,15 @@ import 'package:flutter_book/pages/user_msg/index.dart';
import 'package:flutter_book/pages/user_nick/index.dart';
import 'package:flutter_book/pages/user_notes/index.dart';
import 'package:flutter_book/pages/user_point/index.dart';
import 'package:flutter_book/pages/user_set/index.dart';
import 'package:flutter_book/pages/user_wrong/index.dart';
import 'package:flutter_book/pages/version_des/index.dart';
import 'package:flutter_book/pages/web/index.dart';
import 'package:go_router/go_router.dart';
import '../models/index.dart';
import '../pages/user_terms/index.dart';
import '../pages/version/index.dart';
import '../store/index.dart';
......
......@@ -82,6 +82,8 @@ abstract class Routes {
static const coupon = 'coupon';
static final GoRouter config = GoRouter(
// initialLocation: '/$login',
initialLocation: '/',
......@@ -339,6 +341,33 @@ abstract class Routes {
child: const UserCouponPage()
)
),
GoRoute(
path: '/$set',
name: set,
pageBuilder: (context, state) =>CupertinoPage(
name: state.uri.toString(),
key: state.pageKey,
child: const UserSetPage()
)
),
GoRoute(
path: '/$version',
name: version,
pageBuilder: (context, state) =>CupertinoPage(
name: state.uri.toString(),
key: state.pageKey,
child: const VersionPage()
)
),
GoRoute(
path: '/$versionDes',
name: versionDes,
pageBuilder: (context, state) =>CupertinoPage(
name: state.uri.toString(),
key: state.pageKey,
child: VersionDesPage(model: state.extra as VersionModel,)
)
),
]
);
......
part of utils;
class ClearCache{
// /// 获取缓存
// Future<double> loadApplicationCache() async {
// /// 获取文件夹
// Directory directory = await getApplicationDocumentsDirectory();
// /// 获取缓存大小
// double value = await getTotalSizeOfFilesInDir(directory);
// return value;
// }
//
// /// 循环计算文件的大小(递归)
// Future<double> getTotalSizeOfFilesInDir(final FileSystemEntity file) async {
// if (file is File) {
// int length = await file.length();
// return double.parse(length.toString());
// }
// if (file is Directory) {
// final List<FileSystemEntity> children = file.listSync();
// double total = 0;
// if (children != null)
// for (final FileSystemEntity child in children)
// total += await getTotalSizeOfFilesInDir(child);
// return total;
// }
// return 0;
// }
//
// /// 缓存大小格式转换
// String formatSize(double value) {
// if (null == value) {
// return '0';
// }
// List<String> unitArr = []
// ..add('B')
// ..add('K')
// ..add('M')
// ..add('G');
// int index = 0;
// while (value > 1024) {
// index++;
// value = value / 1024;
// }
// String size = value.toStringAsFixed(2);
// return size + unitArr[index];
// }
//
//
/// 删除缓存
void clearApplicationCache() async {
Directory directory = await getApplicationDocumentsDirectory();
Directory tempDir = await getTemporaryDirectory();
//删除缓存目录
await deleteDirectory(tempDir);
//删除缓存目录
await deleteDirectory(directory);
}
/// 递归方式删除目录
Future<void> deleteDirectory(FileSystemEntity file) async {
if (file is Directory) {
final List<FileSystemEntity> children = file.listSync();
for (final FileSystemEntity child in children) {
await deleteDirectory(child);
}
}
await file.delete();
}
}
\ No newline at end of file
library utils;
import 'dart:convert';
import 'dart:io';
import 'dart:ui';
import 'package:flutter/cupertino.dart';
......@@ -11,6 +12,7 @@ import 'package:logger/logger.dart';
import 'package:crypto/crypto.dart';
import 'package:convert/convert.dart';
import 'package:oktoast/oktoast.dart';
import 'package:path_provider/path_provider.dart';
part 'constants.dart';
......@@ -23,3 +25,4 @@ part 'tools.dart';
part 'styles.dart';
part 'validator.dart';
part 'toast_utils.dart';
part 'clear_cache_util.dart';
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论