Commit 14bfc57b authored by 林生雨's avatar 林生雨

commit

parent 53f3c5e8
No preview for this file type
{"_info":"// This is a generated file; do not edit or check into version control.","dependencyGraph":[{"name":"file_chooser","dependencies":[]},{"name":"flutter_animation_set","dependencies":[]},{"name":"path_provider_fde","dependencies":[]}]}
\ No newline at end of file
/*
* @author lsy
* @date 2019-11-05
**/
import 'dart:math';
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'Annotations/RouterCenterRestore.mark.dart';
import 'commonModel/live/BaseModel.dart';
import 'commonModel/live/LiveData.dart';
class HomeItem {
HomeItem(this.index, this.svgIcon,this.name);
int index;
String svgIcon;
String name;
}
class HomeModel extends BaseModel {
LiveData<int> widgetLive = new LiveData();
final List<HomeItem> items = [];
final List<Widget> pages = [];
int currentIndex = 0;
@override
void dispose() {
widgetLive.dispost();
}
void init() {
var mainWidget = RouterCenterImpl().findHomeRouter()?.getHomePage();
var persionPage=RouterCenterImpl().findUserRouter()?.getLoginPage();
var findPage = RouterCenterImpl().findHomeRouter()?.getDataPage();
int index = 0;
if (mainWidget != null) {
items.add(HomeItem(index, "images/home.svg","主页"));
pages.add(mainWidget);
index++;
}
if(persionPage!=null){
items.add(HomeItem(index, "images/home.svg","主页"));
pages.add(persionPage);
index++;
}
if (findPage != null) {
items.add(HomeItem(index, "images/find.svg","变美助手"));
pages.add(findPage);
index++;
}
}
void onTap(int index) {
widgetLive.notifyView(index);
}
}
......@@ -10,4 +10,5 @@ import 'package:flutter/cupertino.dart';
@Router("HomeRouter", HomeRouterImpl, true)
abstract class HomeRouter extends RouterBaser {
Widget getHomePage();
Widget getDataPage();
}
......@@ -3,6 +3,7 @@
* @date 2019-11-07
**/
import 'package:example_flutter/HomeModel/HomeRouter.dart';
import 'package:example_flutter/HomeModel/page/data/DataCenter.dart';
import 'package:example_flutter/HomeModel/page/home/HomePage.dart';
import 'package:flutter/src/widgets/framework.dart';
......@@ -12,4 +13,9 @@ class HomeRouterImpl extends HomeRouter{
return HomePage();
}
@override
Widget getDataPage() {
return DataCenter();
}
}
\ No newline at end of file
This diff is collapsed.
......@@ -67,7 +67,9 @@ class WorkView extends CustomPainter {
if (showheight > size.height) {
// showheight = size.height;
// top=(showheight-size.height)/2;
} else {}
} else {
}
top = (size.height - showheight) / 2;
call(scareSize, top, (size.height - showheight) / 2);
canvas.drawImageRect(
......
/*
* @author lsy
* @date 2019-12-03
**/
import 'dart:async';
import 'package:example_flutter/HomeModel/base/BaseTitle.dart';
import 'package:example_flutter/HomeModel/page/createProject/CreateProjectModel.dart';
import 'package:example_flutter/commonModel/base/BaseComponent.dart';
import 'package:example_flutter/commonModel/base/BaseState.dart';
import 'package:example_flutter/main.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class CreateProject extends StatefulWidget {
@override
State<StatefulWidget> createState() => CreateProjectState();
}
class CreateProjectState extends BaseState<CreateProject> {
CreateProjectModel _model;
TextEditingController nameController;
TextEditingController contentController;
@override
void initState() {
nameController = TextEditingController();
contentController = TextEditingController();
_model = new CreateProjectModel();
super.initState();
}
@override
void dispose() {
nameController.dispose();
contentController.dispose();
_model.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: MyAppBar(),
body: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Container(
margin: EdgeInsets.only(left: 22, top: 22),
child: baseText("新建项目", 15, Colors.black),
),
Container(
margin: EdgeInsets.only(left: 22, top: 5, bottom: 20),
child: baseText("请耐心按顺序认真的填写项目内容", 15, Colors.black),
),
StreamBuilder(
stream: _model.currentIndexLive.stream,
initialData: _model.currentIndexLive.data,
builder: (con, data) {
if (data.data == null) {
return Container();
}
return Row(
children: <Widget>[
Container(
width: 22,
),
GestureDetector(
onTap: () {
_model.tabChange(1);
},
child: Column(
children: <Widget>[
Icon(
Icons.looks_one,
size: 50,
color: Colors.yellow,
),
Container(
height: 5,
),
baseText("填写项目名称", 15, Colors.black)
],
)),
Container(
margin: EdgeInsets.only(left: 20, right: 20, bottom: 20),
width: 230,
height: 1,
color: data.data == 2 ? Colors.black : Colors.grey,
),
GestureDetector(
onTap: () {
_model.tabChange(2);
},
child: Column(
children: <Widget>[
Icon(
Icons.looks_two,
size: 50,
color:
data.data == 2 ? Colors.yellow : Colors.black,
),
Container(
height: 5,
),
baseText("上传或选择已有的数据集", 15,
data.data == 2 ? Colors.black : Colors.grey)
],
))
],
);
},
),
StreamBuilder<ProjectUI>(
stream: _model.projectLive.stream,
initialData: _model.projectLive.data,
builder: (con, data) {
if (data.data == null) {
return Container();
}
if (data.data.index == 1) {
return page1();
} else if (data.data.index == 2) {
return page2();
}
},
)
],
),
);
}
Widget page2() {
return Expanded(
child: Column(
children: <Widget>[
Expanded(
child: Row(
children: <Widget>[
Expanded(
flex: 1,
child: Container(
height: double.maxFinite,
margin: EdgeInsets.all(20),
child: Card(
elevation: 10,
child: Column(
children: <Widget>[
],
),
),
),
),
Expanded(
flex: 3,
child: Container(
height: double.maxFinite,
margin: EdgeInsets.fromLTRB(20, 20, 300, 20),
child: Card(
elevation: 10,
child: ListView(
children: <Widget>[
baseText("wdwad", 16, Colors.black),
baseText("wdwad", 16, Colors.black),
],
),
),
),
),
],
),
),
Container(
height: 20,
),
Row(
children: <Widget>[
baseButton(() {
//TODO
}, EdgeInsets.only(), "完成"),
Container(
width: 10,
),
baseButton(() {
Navigator.pop(context);
}, EdgeInsets.only(), "返回"),
],
),
Container(
height: 20,
),
],
),
);
}
Widget page1() {
return Expanded(
child: Column(
children: <Widget>[
Container(
margin: EdgeInsets.only(left: 22, top: 50, right: 500),
child: TextFormField(
decoration: InputDecoration(
labelText: '请输入项目名称',
hintText: "项目名称",
hintStyle: TextStyle(
color: Colors.grey,
fontSize: 13,
),
prefixIcon: Icon(Icons.nature),
),
//校验用户
validator: (value) {
return value.trim().length > 0 ? null : "项目名称不能为空";
},
controller: nameController,
),
),
Container(
margin: EdgeInsets.only(left: 22, top: 30, right: 500),
child: TextFormField(
decoration: InputDecoration(
labelText: '请输入项目描述',
hintText: "项目描述",
hintStyle: TextStyle(
color: Colors.grey,
fontSize: 13,
),
prefixIcon: Icon(Icons.content_copy),
),
//校验用户
validator: (value) {
return value.trim().length > 0 ? null : "项目描述不能为空";
},
controller: contentController,
),
),
Container(
height: 80,
),
Row(
children: <Widget>[
baseButton(() {
_model.next(
context, nameController.text, contentController.text);
}, EdgeInsets.only(), "下一步"),
Container(
width: 10,
),
baseButton(() {
Navigator.pop(context);
}, EdgeInsets.only(), "返回"),
],
)
],
),
);
}
}
/*
* @author lsy
* @date 2019-12-03
**/
import 'package:example_flutter/commonModel/GMBase.dart';
import 'package:example_flutter/commonModel/toast/toast.dart';
import 'package:flutter/cupertino.dart';
class CreateProjectModel extends BaseModel {
LiveData<int> currentIndexLive = new LiveData();
LiveData<ProjectUI> projectLive = new LiveData();
CreateProjectModel() {
currentIndexLive.notifyView(1);
var projectUI = ProjectUI();
projectUI.index = 1;
projectLive.notifyView(projectUI);
}
tabChange(int tab) {
currentIndexLive.notifyView(tab);
projectLive.data.index = tab;
projectLive.notifyView(projectLive.data);
}
@override
void dispose() {
projectLive.dispost();
currentIndexLive.dispost();
}
void next(BuildContext context, String text, String text2) {
if (text.isEmpty || text2.isEmpty) {
Toast.show(context, "清输入项目名称和描述哦");
return;
}
projectLive.data.name = text;
projectLive.data.content = text2;
//TODO
projectLive.data.way = "图像";
projectLive.data.index = 2;
currentIndexLive.notifyView(2);
projectLive.notifyView(projectLive.data);
}
}
class ProjectUI {
int index;
String name;
String content;
String way;
String dataList;
}
/*
* @author lsy
* @date 2019-12-02
**/
import 'dart:async';
import 'package:example_flutter/HomeModel/base/BaseTitle.dart';
import 'package:example_flutter/HomeModel/page/data/DataCenterModel.dart';
import 'package:example_flutter/commonModel/GMBase.dart';
import 'package:example_flutter/commonModel/base/BaseState.dart';
import 'package:example_flutter/commonModel/eventbus/event/LogoutEvent.dart';
import 'package:example_flutter/main.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
class DataCenter extends StatefulWidget {
@override
State<StatefulWidget> createState() => DataCenterState();
}
class DataCenterState extends BaseState<DataCenter> {
DataCenterModel _model;
RefreshController _refreshController =
RefreshController(initialRefresh: false);
DataCenterState() {
_model = DataCenterModel();
}
@override
void initState() {
super.initState();
_model.init(context);
}
@override
void dispose() {
_model.dispose();
_refreshController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: MyAppBar(),
body:
refreshView(_refreshController, _onLoading, topTitle(), renderList()),
);
}
void _onLoading() {
//TODO
Timer(Duration(seconds: 1), () {
_refreshController.refreshCompleted();
});
}
Widget renderList() {
return StreamBuilder(
stream: _model.liveData.stream,
initialData: _model.liveData.data,
builder: (context, data) {
if (data.data == null) {
return refreshloadingItem((){
});
}
return SliverPadding(
padding: EdgeInsets.only(right: 300, left: 20),
sliver: SliverGrid(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 5, childAspectRatio: 0.9),
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
print("clickk ");
},
child: Card(
shape: const RoundedRectangleBorder(
borderRadius:
BorderRadius.all(Radius.circular(15.0))), //设置圆角
elevation: 5,
margin: EdgeInsets.all(10),
child: Column(
children: <Widget>[
Container(
width: double.maxFinite,
height: 160,
child: ClipRRect(
borderRadius: BorderRadius.vertical(
top: Radius.circular(15)),
child: Image.network(
"http://b-ssl.duitang.com/uploads/item/201208/30/20120830173930_PBfJE.jpeg",
fit: BoxFit.cover,
)),
),
Container(
width: double.maxFinite,
height: 1,
color: Colors.black12,
),
Container(
alignment: Alignment.topLeft,
margin: EdgeInsets.only(
left: 16,
top: 5,
),
child: baseText("www", 15, Colors.black),
),
Container(
alignment: Alignment.topLeft,
margin:
EdgeInsets.only(left: 16, top: 5, right: 16),
child: Row(
children: <Widget>[
baseText("www", 12, Colors.black),
Expanded(
child: Container(),
),
baseText("0/8", 12, Colors.black)
],
),
),
],
),
));
})));
},
);
}
Widget topTitle() {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
baseButton(() {
//TODO
}, EdgeInsets.fromLTRB(10, 20, 10, 20), "新建数据集"),
Container(
margin: EdgeInsets.only(left: 30, bottom: 5),
child: baseText("数据集", 12, Colors.black),
),
StreamBuilder(
stream: _model.countLive.stream,
initialData: _model.countLive.data,
builder: (con, data) {
int all = 0;
if (data.data != null) {
all = data.data;
}
return Container(
margin: EdgeInsets.only(left: 30, bottom: 10),
child: baseText("总共 ${all}", 12, Colors.black),
);
},
)
],
);
}
}
/*
* @author lsy
* @date 2019-12-02
**/
import 'package:example_flutter/HomeModel/service/remote/entity/DataBean.dart';
import 'package:example_flutter/commonModel/GMBase.dart';
import 'package:flutter/src/widgets/framework.dart';
class DataCenterModel extends BaseModel{
LiveData<DataBean> liveData=new LiveData();
LiveData<int> countLive=new LiveData();
DataCenterModel();
@override
void dispose() {
liveData.dispost();
countLive.dispost();
}
void init(BuildContext context) {
liveData.notifyView(new DataBean());
}
}
\ No newline at end of file
......@@ -10,6 +10,7 @@ import 'package:dio/dio.dart';
import 'package:example_flutter/HomeModel/page/picture/PicPage.dart';
import 'package:example_flutter/HomeModel/page/work/WorkPage.dart';
import 'package:example_flutter/HomeModel/service/HomeRepo.dart';
import 'package:example_flutter/HomeModel/service/remote/entity/AllProjectBean.dart';
import 'package:example_flutter/HomeModel/service/remote/entity/UploadResultBean.dart';
import 'package:example_flutter/commonModel/GMBase.dart';
import 'package:example_flutter/commonModel/picker/base/BasePickerComponent.dart';
......@@ -20,15 +21,24 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/src/widgets/framework.dart';
import 'package:file_chooser/file_chooser.dart';
import 'UploadBean.dart';
class HomeModel extends BaseModel {
HomeRepo repo = HomeRepo.getInstance();
List<UploadResultBean> scanList = new List();
int allSize;
int nowSize;
List<String> uploadFile = new List();
LiveData<List<UploadItem>> uploadLive = new LiveData();
@override
void dispose() {}
void dispose() {
uploadLive.dispost();
}
init() {
// allprojectLive.notifyView(AllProjectBean("w"));
}
void scanImages(BuildContext context) async {
await showOpenPanel((result, files) {
......@@ -36,10 +46,13 @@ class HomeModel extends BaseModel {
Toast.show(context, "没有选择文件 批量上传 可以按住shift 或者拖拽鼠标!");
return;
}
BaseCenterPicker()
..setPicker(BaseLoadingItem("上传中..."))
..show(context);
allSize = files.length ;
List<UploadItem> items = new List();
files.forEach((value) {
items.add(new UploadItem()
..path = value);
});
uploadLive.notifyView(items);
allSize = files.length;
nowSize = 0;
scanList.clear();
uploadFile.clear();
......@@ -48,35 +61,38 @@ class HomeModel extends BaseModel {
}, allowsMultipleSelection: true);
}
void uploadImage(
BuildContext context,
String path,
) {
void uploadImage(BuildContext context,
String path,) {
netUpload(path).then((value) {
if (value != null &&
(value.statusCode >= 200 && value.statusCode < 300)) {
uploadLive.data[nowSize].state=1;
uploadLive.notifyView(uploadLive.data);
nowSize++;
if (allSize == nowSize) {
Toast.show(context, "上传成功");
// repo.updateScanList(scanList);
success(context);
} else {
uploadImage(context,uploadFile[nowSize]);
uploadImage(context, uploadFile[nowSize]);
}
} else {
Toast.show(context, "上传图片返回接口有空值 暂停上传");
print("上传图片返回接口有空值 暂停上传");
Navigator.pop(context);
}
}).catchError((erro) {
Toast.show(context, erro.toString());
print(erro.toString());
Navigator.pop(context);
uploadLive.data[nowSize].state=2;
uploadLive.notifyView(uploadLive.data);
nowSize++;
if(nowSize<allSize) {
uploadImage(context, uploadFile[nowSize]);
}
});
}
void success(BuildContext buildContext) {
Navigator.pop(buildContext);
Navigator.push(buildContext, CustomRoute(PicPage()));
}
}
......
......@@ -2,24 +2,48 @@
* @author lsy
* @date 2019-11-07
**/
import 'dart:async';
import 'dart:io';
import 'package:event_bus/event_bus.dart';
import 'package:example_flutter/HomeModel/base/BaseTitle.dart';
import 'package:example_flutter/HomeModel/page/createProject/CreateProject.dart';
import 'package:example_flutter/HomeModel/page/home/HomeModel.dart';
import 'package:example_flutter/HomeModel/page/home/UploadHideView.dart';
import 'package:example_flutter/HomeModel/page/picture/PicPage.dart';
import 'package:example_flutter/HomeModel/page/work/WorkPage.dart';
import 'package:example_flutter/HomeModel/service/remote/entity/AllProjectBean.dart';
import 'package:example_flutter/HomeModel/util/JumpUtil.dart';
import 'package:example_flutter/commonModel/base/BaseComponent.dart';
import 'package:example_flutter/commonModel/base/BaseState.dart';
import 'package:example_flutter/commonModel/cache/CacheManager.dart';
import 'package:example_flutter/commonModel/eventbus/event/LogoutEvent.dart';
import 'package:example_flutter/main.dart';
import 'package:example_flutter/res/GMRes.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_animation_set/widget/transition_animations.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
import 'UploadBean.dart';
class HomePage extends StatefulWidget {
@override
State<StatefulWidget> createState() => HomeState();
}
class HomeState extends State<HomePage> {
class HomeState extends BaseState<HomePage>
with SingleTickerProviderStateMixin {
HomeModel _model;
Size screenSize;
String userName;
RefreshController _refreshController =
RefreshController(initialRefresh: false);
Animation<double> animation;
AnimationController controller;
double animValue = 0.0;
HomeState() {
_model = new HomeModel();
......@@ -28,38 +52,170 @@ class HomeState extends State<HomePage> {
@override
void initState() {
super.initState();
_model.init();
// controller = new AnimationController(
// duration: const Duration(milliseconds: 3000), vsync: this);
// animation = new Tween(begin: 0.0, end: 1.0).animate(controller)
// ..addListener(() {
// animValue = controller.value;
// });
// controller.repeat();
}
@override
void dispose() {
// controller.dispose();
_refreshController.dispose();
_model.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
screenSize = MediaQuery.of(context).size;
String userName =
CacheManager.getInstance().get(MEMORY_CACHE).get("userName");
userName = CacheManager.getInstance().get(MEMORY_CACHE).get("userName");
return Scaffold(
// appBar: AppBar(
// leading: Text(""),
// backgroundColor: ALColors.Color5276F4,
// actions: <Widget>[
// Expanded(
// child: Container(),
// ),
// Container(
// margin: EdgeInsets.only(right: ScreenUtil.instance.setWidth(10)),
// alignment: Alignment.center,
// child: baseText(userName, 30, ALColors.ColorF8F8F8),
// ),
// Container(
// width: kToolbarHeight,
// height: kToolbarHeight,
// margin: EdgeInsets.only(
// left: ScreenUtil.instance.setWidth(5),
// right: ScreenUtil.instance.setWidth(50),
// top: 5,
// bottom: 5),
// child: SvgPicture.asset("image/Face.svg"),
appBar: MyAppBar(),
body:
refreshView(_refreshController, _onLoading, topTitle(), renderList()),
);
}
void _onLoading() {
//TODO
Timer(Duration(seconds: 1), () {
_refreshController.refreshCompleted();
});
}
Widget renderList() {
return StreamBuilder<List<UploadItem>>(
stream: _model.uploadLive.stream,
initialData: _model.uploadLive.data,
builder: (context, data) {
if (data.data == null) {
return refreshloadingItem(() {
_model.scanImages(context);
});
}
return SliverPadding(
padding: EdgeInsets.only(right: 300, left: 20),
sliver: SliverGrid(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 5, childAspectRatio: 0.9),
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
print("clickk ");
},
child: Stack(
children: <Widget>[
PicItem(data.data[index].path),
_model.nowSize == index && data.data[index].state == 0
? Container(
margin: EdgeInsets.all(25),
alignment: Alignment.center,
width: double.maxFinite,
height: double.maxFinite,
child: Container(
width: 40,
height: 40,
child: MyYYRotatingCircle(Colors.orange),
))
: Container(
margin: EdgeInsets.all(10),
width: double.maxFinite,
height: double.maxFinite,
child: CustomPaint(
painter: UploadHideView(
data.data[index].state,
animValue,
data.data[index].progress)),
),
],
));
}, childCount: data.data.length)));
},
);
}
Widget PicItem(String path) {
return Card(
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(15.0))), //设置圆角
elevation: 5,
margin: EdgeInsets.all(10),
child: Column(
children: <Widget>[
Container(
width: double.maxFinite,
height: 160,
child: ClipRRect(
borderRadius: BorderRadius.vertical(top: Radius.circular(15)),
child: Image.file(
File(path),
fit: BoxFit.cover,
)),
),
Container(
width: double.maxFinite,
height: 1,
color: Colors.black12,
),
Container(
alignment: Alignment.topLeft,
margin: EdgeInsets.only(
left: 16,
top: 15,
),
child: baseText(
path.substring(path.lastIndexOf("/") + 1, path.length),
15,
Colors.black),
),
// Container(
// alignment: Alignment.topLeft,
// margin:
// EdgeInsets.only(left: 16, top: 5, right: 16),
// child: Row(
// children: <Widget>[
// baseText("www", 12, Colors.black),
// Expanded(
// child: Container(),
// ),
// baseText("0/8", 12, Colors.black)
// ],
// ),
// ]),
body: uploadItem(),
// ),
],
),
);
}
Widget topTitle() {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Row(
children: <Widget>[
baseButton(() {
_model.scanImages(context);
}, EdgeInsets.fromLTRB(10, 20, 10, 20), "上传图片"),
baseButton(() {
JumpUtil.jumpToPage(context, WorkPage(
"http://i1.sinaimg.cn/ent/d/2008-06-04/U105P28T3D2048907F326DT20080604225106.jpg"
,1,0
));
}, EdgeInsets.fromLTRB(10, 20, 10, 20), "下一步"),
],
),
Container(
margin: EdgeInsets.only(left: 30, bottom: 10),
child: baseText("全部图片", 12, Colors.black),
),
],
);
}
......@@ -107,8 +263,7 @@ class HomeState extends State<HomePage> {
child: baseText("跳过", 15, Colors.white),
)),
Expanded(
child: Container(
),
child: Container(),
),
SvgPicture.asset("image/add.svg"),
Container(
......
/*
* @author lsy
* @date 2019-12-05
**/
class UploadItem{
String path;
//0 loading 1success 2fail
int state=0;
double progress=0.0;
}
\ No newline at end of file
/*
* @author lsy
* @date 2019-11-22
**/
import 'dart:async';
import 'dart:ui';
import 'package:example_flutter/HomeModel/base/bean/PointItem.dart';
import 'package:flutter/material.dart';
import 'package:flutter_animation_set/animation_set.dart';
import 'dart:ui' as ui;
import 'dart:math' as math;
import 'package:flutter_animation_set/animator.dart';
class MyYYRotatingCircle extends StatelessWidget {
Color color;
MyYYRotatingCircle(this.color);
@override
Widget build(BuildContext context) {
return Container(
width: 40,
height: 40,
child: Stack(
children: <Widget>[
AnimatorSet(
child: Container(
decoration: BoxDecoration(
color: color,
shape: BoxShape.circle,
),
width: 100,
height: 100,
),
animatorSet: [
RX(from: 0.0, to: math.pi, duration: 500, curve: Curves.easeIn),
RY(from: 0.0, to: math.pi, duration: 500, curve: Curves.easeOut),
],
),
],
),
);
}
}
class UploadHideView extends CustomPainter {
double animValue;
double progressValue;
int state;
UploadHideView(this.state, this.animValue, this.progressValue);
Paint ImagePaint = new Paint()..isAntiAlias = true;
Paint circlePaint = new Paint()
..isAntiAlias = true
..color = Colors.black38
..style = PaintingStyle.fill;
Paint rectPaint = new Paint()
..isAntiAlias = true
..color = Colors.red
..strokeWidth = 5
..style = PaintingStyle.stroke
..strokeCap = StrokeCap.round;
Path path = new Path();
@override
void paint(Canvas canvas, Size size) {
RRect rect1 = RRect.fromRectAndRadius(
new Rect.fromLTWH(0, 0, size.width, size.height),
Radius.circular(15.0));
canvas.clipRRect(rect1);
if (state == 0) {
// if (progressValue == 0.1) {
// canvas.drawRect(
// Rect.fromLTWH(0, 0, size.width, size.height), circlePaint);
// } else {
// double rowHeight = size.width / 15;
// path.moveTo(0, 0);
// path.relativeLineTo(size.width * 3, 0);
// path.relativeLineTo(0, size.height / 2);
// path.relativeCubicTo(
// 0, 0, -size.width / 6, -rowHeight, -size.width / 3, 0);
// path.relativeCubicTo(
// 0, 0, -size.width / 6, rowHeight, -size.width / 3, 0);
// path.relativeCubicTo(
// 0, 0, -size.width / 6, -rowHeight, -size.width / 3, 0);
//
// path.relativeCubicTo(
// 0, 0, -size.width / 6, rowHeight, -size.width / 3, 0);
// path.relativeCubicTo(
// 0, 0, -size.width / 6, -rowHeight, -size.width / 3, 0);
// path.relativeCubicTo(
// 0, 0, -size.width / 6, rowHeight, -size.width / 3, 0);
//
// path.relativeCubicTo(
// 0, 0, -size.width / 6, -rowHeight, -size.width / 3, 0);
// path.relativeCubicTo(
// 0, 0, -size.width / 6, rowHeight, -size.width / 3, 0);
// path.relativeCubicTo(
// 0, 0, -size.width / 6, -rowHeight, -size.width / 3, 0);
//
// path.close();
//
// canvas.save();
// canvas.translate(-size.width * 2 * animValue, 0);
// canvas.drawPath(path, circlePaint);
// canvas.restore();
// }
} else if (state == 1) {
canvas.save();
canvas.translate(size.width - 30, size.height - 30);
Path path = new Path();
path.moveTo(-10, -10);
path.lineTo(0, 0);
path.lineTo(22, -22);
canvas.drawPath(path, rectPaint);
// TextPainter(
// text: TextSpan(
// text: "这个图片不符合标准哦~",
// style: TextStyle(
// fontSize: 13,
// color: Colors.yellow,
// fontWeight: FontWeight.w300)),
// textDirection: TextDirection.ltr,
// textAlign: TextAlign.center)
// ..layout(maxWidth: 150, minWidth: 30)
// ..paint(canvas, Offset(-60, - 30));
canvas.restore();
} else if (state == 2) {
canvas.save();
canvas.translate(size.width / 2, size.height / 2);
canvas.rotate(0.3);
TextPainter(
text: TextSpan(
text: "这个图片不符合标准哦~",
style: TextStyle(
fontSize: 13,
color: Colors.yellow,
fontWeight: FontWeight.w300)),
textDirection: TextDirection.ltr,
textAlign: TextAlign.center)
..layout(maxWidth: 150, minWidth: 30)
..paint(canvas, Offset(-60, -30));
canvas.drawLine(Offset(-30, 30), Offset(30, -30), rectPaint);
canvas.drawLine(Offset(30, 30), Offset(-30, -30), rectPaint);
canvas.restore();
}
}
@override
bool shouldRepaint(CustomPainter oldDelegate) {
return true;
}
}
......@@ -4,6 +4,7 @@
**/
import 'dart:io';
import 'package:example_flutter/HomeModel/base/BaseTitle.dart';
import 'package:example_flutter/HomeModel/page/work/WorkModel.dart';
import 'package:example_flutter/HomeModel/page/work/WorkPage.dart';
import 'package:example_flutter/HomeModel/service/HomeRepo.dart';
......@@ -27,6 +28,10 @@ class PicModel extends BaseModel {
countLive.notifyView(_repo.currentPage);
}
HomeRepo getRepo(){
return _repo;
}
void getImages(BuildContext context, bool showPop) {
if (showPop) {
BaseCenterPicker()
......
......@@ -6,6 +6,8 @@ import 'package:example_flutter/HomeModel/base/BaseTitle.dart';
import 'package:example_flutter/HomeModel/service/remote/entity/ImageResultBean.dart';
import 'package:example_flutter/HomeModel/service/remote/entity/TotalImageBean.dart';
import 'package:example_flutter/commonModel/base/BaseComponent.dart';
import 'package:example_flutter/commonModel/base/BaseState.dart';
import 'package:example_flutter/commonModel/base/SaveKey.dart';
import 'package:example_flutter/res/GMRes.dart';
import 'package:flutter/material.dart';
......@@ -16,7 +18,7 @@ class PicPage extends StatefulWidget {
State<StatefulWidget> createState() => PicState();
}
class PicState extends State<PicPage> {
class PicState extends BaseState<PicPage> {
PicModel _model;
Size screenSize;
......@@ -29,10 +31,21 @@ class PicState extends State<PicPage> {
super.initState();
_model.getImages(context, false);
_model.getTotalImages(context);
// getString(context, PAGE_SAVE, (value) {
// try {
// print("GETVALUEEE ${value}");
// var parse = int.parse(value);
// _model.getRepo().currentPage = parse;
// _model.getImages(context, false);
// _model.getTotalImages(context);
// } catch (e) {
// }
// });
}
@override
void dispose() {
saveString(PAGE_SAVE, "${_model.getRepo().currentPage}");
_model.dispose();
super.dispose();
}
......@@ -41,10 +54,11 @@ class PicState extends State<PicPage> {
Widget build(BuildContext context) {
screenSize = MediaQuery.of(context).size;
return Scaffold(
appBar: getBaseTitle(context),
// appBar: getBaseTitle(context),
body: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
basehead(context),
sync(context),
Expanded(
child: imageList(context),
......@@ -85,8 +99,8 @@ class PicState extends State<PicPage> {
height: double.maxFinite,
alignment: Alignment.center,
child: Container(
width: screenSize.height - 80-58,
height: screenSize.height - 80-58,
width: screenSize.height - 80 - 58,
height: screenSize.height - 80 - 58,
child: GridView.count(
crossAxisCount: 3,
mainAxisSpacing: 2.0,
......
......@@ -6,6 +6,7 @@ import 'dart:async';
import 'dart:io';
import 'dart:math';
import 'dart:ui' as ui;
import 'package:example_flutter/HomeModel/base/BaseTitle.dart';
import 'package:example_flutter/HomeModel/base/bean/PointItem.dart';
import 'package:example_flutter/HomeModel/page/work/temp.dart';
import 'package:example_flutter/HomeModel/service/HomeRepo.dart';
......@@ -586,8 +587,9 @@ class WorkModel extends BaseModel {
List<int> uploadList = [];
pointItem.list.forEach((off) {
uploadList.add((off.dx * picScare).toInt());
if (topAdd > 0) {
uploadList.add(((off.dy + topAdd) * picScare).toInt());
print("TOPPPP AADD ${topAdd} ${topBuf}");
if (topAdd < 0) {
uploadList.add(((off.dy - topAdd) * picScare).toInt());
} else {
uploadList.add(((off.dy - topBuf) * picScare).toInt());
}
......@@ -602,30 +604,58 @@ class WorkModel extends BaseModel {
String uploadPath =
"${dir}/sign${DateTime.now().millisecondsSinceEpoch}.jpeg";
toImage(uploadList, uploadPath, savePath).whenComplete(() {
File(savePath).delete();
HomeRepo.getInstance()
.maskImage(uploadPath, imageId, maskExplain[maskTabLive.data],
listToUi(pointItem.list))
.listen((value) {
if (value != null) {
Toast.show(context, "保存成功");
Navigator.pop(context);
// HomeRepo.getInstance()
// .maskImage(uploadPath, imageId, maskExplain[maskTabLive.data],
// listToUi(pointItem.list))
// .listen((value) {
// if (value != null) {
// Toast.show(context, "保存成功");
// Navigator.pop(context);
// File(uploadPath).delete();
// Navigator.pop(context);
// }
// }).onError((error) {
// Toast.show(context, error.toString());
// print(error.toString());
// Navigator.pop(context);
// });
//TODO HERE WWWWw
String realSavePath =
"${dir}/mask${DateTime.now().millisecondsSinceEpoch}.png";
_repo.uploadMyImage(uploadPath, "${imageId}").listen((value){
_repo.downloadMyImage(realSavePath,value.fileId,(){
print("UPLOAD MY OKKKKK");
// toImageTest(uploadList, "${dir}/test${DateTime.now().millisecondsSinceEpoch}.jpeg",savePath ).whenComplete((){});
File(savePath).delete();
File(uploadPath).delete();
Navigator.pop(context);
}
}).onError((error) {
// Timer(Duration(seconds: 2),(){
HomeRepo.getInstance()
.maskImage(
realSavePath, imageId, maskExplain[maskTabLive.data],
listToUi(pointItem.list))
.listen((value) {
if (value != null) {
Toast.show(context, "保存成功");
Navigator.pop(context);
Navigator.pop(context);
}
}).onError((error) {
Toast.show(context, error.toString());
print(error.toString());
Navigator.pop(context);
});
// });
});
}).onError((error){
Toast.show(context, error.toString());
print(error.toString());
Navigator.pop(context);
});
// String realUploadPath =
// "${dir}/mask${DateTime.now().millisecondsSinceEpoch}.png";
// opencvMethod(uploadPath, realUploadPath).whenComplete(() {
// print("!!!!!!!! ${uploadPath} ${realUploadPath}");
// Navigator.pop(context);
// }).catchError((error) {
// print(error.toString());
// });
}).catchError((error) {
Navigator.pop(context);
Toast.show(context, "保存失败");
......@@ -714,6 +744,7 @@ class WorkModel extends BaseModel {
HomeRepo.getInstance()
.getMaskInfo(imageId, maskExplain[maskTabLive.data])
.listen((value) {
print(value.picurl);
if (value != null && value.ui != null && value.ui.isNotEmpty) {
pointItem.list = uiToList(value.ui);
pointItem.drawPath = true;
......@@ -727,69 +758,3 @@ class WorkModel extends BaseModel {
});
}
}
class SurePicker implements ICenterPicker {
VoidCallback cancel;
VoidCallback sure;
final String showText;
SurePicker(this.showText, this.cancel, this.sure);
@override
Widget build(BuildContext context) {
return Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.all(Radius.circular(20))),
width: 350,
height: 260,
child: Column(
children: <Widget>[
Expanded(
child: Container(
alignment: Alignment.center,
child: baseText(showText, 15, Colors.black),
),
),
Container(
height: 1,
width: double.maxFinite,
color: Colors.black54,
),
Container(
width: double.maxFinite,
height: 50,
child: Row(
children: <Widget>[
Expanded(
child: GestureDetector(
onTap: cancel,
child: Container(
color: Colors.transparent,
alignment: Alignment.center,
child: baseText("取消", 12, Colors.black38),
)),
),
Container(
width: 1,
height: double.maxFinite,
color: Colors.black54,
),
Expanded(
child: GestureDetector(
onTap: sure,
child: Container(
color: Colors.transparent,
alignment: Alignment.center,
child: baseText("确定", 12, Colors.red),
),
),
)
],
),
)
],
),
);
}
}
This diff is collapsed.
......@@ -4,6 +4,7 @@
**/
import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';
import 'package:dio/dio.dart';
import 'package:example_flutter/HomeModel/page/work/temp.dart';
......@@ -15,9 +16,11 @@ import 'package:example_flutter/HomeModel/service/remote/entity/ImageResultBean.
import 'package:example_flutter/HomeModel/service/remote/entity/MaskResultBean.dart';
import 'package:example_flutter/HomeModel/service/remote/entity/PutImageDataBean.dart';
import 'package:example_flutter/HomeModel/service/remote/entity/TotalImageBean.dart';
import 'package:example_flutter/HomeModel/service/remote/entity/UploadMyImageBean.dart';
import 'package:example_flutter/HomeModel/service/remote/entity/UploadResultBean.dart';
import 'package:example_flutter/commonModel/GMBase.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter_animation_set/animator.dart';
import 'package:rxdart/rxdart.dart';
ImageResultBean paseImageResult(String value) {
......@@ -25,9 +28,14 @@ ImageResultBean paseImageResult(String value) {
}
class HomeRepo {
Dio mydio;
static HomeRepo _repo;
HomeRepo._();
HomeRepo._(){
mydio=Dio(getw());
}
static HomeRepo getInstance() {
if (_repo == null) {
......@@ -106,6 +114,8 @@ class HomeRepo {
"tag": tag,
"ui": ui
});
var existsSync = File(path).existsSync();
print("EXITTTT $existsSync");
return Observable.fromFuture(DioUtil.getInstance()
.getDio()
.post('maskimages/${id}/', data: formData))
......@@ -153,6 +163,62 @@ class HomeRepo {
return HomeApiImpl().getTotalImages();
}
void downloadMyImage(String path,String id,Function() ok){
mydio.download("api/downfile", path,options:Options(method:"POST" ),data: FormData.from( {"id":id})).then((value){
print(value);
}).whenComplete((){
ok();
});
// Observable.fromFuture(dio
// .post('', data:FormData.from( {"id":id})))
// .listen((value) {
//
// if (value != null &&
// (value.statusCode >= 200 && value.statusCode < 300)) {
//
//// HttpClientResponse resp = ;
//// final Uint8List bytes = consolidateHttpClientResponseBytes(resp) as Uint8List;
// File(path).writeAsStringSync(value.data.toString() );
// ok();
// }
// });
}
Observable<UploadMyImageBean> uploadMyImage(String path,String id){
var name = path.substring(path.lastIndexOf("/") + 1, path.length);
FormData formData = new FormData.from({
"file": new UploadFileInfo(new File(path), name),
"id": id,
});
return Observable.fromFuture(mydio
.post('api/fileUpload', data: formData))
.flatMap((value) {
if (value != null &&
(value.statusCode >= 200 && value.statusCode < 300)) {
return Observable.fromFuture(
compute(parseMyUpload, value.toString()));
} else {
return Observable.fromFuture(null);
}
});
}
BaseOptions getw() {
BaseOptions options = BaseOptions();
options.connectTimeout = 10 * 1000;
options.receiveTimeout = 20 * 1000;
// options.contentType = ContentType.parse('application/x-www-form-urlencoded');
// options.contentType = ContentType.json;
options.responseType = ResponseType.plain;
options.baseUrl = "http://114.67.74.194:8888/";
Map<String, dynamic> headers = Map<String, dynamic>();
headers['Accept'] = 'application/json';
headers['version'] = '1.0.0';
options.headers = headers;
return options;
}
// Observable<>
}
......@@ -171,3 +237,8 @@ PutImageDataBean parsePutImageBean(String value) {
MaskResultBean parseMaskResult(String value) {
return MaskResultBean.fromJson(json.decode(value));
}
UploadMyImageBean parseMyUpload(String value){
return UploadMyImageBean.fromJson(json.decode(value));
}
\ No newline at end of file
/*
* @author lsy
* @date 2019-12-02
**/
class AllProjectBean {
String a;
AllProjectBean(this.a);
}
/*
* @author lsy
* @date 2019-12-03
**/
class DataBean{
}
\ No newline at end of file
/*
* @author lsy
* @date 2019-11-29
**/
class UploadMyImageBean {
String fileId;
String filePath;
UploadMyImageBean({this.fileId, this.filePath});
UploadMyImageBean.fromJson(Map<String, dynamic> json) {
fileId = json['fileId'];
filePath = json['filePath'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['fileId'] = this.fileId;
data['filePath'] = this.filePath;
return data;
}
}
/*
* @author lsy
* @date 2019-12-02
**/
import 'package:example_flutter/res/anim/Anim.dart';
import 'package:flutter/cupertino.dart';
class JumpUtil {
static void jumpToPage(BuildContext context, Widget widget) {
Navigator.of(context).push(CustomRoute(widget, routeWay: RouteWay.ALP));
}
static void jumpReplace(BuildContext context,Widget widget){
Navigator.pushAndRemoveUntil(context, CustomRoute(widget, routeWay: RouteWay.ALP)
,ModalRoute.withName(""));
}
}
/*
* @author lsy
* @date 2019-11-05
**/
import 'dart:async';
import 'package:example_flutter/commonModel/base/BaseState.dart';
import 'package:example_flutter/res/value/ALColors.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'HomeModel.dart';
import 'commonModel/GMBase.dart';
import 'commonModel/eventbus/event/ChangeTabBean.dart';
import 'main.dart';
class HomePage extends StatefulWidget {
HomeModel _model;
HomePage() {
_model = new HomeModel();
}
@override
State<StatefulWidget> createState() => HomeState(_model);
}
class HomeState extends BaseState<HomePage> {
StreamSubscription<ChangeTabBean> changeTabEvent;
HomeModel _model;
HomeState(this._model);
@override
void initState() {
changeTabEvent = eventBus.on<ChangeTabBean>().listen((event) {
_model.currentIndex = event.index;
_model.onTap(event.index);
});
super.initState();
_model.init();
}
@override
Widget build(BuildContext context) {
return Scaffold(
// bottomNavigationBar: StreamBuilder<int>(
// stream: _model.indexLive.stream,
// initialData: _model.indexLive.data,
// builder: (con, data) {
// int index = data.data ?? 0;
// return BottomNavigationBar(
// items: _model.items,
// currentIndex: index,
// onTap: (index) {
// _model.onTap(index);
// });
// }),
body: StreamBuilder<int>(
stream: _model.widgetLive.stream,
initialData: _model.widgetLive.data,
builder: (con, data) {
int index = data.data ?? 0;
List<Widget> tabList = new List();
_model.items.forEach((value) {
tabList.add(baseItem(value.index, value.svgIcon, value.name));
});
return Column(
children: <Widget>[
Expanded(
child: IndexedStack(
index: index,
children: _model.pages,
)),
// Container(
// decoration: BoxDecoration(boxShadow: [
// BoxShadow(
// color: Colors.black12,
// offset: Offset(0.0, 0.0), //阴影xy轴偏移量
// blurRadius: 1.0, //阴影模糊程度
// spreadRadius: 1.0 //阴影扩散程度
// )
// ]),
// height: 1,
// ),
// Container(
// color: ALColors.ColorF4F3F8,
// height: 60,
// child: Row(
// crossAxisAlignment: CrossAxisAlignment.center,
// children: tabList,
// ),
// )
],
);
}));
}
Widget baseItem(int index, String pic, String text) {
return Expanded(
child: GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
_model.currentIndex = index;
_model.onTap(index);
},
child: Container(
height: 60,
alignment: Alignment.center,
child: Column(
children: <Widget>[
Expanded(
child: Container(),
),
_model.currentIndex == index
? SvgPicture.asset(pic, color: ALColors.Color323232)
: SvgPicture.asset(pic, color: ALColors.Color999999),
Container(
margin: EdgeInsets.only(top: 3),
child: baseText(
text,
12,
_model.currentIndex == index
? Colors.black
: Colors.grey),
),
Expanded(
child: Container(),
),
],
))));
}
@override
void dispose() {
changeTabEvent.cancel();
_model.dispose();
super.dispose();
}
}
......@@ -12,4 +12,5 @@ import 'package:flutter/cupertino.dart';
abstract class UserRouter extends RouterBaser{
Widget getLoginPage();
Widget getPersionPage();
}
\ No newline at end of file
......@@ -5,6 +5,7 @@
import 'package:example_flutter/UserModel/UserRouter.dart';
import 'package:example_flutter/UserModel/page/login/LoginPage.dart';
import 'package:example_flutter/UserModel/page/usermanager/Persionset.dart';
import 'package:flutter/src/widgets/framework.dart';
class UserRouterImpl implements UserRouter {
......@@ -12,4 +13,9 @@ class UserRouterImpl implements UserRouter {
Widget getLoginPage() {
return LoginPage();
}
@override
Widget getPersionPage() {
return Persionset();
}
}
......@@ -6,6 +6,7 @@
import 'dart:io';
import 'package:example_flutter/Annotations/RouterCenterRestore.mark.dart';
import 'package:example_flutter/HomeModel/page/picture/PicPage.dart';
import 'package:example_flutter/UserModel/service/Resp.dart';
import 'package:example_flutter/commonModel/GMBase.dart';
import 'package:example_flutter/commonModel/cache/CacheManager.dart';
......@@ -13,6 +14,8 @@ import 'package:example_flutter/commonModel/toast/toast.dart';
import 'package:example_flutter/res/anim/Anim.dart';
import 'package:flutter/cupertino.dart';
import '../../../HomePage.dart';
class LoginModel extends BaseModel {
resign(BuildContext context, String text, String text2) {
Resp.getInstance().resign(text, text2).listen((value) {
......@@ -30,6 +33,8 @@ class LoginModel extends BaseModel {
}
login(BuildContext context, String text, String text2) async {
// CacheManager.getInstance().get(MEMORY_CACHE).save("userName", text);
// Navigator.push(context, CustomRoute(HomePage()));
Resp.getInstance().login(text, text2).listen((value) {
Navigator.pop(context);
if (value != null && value.token != null) {
......@@ -37,9 +42,10 @@ class LoginModel extends BaseModel {
CacheManager.getInstance().get(MEMORY_CACHE).save("userName", text);
CacheManager.getInstance().get(MEMORY_CACHE).save("userWorld", text2);
Toast.show(context, "登入成功");
Navigator.push(context, CustomRoute(
RouterCenterImpl().findHomeRouter()?.getHomePage()
));
// Navigator.push(context, CustomRoute(PicPage()));
// Navigator.push(context,
// CustomRoute(RouterCenterImpl().findHomeRouter()?.getHomePage()));
Navigator.push(context, CustomRoute(HomePage()));
} else {
Toast.show(context, "接口请求错误 ==> login");
}
......
......@@ -53,7 +53,7 @@ class LoginState extends State<LoginPage> {
child: BackdropFilter(
filter: new ImageFilter.blur(sigmaX: 100, sigmaY: 100),
child: Image.network(
"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1573655792197&di=f9469fa087a082aedfd22514c1549e1f&imgtype=0&src=http%3A%2F%2Fimg8.zol.com.cn%2Fbbs%2Fupload%2F19571%2F19570481.jpg",
"http://b-ssl.duitang.com/uploads/item/201208/30/20120830173930_PBfJE.jpeg",
fit: BoxFit.cover,
)),
),
......
/*
* @author lsy
* @date 2019-12-06
**/
import 'package:example_flutter/HomeModel/base/BaseTitle.dart';
import 'package:example_flutter/commonModel/base/BaseComponent.dart';
import 'package:example_flutter/commonModel/base/BaseState.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class Persionset extends StatefulWidget {
@override
State<StatefulWidget> createState() => PersionsetState();
}
class PersionsetState extends BaseState<Persionset> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: MyAppBar(),
body: Container(
alignment: Alignment.center,
child: baseText("人员管理页面 待实现", 20, Colors.black),
),
);
}
}
......@@ -5,7 +5,6 @@
library GMBase;
export 'base/BaseComponent.dart';
export 'base/BaseUtil.dart';
export 'live/BaseModel.dart';
export 'live/LiveData.dart';
export 'net/Api.dart';
......
......@@ -17,6 +17,23 @@ Future getTempDir() {
return channel.invokeMethod("getTemporaryDirectory");
}
Future<bool> saveString(String key, String value) {
return channel.invokeMethod("setString", {"key": key, "value": value});
}
void getString(BuildContext context,String key, Function(String str) fun) {
channel.invokeMethod("getString",{"key": key}).then((value) {
fun(value);
}).catchError((error) {
Toast.show(context, error.toString());
print(error.toString());
});
}
Future<bool> clearSave() {
return channel.invokeMethod("clear");
}
void getTempDirX(BuildContext context, Function(String dir) f) {
getTempDir().then((value) {
f(value);
......
/*
* @author lsy
* @date 2019-12-05
**/
import 'dart:async';
import 'package:example_flutter/commonModel/eventbus/event/LogoutEvent.dart';
import 'package:flutter/material.dart';
import '../../main.dart';
abstract class BaseState<T extends StatefulWidget> extends State<T>{
StreamSubscription<LogoutEvent> busEvent;
@override
void initState() {
busEvent = eventBus.on<LogoutEvent>().listen((event) {
Navigator.pop(context);
});
super.initState();
}
@override
void dispose() {
busEvent.cancel();
super.dispose();
}
@override
Widget build(BuildContext context) {
// TODO: implement build
throw UnimplementedError();
}
}
\ No newline at end of file
/*
* @author lsy
* @date 2019-10-14
**/
import 'dart:ui';
import 'package:flutter/material.dart';
void jumpToPage(Widget page, BuildContext context) {
Navigator.push(context, MaterialPageRoute(builder: ((context) {
return page;
})));
}
/*
* @author lsy
* @date 2019-11-28
**/
const String PAGE_SAVE="PAGE_SAVE";
\ No newline at end of file
/*
* @author lsy
* @date 2019-12-05
**/
class ChangeTabBean{
int index;
ChangeTabBean(this.index);
}
\ No newline at end of file
/*
* @author lsy
* @date 2019-12-02
**/
class LogoutEvent {
LogoutEvent();
}
......@@ -44,7 +44,7 @@ class BaseCenterPickerState extends State<BaseCenterPicker> {
Widget build(BuildContext context) {
// ScreenUtil.instance = ScreenUtil(width: 375, height: 667)..init(context);
return Container(
color: Colors.black54,
color: Colors.black12,
width: double.maxFinite,
height: double.maxFinite,
child: Stack(
......
/*
* @author lsy
* @date 2019-12-02
**/
import 'package:example_flutter/commonModel/GMBase.dart';
import 'package:example_flutter/commonModel/picker/base/BaseCenterPicker.dart';
import 'package:example_flutter/commonModel/picker/base/DialogRouter.dart';
import 'package:flutter/material.dart';
class BaseDrawPicker extends StatefulWidget {
BaseDrawPickerState centerState;
IDrawPicker picker;
bool cancelOutSide = true;
setPicker(IDrawPicker picker) {
this.picker = picker;
}
sync() {
centerState?.setState(() {});
}
setCancelOutside(bool cancel) {
this.cancelOutSide = cancel;
}
show(BuildContext context) {
Navigator.push(context, DialogRouter(this));
}
dismiss(BuildContext context) {
Navigator.pop(context);
}
@override
State<StatefulWidget> createState() {
centerState = BaseDrawPickerState();
return centerState;
}
}
class BaseDrawPickerState extends State<BaseDrawPicker>
with SingleTickerProviderStateMixin {
Animation<Offset> animation;
LiveData<int> liveData = new LiveData();
AnimationController controller;
@override
void initState() {
super.initState();
controller = new AnimationController(
duration: const Duration(milliseconds: 300), vsync: this);
animation =
new Tween(begin: Offset(-1, 0), end: Offset(0, 0)).animate(controller)
..addListener(() {
double dy = 1 - animation.value.dx.abs();
if (dy < 0.2) {
liveData.notifyView(null);
return;
}
String alp = "${(dy.abs() * (99)).toInt()}";
if (alp.length == 1) {
alp = "0$alp";
}
String colorString = "0x${alp}000000";
print(colorString);
liveData.notifyView(int.parse(colorString));
});
controller.forward();
}
@override
void dispose() {
widget.picker.dispose();
liveData.dispost();
controller.dispose();
super.dispose();
}
dis() {
controller.reverse()
..whenComplete(() {
Navigator.pop(context);
});
}
@override
Widget build(BuildContext context) {
// ScreenUtil.instance = ScreenUtil(width: 375, height: 667)..init(context);
return Container(
// color: Colors.black54,
width: double.maxFinite,
height: double.maxFinite,
child: Stack(
alignment: Alignment.topLeft,
children: <Widget>[
GestureDetector(
onTap: () {
if (widget.cancelOutSide) {
dis();
// widget.dismiss(context);
}
},
child: StreamBuilder(
stream: liveData.stream,
builder: (con, data) {
if (data.data == null) {
return Container();
}
return Container(
width: double.maxFinite,
height: double.maxFinite,
color: Color(data.data),
);
},
)),
SlideTransition(
position: animation,
child: Container(
child: Material(
color: Colors.transparent,
child: widget.picker.build(context, () {
dis();
}),
)))
],
),
);
}
}
abstract class IDrawPicker {
Widget build(BuildContext context, VoidCallback dismiss);
dispose();
}
......@@ -12,8 +12,12 @@
// See the License for the specific language governing permissions and
// limitations under the License.
import 'package:event_bus/event_bus.dart';
import 'package:example_flutter/Annotations/RouterCenterRestore.mark.dart';
import 'package:example_flutter/HomeModel/page/data/DataCenter.dart';
import 'package:example_flutter/HomeModel/page/home/HomePage.dart';
import 'package:example_flutter/commonModel/base/BaseComponent.dart';
import 'package:example_flutter/res/anim/Anim.dart';
import 'package:flutter/foundation.dart'
show debugDefaultTargetPlatformOverride;
import 'package:flutter/material.dart';
......@@ -21,6 +25,9 @@ import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:file_chooser/file_chooser.dart';
import 'commonModel/base/SaveKey.dart';
EventBus eventBus = EventBus();
void main() {
// See https://github.com/flutter/flutter/wiki/Desktop-shells#target-platform-override
debugDefaultTargetPlatformOverride = TargetPlatform.fuchsia;
......@@ -32,7 +39,6 @@ class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
showSemanticsDebugger: false,
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
......
This diff is collapsed.
......@@ -15,7 +15,7 @@
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
BuildableName = "Flutter Desktop Example.app"
BuildableName = "&#x66f4;&#x7f8e;AI&#x6807;&#x6ce8;&#x5e73;&#x53f0;.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
......@@ -27,6 +27,15 @@
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
BuildableName = "&#x66f4;&#x7f8e;AI&#x6807;&#x6ce8;&#x5e73;&#x53f0;.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</MacroExpansion>
<Testables>
<TestableReference
skipped = "NO">
......@@ -39,17 +48,6 @@
</BuildableReference>
</TestableReference>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
BuildableName = "Flutter Desktop Example.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
......@@ -66,13 +64,11 @@
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
BuildableName = "Flutter Desktop Example.app"
BuildableName = "&#x66f4;&#x7f8e;AI&#x6807;&#x6ce8;&#x5e73;&#x53f0;.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
......@@ -85,7 +81,7 @@
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
BuildableName = "Flutter Desktop Example.app"
BuildableName = "&#x66f4;&#x7f8e;AI&#x6807;&#x6ce8;&#x5e73;&#x53f0;.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
......
......@@ -5,7 +5,7 @@
// 'flutter create' template.
// The application's name. By default this is also the title of the Flutter window.
PRODUCT_NAME = Flutter Desktop Example
PRODUCT_NAME = 更美AI标注平台
// The application's bundle identifier
PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterDesktopExample
......
......@@ -19,7 +19,8 @@ dependencies:
dio: ^2.2.2
rxdart: ^0.22.0 #链式编程
flutter_svg: ^0.14.1
pull_to_refresh: ^1.5.0
liquid_progress_indicator: ^0.3.2
file_chooser:
git:
url: https://github.com/hpoul/flutter-desktop-embedding.git
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment