Commit 69d460ba authored by netyouli's avatar netyouli

优化图片作品,收藏,广场列表分页功能,图片生成界面蒙层效果

parent 0e9173ca
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSExtension</key>
<dict>
<key>NSExtensionAttributes</key>
<dict>
<key>IsASCIICapable</key>
<false/>
<key>PrefersRightToLeft</key>
<false/>
<key>PrimaryLanguage</key>
<string>en-US</string>
<key>RequestsOpenAccess</key>
<false/>
</dict>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.keyboard-service</string>
<key>NSExtensionPrincipalClass</key>
<string>$(PRODUCT_MODULE_NAME).KeyboardViewController</string>
</dict>
</dict>
</plist>
//
// KeyboardViewController.swift
// MyKeyboradExtension
//
// Created by WHC on 2023/7/19.
//
import UIKit
class KeyboardViewController: UIInputViewController {
@IBOutlet var nextKeyboardButton: UIButton!
override func updateViewConstraints() {
super.updateViewConstraints()
// Add custom view sizing constraints here
}
override func viewDidLoad() {
super.viewDidLoad()
// Perform custom UI setup here
self.nextKeyboardButton = UIButton(type: .system)
self.nextKeyboardButton.setTitle(NSLocalizedString("Next Keyboard", comment: "Title for 'Next Keyboard' button"), for: [])
self.nextKeyboardButton.sizeToFit()
self.nextKeyboardButton.translatesAutoresizingMaskIntoConstraints = false
self.nextKeyboardButton.addTarget(self, action: #selector(handleInputModeList(from:with:)), for: .allTouchEvents)
self.view.addSubview(self.nextKeyboardButton)
self.nextKeyboardButton.leftAnchor.constraint(equalTo: self.view.leftAnchor).isActive = true
self.nextKeyboardButton.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true
}
override func viewWillLayoutSubviews() {
self.nextKeyboardButton.isHidden = !self.needsInputModeSwitchKey
super.viewWillLayoutSubviews()
}
override func textWillChange(_ textInput: UITextInput?) {
// The app is about to change the document's contents. Perform any preparation here.
}
override func textDidChange(_ textInput: UITextInput?) {
// The app has just changed the document's contents, the document context has been updated.
var textColor: UIColor
let proxy = self.textDocumentProxy
if proxy.keyboardAppearance == UIKeyboardAppearance.dark {
textColor = UIColor.white
} else {
textColor = UIColor.black
}
self.nextKeyboardButton.setTitleColor(textColor, for: [])
}
}
...@@ -77,6 +77,32 @@ class NewsAPI { ...@@ -77,6 +77,32 @@ class NewsAPI {
return MidJourneyModel.fromJson(response); return MidJourneyModel.fromJson(response);
} }
// sd生成图片
static Future<SdCreateImageModel> createlmageBySdTxtTolmg(String question, int conversionId) async {
var response = await HttpUtil().post('/sd/createImageBySdTxtToImage', data: {
// "conversionId": conversionId,
// "next": 0,
"prompt": question,
"batch_size": 1,
"override_settings": {
"sd_model_checkpoint":"v1-5-pruned-emaonly.safetensors [6ce0161689]"
}
});
return SdCreateImageModel.fromJson(response);
}
// sd获取图片生成进度
static Future<SdImageProgressModel> getSdlmgProgress() async {
var response = await HttpUtil().get('/sd/getSdImageProgress');
return SdImageProgressModel.fromJson(response);
}
// sd获取所有模型
static Future<SdImageProgressModel> getSdModels() async {
var response = await HttpUtil().get('/sd/getSdModels');
return SdImageProgressModel.fromJson(response);
}
// https://api.kertennet.com/live/translate?text=美女喜欢帅哥&to=en // https://api.kertennet.com/live/translate?text=美女喜欢帅哥&to=en
// 'https://frozenland.cc/index.php/translate?query=' // 'https://frozenland.cc/index.php/translate?query='
static Future<TranslateModel> translate(String content) async { static Future<TranslateModel> translate(String content) async {
...@@ -90,6 +116,7 @@ class NewsAPI { ...@@ -90,6 +116,7 @@ class NewsAPI {
return TranslateModel.fromJson(response.data); return TranslateModel.fromJson(response.data);
} }
static Future<CommonResponse> shareImageSquare(String imgId) async { static Future<CommonResponse> shareImageSquare(String imgId) async {
var response = await HttpUtil().get( var response = await HttpUtil().get(
'/imgInfo/shareSquare/$imgId', '/imgInfo/shareSquare/$imgId',
...@@ -98,11 +125,12 @@ class NewsAPI { ...@@ -98,11 +125,12 @@ class NewsAPI {
} }
// 收藏图片 // 收藏图片
static Future<CommonResponse> updateCollectImg(String imgUrl, int isCancel) async { static Future<CommonResponse> updateCollectImg(String imgUrl, int isCancel, String prompt) async {
var response = await HttpUtil().post('/imgInfo/updateCollectImg', data: { var response = await HttpUtil().post('/imgInfo/updateCollectImg', data: {
"imgUrl": imgUrl, "imgUrl": imgUrl,
"isCancel": isCancel, "isCancel": isCancel,
"userId": "${UserStore.to.profile.id}" "userId": "${UserStore.to.profile.id}",
"prompt": prompt
}); });
return CommonResponse.fromJson(response); return CommonResponse.fromJson(response);
} }
......
...@@ -240,23 +240,36 @@ class UserAPI { ...@@ -240,23 +240,36 @@ class UserAPI {
// UserLoginResponseEntity.fromJson(response); // UserLoginResponseEntity.fromJson(response);
} }
static Future<MyWorkResponse> getMyWorkImages() async { // 我的作品列表
static Future<MyWorkResponse> getMyWorkImages(int page) async {
var response = await HttpUtil().get( var response = await HttpUtil().get(
'/imgInfo/getImgInfoList', '/imgInfo/getImgInfoList',
queryParameters: {
"page": page,
"size": 10
},
); );
return MyWorkResponse.fromJson(response); return MyWorkResponse.fromJson(response);
} }
static Future<MyCollectResponse> getMyCollectImages() async { static Future<MyCollectResponse> getMyCollectImages(int page) async {
var response = await HttpUtil().get( var response = await HttpUtil().get(
'/imgInfo/getCollectImg', '/imgInfo/getCollectImg',
queryParameters: {
"page": page,
"size": 10
}
); );
return MyCollectResponse.fromJson(response); return MyCollectResponse.fromJson(response);
} }
static Future<MyWorkResponse> getSquareImages() async { static Future<MyWorkResponse> getSquareImages(int page) async {
var response = await HttpUtil().get( var response = await HttpUtil().get(
'/imgInfo/squareImgList', '/imgInfo/squareImgList',
queryParameters: {
"page": page,
"size": 10
}
); );
return MyWorkResponse.fromJson(response); return MyWorkResponse.fromJson(response);
} }
......
...@@ -38,7 +38,7 @@ class HttpUtil { ...@@ -38,7 +38,7 @@ class HttpUtil {
connectTimeout: 10000, connectTimeout: 10000,
// 响应流上前后两次接受到数据的间隔,单位为毫秒。 // 响应流上前后两次接受到数据的间隔,单位为毫秒。
receiveTimeout: 150000, receiveTimeout: 5000000,
// Http请求头. // Http请求头.
headers: {}, headers: {},
......
// baidu yapi // baidu yapi
// const SERVER_API_URL = 'https://yapi.baidu.com/mock/41008'; // const SERVER_API_URL = 'https://yapi.baidu.com/mock/41008';
const SERVER_API_URL = 'http://101.34.153.228:8083/api';//线上 // const SERVER_API_URL = 'http://101.34.153.228:8083/api';//线上
// const SERVER_API_URL = 'http://192.168.110.116:8083/api';//内 // const SERVER_API_URL = 'http://192.168.110.116:8083/api';//内
// const SERVER_API_URL = 'http://192.168.110.12:8083/api';//线上 // const SERVER_API_URL = 'http://192.168.110.12:8083/api';//线上
...@@ -11,7 +11,7 @@ const SERVER_API_URL = 'http://101.34.153.228:8083/api';//线上 ...@@ -11,7 +11,7 @@ const SERVER_API_URL = 'http://101.34.153.228:8083/api';//线上
// http://192.168.110.127:8083/api/doc.html // http://192.168.110.127:8083/api/doc.html
// http://192.168.110.66:8083/api/doc.html // http://192.168.110.66:8083/api/doc.html
// const SERVER_API_URL = 'http://192.168.110.23:8083/api'; // 大黄蜂 const SERVER_API_URL = 'http://192.168.110.1:8083/api'; // 大黄蜂
// const SERVER_API_URL = 'http://192.168.110.193:8083/api'; // 清 // const SERVER_API_URL = 'http://192.168.110.193:8083/api'; // 清
// http://192.168.110.25:8083/ // http://192.168.110.25:8083/
......
import 'package:flutter/material.dart';
class KeepAliveWrapper extends StatefulWidget {
final Widget child;
const KeepAliveWrapper(this.child, {Key? key}) : super(key: key);
@override
_KeepAliveWrapperState createState() => _KeepAliveWrapperState();
}
class _KeepAliveWrapperState extends State<KeepAliveWrapper>
with AutomaticKeepAliveClientMixin {
@override
Widget build(BuildContext context) {
super.build(context);
return widget.child;
}
@override
bool get wantKeepAlive => true;
}
...@@ -27,6 +27,11 @@ enum OpearterType { ...@@ -27,6 +27,11 @@ enum OpearterType {
imageResult imageResult
} }
enum MakeModelType {
MJ,
SD
}
class AIDrawImageResultController extends GetxController { class AIDrawImageResultController extends GetxController {
late var sseClient; late var sseClient;
...@@ -52,6 +57,7 @@ class AIDrawImageResultController extends GetxController { ...@@ -52,6 +57,7 @@ class AIDrawImageResultController extends GetxController {
var opearter = OpearterType.textToImage; var opearter = OpearterType.textToImage;
var imageUrls = List.generate(0, (index) => ""); var imageUrls = List.generate(0, (index) => "");
Timer? _timer; Timer? _timer;
var modelType = MakeModelType.MJ;
@override @override
void onInit() { void onInit() {
...@@ -67,6 +73,7 @@ class AIDrawImageResultController extends GetxController { ...@@ -67,6 +73,7 @@ class AIDrawImageResultController extends GetxController {
styleName.value = arguments["styleName"]; styleName.value = arguments["styleName"];
imageUrls = arguments["imageUrls"] ?? []; imageUrls = arguments["imageUrls"] ?? [];
messageId = arguments["messageId"] ?? ""; messageId = arguments["messageId"] ?? "";
modelType = arguments["modelType"] ?? MakeModelType.MJ;
} }
@override @override
...@@ -79,6 +86,8 @@ class AIDrawImageResultController extends GetxController { ...@@ -79,6 +86,8 @@ class AIDrawImageResultController extends GetxController {
void onClose() { void onClose() {
// TODO: implement onClose // TODO: implement onClose
super.onClose(); super.onClose();
SSEClient.unsubscribeFromSSE();
_timer?.cancel();
} }
@override @override
...@@ -113,7 +122,7 @@ class AIDrawImageResultController extends GetxController { ...@@ -113,7 +122,7 @@ class AIDrawImageResultController extends GetxController {
void doCollect() async { void doCollect() async {
if (didCollected.value) { if (didCollected.value) {
EasyLoading.show(status: "取消收藏中..."); EasyLoading.show(status: "取消收藏中...");
final res = await NewsAPI.updateCollectImg(resultImageUrl, 0); final res = await NewsAPI.updateCollectImg(resultImageUrl, 0, enText);
EasyLoading.dismiss(); EasyLoading.dismiss();
if (res.status == 401) { if (res.status == 401) {
EasyLoading.showInfo('您还未登录,请登录后体验功能。'); EasyLoading.showInfo('您还未登录,请登录后体验功能。');
...@@ -128,7 +137,7 @@ class AIDrawImageResultController extends GetxController { ...@@ -128,7 +137,7 @@ class AIDrawImageResultController extends GetxController {
} }
} else { } else {
EasyLoading.show(status: "收藏中..."); EasyLoading.show(status: "收藏中...");
final res = await NewsAPI.updateCollectImg(resultImageUrl, 1); final res = await NewsAPI.updateCollectImg(resultImageUrl, 1, enText);
EasyLoading.dismiss(); EasyLoading.dismiss();
if (res.status == 401) { if (res.status == 401) {
EasyLoading.showInfo('您还未登录,请登录后体验功能。'); EasyLoading.showInfo('您还未登录,请登录后体验功能。');
...@@ -144,13 +153,21 @@ class AIDrawImageResultController extends GetxController { ...@@ -144,13 +153,21 @@ class AIDrawImageResultController extends GetxController {
} }
} }
void startTimer() { void startTimer({void Function()? progressCallback}) {
_timer?.cancel(); _timer?.cancel();
const oneSec = Duration(milliseconds: 10); const oneSec = Duration(milliseconds: 10);
var sumTime = 0.0; var sumTime = 0.0;
var oldTime = 0;
_timer = Timer.periodic(oneSec, (Timer timer) { _timer = Timer.periodic(oneSec, (Timer timer) {
sumTime += 0.01; sumTime += 0.01;
loseTime.value = "${sumTime.toStringAsFixed(2)}s"; loseTime.value = "${sumTime.toStringAsFixed(2)}s";
if (progressCallback != null) {
final time = sumTime.toInt();
if (time != oldTime) {
progressCallback();
}
oldTime = time;
}
}); });
} }
...@@ -207,8 +224,17 @@ class AIDrawImageResultController extends GetxController { ...@@ -207,8 +224,17 @@ class AIDrawImageResultController extends GetxController {
makeImage() async { makeImage() async {
switch (opearter) { switch (opearter) {
case OpearterType.textToImage: case OpearterType.textToImage:
switch(modelType) {
case MakeModelType.MJ:
makeDrawImage(); makeDrawImage();
break; break;
case MakeModelType.SD:
sdMakeDrawImage();
break;
default:
break;
}
break;
case OpearterType.imageBlend: case OpearterType.imageBlend:
makeBlendImage(); makeBlendImage();
break; break;
...@@ -291,6 +317,100 @@ class AIDrawImageResultController extends GetxController { ...@@ -291,6 +317,100 @@ class AIDrawImageResultController extends GetxController {
} }
} }
sdMakeDrawImage() async {
progress.value = 0;
var question = "";
if (opearter == OpearterType.imageResult) {
question = enText;
} else {
final imageUrl = imageUrls.isNotEmpty ? imageUrls.first : "";
/*
if (imageUrl.isNotEmpty) {
question = '$imageUrl $enText --iw 2 --ar $ratio$s';
} else {
question = '$enText --ar $ratio$s';
}*/
question = '$enText';
}
Logger.debugPrint("question = $question");
// EasyLoading.show(status: "AI正在生成中...");
try {
/*
final res = await NewsAPI.createlmageBySdTxtTolmg(question, conversionId);
if (res.status == 401) {
EasyLoading.showInfo('您还未登录,请登录后体验功能。');
Get.toNamed(AppRoutes.SIGN_IN);
// state.isLoading = false;
} else {
EasyLoading.dismiss();
if (res.data == null) {
EasyLoading.showToast(res.message ?? "未知错误");
} else {
showProgressView.value = true;
var canQuery = true;
startTimer(progressCallback: () {
if (canQuery) {
canQuery = false;
NewsAPI.getSdlmgProgress().then((value) {
canQuery = true;
});
}
});
}
} */
var canQuery = true;
NewsAPI.createlmageBySdTxtTolmg(question, conversionId).then((res) {
canQuery = false;
if (res.status == 200) {
if ((res.data?.images?.length ?? 0) > 0) {
if (res.data?.images?[0].startsWith("http") == true) {
loadImage(res.data?.images?[0] ?? "", 100);
} else {
final decode = base64Decode(res.data?.images?[0] ?? "");
placehoderImageData = imageData.value ?? decode;
imageData.value = decode;
}
}
progress.value = 100;
} else {
if (res.status == 401) {
EasyLoading.showInfo('您还未登录,请登录后体验功能。');
Get.toNamed(AppRoutes.SIGN_IN);
} else {
EasyLoading.showError(res.message ?? "");
}
}
});
showProgressView.value = true;
startTimer(progressCallback: () {
if (canQuery) {
canQuery = false;
NewsAPI.getSdlmgProgress().then((res) {
if (res.status == 200) {
canQuery = true;
if (res.data?.currentImage != null) {
if (res.data?.currentImage?.startsWith("http") == true) {
loadImage(res.data?.currentImage ?? "", ((res.data?.progress ?? 0.0) * 100).toInt());
} else {
final decode = base64Decode(res.data?.currentImage?.replaceAll('\n', '') ?? "");
placehoderImageData = imageData.value ?? decode;
imageData.value = decode;
}
}
progress.value = ((res.data?.progress ?? 0.0) * 100).toInt();
} else {
canQuery = false;
EasyLoading.showError(res.message ?? "");
}
});
}
});
} catch (e) {
EasyLoading.showError(e.toString());
}
}
initEventSource(String id) async { initEventSource(String id) async {
final url = "$SERVER_API_URL/openAi/imgConnect/$id"; final url = "$SERVER_API_URL/openAi/imgConnect/$id";
Logger.debugPrint("sse url = $url"); Logger.debugPrint("sse url = $url");
...@@ -336,7 +456,7 @@ class AIDrawImageResultController extends GetxController { ...@@ -336,7 +456,7 @@ class AIDrawImageResultController extends GetxController {
loadImage(resultImageUrl, model.progress ?? 0); loadImage(resultImageUrl, model.progress ?? 0);
} }
} }
bottomButtonTitles.value = model.response?.buttons?.where((element) => element.toLowerCase() != "web").toList() ?? []; bottomButtonTitles.value = model.response?.buttons?.where((element) => element.toLowerCase() != "web" && element.toLowerCase().contains("custom")).toList() ?? [];
messageId = model.response?.buttonMessageId ?? ""; messageId = model.response?.buttonMessageId ?? "";
}); });
} }
......
...@@ -170,3 +170,151 @@ class CommonResponse { ...@@ -170,3 +170,151 @@ class CommonResponse {
return data; return data;
} }
} }
class SdCreateImageModel {
int? status;
String? message;
SdCreateImagData? data;
SdCreateImageModel({this.status, this.message, this.data});
SdCreateImageModel.fromJson(Map<String, dynamic> json) {
status = json['status'];
message = json['message'];
data = json['data'] != null ? new SdCreateImagData.fromJson(json['data']) : null;
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['status'] = this.status;
data['message'] = this.message;
if (this.data != null) {
data['data'] = this.data?.toJson();
}
return data;
}
}
class SdCreateImagData {
List<String>? images;
SdCreateImagData({this.images});
SdCreateImagData.fromJson(Map<String, dynamic> json) {
images = json['images'].cast<String>();
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['images'] = this.images;
return data;
}
}
class SdImageProgressModel {
int? status;
String? message;
SdImageProgressData? data;
int? timestamp;
SdImageProgressModel({this.status, this.message, this.data, this.timestamp});
SdImageProgressModel.fromJson(Map<String, dynamic> json) {
status = json['status'];
message = json['message'];
data = json['data'] != null ? new SdImageProgressData.fromJson(json['data']) : null;
timestamp = json['timestamp'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['status'] = this.status;
data['message'] = this.message;
if (this.data != null) {
data['data'] = this.data?.toJson();
}
data['timestamp'] = this.timestamp;
return data;
}
}
class SdImageProgressData {
String? currentImage;
double? progress;
SdImageProgressState? state;
String? textinfo;
double? etaRelative;
SdImageProgressData(
{this.currentImage,
this.progress,
this.state,
this.textinfo,
this.etaRelative});
SdImageProgressData.fromJson(Map<String, dynamic> json) {
currentImage = json['current_image'];
progress = json['progress'];
state = json['state'] != null ? new SdImageProgressState.fromJson(json['state']) : null;
textinfo = json['textinfo'];
etaRelative = json['eta_relative'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['current_image'] = this.currentImage;
data['progress'] = this.progress;
if (this.state != null) {
data['state'] = this.state?.toJson();
}
data['textinfo'] = this.textinfo;
data['eta_relative'] = this.etaRelative;
return data;
}
}
class SdImageProgressState {
int? jobCount;
int? jobNo;
String? jobTimestamp;
bool? interrupted;
String? job;
int? samplingStep;
bool? skipped;
int? samplingSteps;
SdImageProgressState(
{this.jobCount,
this.jobNo,
this.jobTimestamp,
this.interrupted,
this.job,
this.samplingStep,
this.skipped,
this.samplingSteps});
SdImageProgressState.fromJson(Map<String, dynamic> json) {
jobCount = json['job_count'];
jobNo = json['job_no'];
jobTimestamp = json['job_timestamp'];
interrupted = json['interrupted'];
job = json['job'];
samplingStep = json['sampling_step'];
skipped = json['skipped'];
samplingSteps = json['sampling_steps'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['job_count'] = this.jobCount;
data['job_no'] = this.jobNo;
data['job_timestamp'] = this.jobTimestamp;
data['interrupted'] = this.interrupted;
data['job'] = this.job;
data['sampling_step'] = this.samplingStep;
data['skipped'] = this.skipped;
data['sampling_steps'] = this.samplingSteps;
return data;
}
}
\ No newline at end of file
import 'dart:typed_data'; import 'dart:typed_data';
import 'dart:ui';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/src/widgets/framework.dart'; import 'package:flutter/src/widgets/framework.dart';
...@@ -37,7 +38,7 @@ class AIDrawImageResultPage extends GetView<AIDrawImageResultController> { ...@@ -37,7 +38,7 @@ class AIDrawImageResultPage extends GetView<AIDrawImageResultController> {
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
Text("AI生成进度:${controller.progress.value}%"), Text("AI生成进度:${controller.progress.value}%"),
SizedBox(height: 10,), const SizedBox(height: 10,),
ClipRRect( ClipRRect(
borderRadius: BorderRadius.circular(10), borderRadius: BorderRadius.circular(10),
child: LinearProgressIndicator( child: LinearProgressIndicator(
...@@ -46,7 +47,7 @@ class AIDrawImageResultPage extends GetView<AIDrawImageResultController> { ...@@ -46,7 +47,7 @@ class AIDrawImageResultPage extends GetView<AIDrawImageResultController> {
value: controller.progress.value.toDouble() / 100.0, value: controller.progress.value.toDouble() / 100.0,
), ),
), ),
SizedBox(height: 10,), const SizedBox(height: 10,),
Text(controller.loseTime.value), Text(controller.loseTime.value),
], ],
), ),
...@@ -56,7 +57,7 @@ class AIDrawImageResultPage extends GetView<AIDrawImageResultController> { ...@@ -56,7 +57,7 @@ class AIDrawImageResultPage extends GetView<AIDrawImageResultController> {
Widget makeBottomButtonsView() { Widget makeBottomButtonsView() {
return Container( return Container(
padding: const EdgeInsets.fromLTRB(20, 0, 20, 0), padding: const EdgeInsets.fromLTRB(20, 10, 20, 0),
height: 100, height: 100,
child: SingleChildScrollView( child: SingleChildScrollView(
child: Wrap( child: Wrap(
...@@ -86,7 +87,6 @@ class AIDrawImageResultPage extends GetView<AIDrawImageResultController> { ...@@ -86,7 +87,6 @@ class AIDrawImageResultPage extends GetView<AIDrawImageResultController> {
} }
Widget makeImageView() { Widget makeImageView() {
return Visibility( return Visibility(
visible: controller.imageData.value != null, visible: controller.imageData.value != null,
child: InteractiveViewer( child: InteractiveViewer(
...@@ -100,6 +100,28 @@ class AIDrawImageResultPage extends GetView<AIDrawImageResultController> { ...@@ -100,6 +100,28 @@ class AIDrawImageResultPage extends GetView<AIDrawImageResultController> {
)); ));
} }
Widget makeBlurView() {
return Obx(() => Stack(
children: [
Visibility(
visible: controller.imageData.value != null,
child: FadeInImage(
image: MemoryImage(controller.imageData.value ?? Uint8List(0)),
placeholder: MemoryImage(controller.placehoderImageData ?? Uint8List(0)),
fit: BoxFit.fitHeight,width: Get.width, height: Get.height,
)
),
BackdropFilter(
filter: ImageFilter.blur(sigmaX: 10, sigmaY: 10),
child: Container(
color: Colors.white.withOpacity(0.3),
width: Get.width, height: Get.height,
),
),
],
));
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
// TODO: implement build // TODO: implement build
...@@ -107,11 +129,11 @@ class AIDrawImageResultPage extends GetView<AIDrawImageResultController> { ...@@ -107,11 +129,11 @@ class AIDrawImageResultPage extends GetView<AIDrawImageResultController> {
init: AIDrawImageResultController(), init: AIDrawImageResultController(),
builder: (_) => Stack( builder: (_) => Stack(
children: [ children: [
// makeImageView(), makeBlurView(),
Scaffold( Scaffold(
backgroundColor: AppColor.gray1, backgroundColor: Colors.transparent,
appBar: AppBar( appBar: AppBar(
backgroundColor: Colors.black, backgroundColor: Colors.transparent,
elevation: 0, elevation: 0,
actions: [ actions: [
Container( Container(
...@@ -128,11 +150,11 @@ class AIDrawImageResultPage extends GetView<AIDrawImageResultController> { ...@@ -128,11 +150,11 @@ class AIDrawImageResultPage extends GetView<AIDrawImageResultController> {
color: AppColor.primary, color: AppColor.primary,
borderRadius: BorderRadius.circular(20), borderRadius: BorderRadius.circular(20),
), ),
child: Text("分享到广场") child: const Text("分享到广场")
), ),
), ),
), ),
SizedBox(width: 10,), const SizedBox(width: 10,),
Container( Container(
padding: const EdgeInsets.fromLTRB(0, 8, 0, 8), padding: const EdgeInsets.fromLTRB(0, 8, 0, 8),
child: InkWell( child: InkWell(
...@@ -153,9 +175,9 @@ class AIDrawImageResultPage extends GetView<AIDrawImageResultController> { ...@@ -153,9 +175,9 @@ class AIDrawImageResultPage extends GetView<AIDrawImageResultController> {
), ),
), ),
), ),
SizedBox(width: 10,), const SizedBox(width: 10,),
Container( Container(
padding: const EdgeInsets.fromLTRB(0, 8, 0, 8), padding: const EdgeInsets.fromLTRB(0, 8, 10, 8),
child: InkWell( child: InkWell(
onTap: () { onTap: () {
controller.share(); controller.share();
...@@ -168,7 +190,7 @@ class AIDrawImageResultPage extends GetView<AIDrawImageResultController> { ...@@ -168,7 +190,7 @@ class AIDrawImageResultPage extends GetView<AIDrawImageResultController> {
color: AppColor.primary, color: AppColor.primary,
borderRadius: BorderRadius.circular(20), borderRadius: BorderRadius.circular(20),
), ),
child: Image(image: AssetImage("assets/images/imageShare.png"), child: const Image(image: AssetImage("assets/images/imageShare.png"),
width: 20, width: 20,
height: 20,) height: 20,)
), ),
...@@ -180,7 +202,10 @@ class AIDrawImageResultPage extends GetView<AIDrawImageResultController> { ...@@ -180,7 +202,10 @@ class AIDrawImageResultPage extends GetView<AIDrawImageResultController> {
return Container( return Container(
child: Stack( child: Stack(
children: [ children: [
makeImageView(), Center(
heightFactor: 1.6,
child: makeImageView(),
),
Column( Column(
mainAxisAlignment: MainAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
...@@ -206,8 +231,12 @@ class AIDrawImageResultPage extends GetView<AIDrawImageResultController> { ...@@ -206,8 +231,12 @@ class AIDrawImageResultPage extends GetView<AIDrawImageResultController> {
), ),
), ),
), ),
const SizedBox(height: 20,), const SizedBox(height: 5,),
Container( SizedBox(
height: 50,
child: SingleChildScrollView(
scrollDirection: Axis.vertical,
child: Container(
padding: const EdgeInsets.fromLTRB(20, 0, 20, 0), padding: const EdgeInsets.fromLTRB(20, 0, 20, 0),
child: Text(controller.text.value, child: Text(controller.text.value,
style: const TextStyle( style: const TextStyle(
...@@ -216,12 +245,16 @@ class AIDrawImageResultPage extends GetView<AIDrawImageResultController> { ...@@ -216,12 +245,16 @@ class AIDrawImageResultPage extends GetView<AIDrawImageResultController> {
), ),
), ),
), ),
SizedBox(height: 20,), ),
makeBottomButtonsView(), ),
SizedBox(height: 20,), Visibility(
visible: controller.bottomButtonTitles.value.isNotEmpty,
child: makeBottomButtonsView(),
),
const SizedBox(height: 20,),
SafeArea( SafeArea(
child: Container( child: Container(
padding: EdgeInsets.fromLTRB(20, 0, 20, 0), padding: const EdgeInsets.fromLTRB(20, 0, 20, 0),
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
...@@ -237,7 +270,7 @@ class AIDrawImageResultPage extends GetView<AIDrawImageResultController> { ...@@ -237,7 +270,7 @@ class AIDrawImageResultPage extends GetView<AIDrawImageResultController> {
borderRadius: BorderRadius.circular(22) borderRadius: BorderRadius.circular(22)
), ),
alignment: Alignment.center, alignment: Alignment.center,
child: Text("保存原图"), child: const Text("保存原图"),
), ),
), ),
...@@ -253,7 +286,7 @@ class AIDrawImageResultPage extends GetView<AIDrawImageResultController> { ...@@ -253,7 +286,7 @@ class AIDrawImageResultPage extends GetView<AIDrawImageResultController> {
borderRadius: BorderRadius.circular(22) borderRadius: BorderRadius.circular(22)
), ),
alignment: Alignment.center, alignment: Alignment.center,
child: Text("生成同款(2金币)"), child: const Text("生成同款(2金币)"),
), ),
), ),
], ],
......
...@@ -29,8 +29,9 @@ class AIDrawImageController extends GetxController { ...@@ -29,8 +29,9 @@ class AIDrawImageController extends GetxController {
var model = AIDrawTextToImageModel(); var model = AIDrawTextToImageModel();
var ratio = "9:16".obs; var ratio = "9:16".obs;
var descriptionText = "".obs; var descriptionText = "".obs;
var styleName = "通用风格".obs; var styleName = "--v 5.2".obs;
var s = ""; var s = "";
var page = 1;
ScrollController categoryScrollController = ScrollController(initialScrollOffset: 0); ScrollController categoryScrollController = ScrollController(initialScrollOffset: 0);
TextEditingController textController = TextEditingController(text: ""); TextEditingController textController = TextEditingController(text: "");
Offset startPoint = const Offset(0, 0); Offset startPoint = const Offset(0, 0);
...@@ -69,11 +70,14 @@ class AIDrawImageController extends GetxController { ...@@ -69,11 +70,14 @@ class AIDrawImageController extends GetxController {
]; ];
var squareImgaes = Rx<List<MyWorkData>>([]); var squareImgaes = Rx<List<MyWorkData>>([]);
var squareImageCount = 0.obs;
var textCount = 0.obs; var textCount = 0.obs;
var uploadBlendImageUrls = List<String>.generate(0, (index) => ""); var uploadBlendImageUrls = List<String>.generate(0, (index) => "");
var uploadTextImageUrls = List<String>.generate(0, (index) => ""); var uploadTextImageUrls = List<String>.generate(0, (index) => "");
var modelApiOption = "使用MidJourney".obs;
@override @override
void onInit() { void onInit() {
// TODO: implement onInit // TODO: implement onInit
...@@ -108,15 +112,13 @@ class AIDrawImageController extends GetxController { ...@@ -108,15 +112,13 @@ class AIDrawImageController extends GetxController {
} }
onPullRefresh(RefreshController refreshController) { onPullRefresh(RefreshController refreshController) {
Future.delayed(Duration(seconds: 3), () { page = 1;
refreshController.refreshCompleted(); requestSquareImages(false, refreshController);
});
} }
onLoadMore(RefreshController refreshController) { onLoadMore(RefreshController refreshController) {
Future.delayed(Duration(seconds: 3), () { page += 1;
refreshController.loadComplete(); requestSquareImages(true, refreshController);
});
} }
replaceIt() { replaceIt() {
...@@ -160,14 +162,15 @@ class AIDrawImageController extends GetxController { ...@@ -160,14 +162,15 @@ class AIDrawImageController extends GetxController {
"text": item.content ?? "", "text": item.content ?? "",
"ratio": "16:9", "ratio": "16:9",
"s": "", "s": "",
"styleName": item.style ?? "通用风格", "styleName": item.style ?? "--v 5.2",
"messageId": item.messageId ?? "" "messageId": item.messageId ?? ""
}); });
} }
} }
} }
requestSquareImages() async { requestSquareImages(bool ismore, RefreshController? refreshController) async {
if (!ismore) {
EasyLoading.show( EasyLoading.show(
status: "正在加载广场图片", status: "正在加载广场图片",
dismissOnTap: false, dismissOnTap: false,
...@@ -176,10 +179,21 @@ class AIDrawImageController extends GetxController { ...@@ -176,10 +179,21 @@ class AIDrawImageController extends GetxController {
color: Colors.white, color: Colors.white,
size: 30, size: 30,
)); ));
final res = await UserAPI.getSquareImages(); }
final res = await UserAPI.getSquareImages(page);
if (ismore) {
refreshController?.loadComplete();
} else {
refreshController?.refreshCompleted();
}
EasyLoading.dismiss(); EasyLoading.dismiss();
if (res.status == 200) { if (res.status == 200) {
if (ismore) {
squareImgaes.value.addAll(res.data ?? []);
} else {
squareImgaes.value = res.data ?? []; squareImgaes.value = res.data ?? [];
}
squareImageCount.value = squareImgaes.value.length;
} else { } else {
EasyLoading.showError(res.message ?? "请求广场图片异常"); EasyLoading.showError(res.message ?? "请求广场图片异常");
} }
...@@ -326,7 +340,8 @@ class AIDrawImageController extends GetxController { ...@@ -326,7 +340,8 @@ class AIDrawImageController extends GetxController {
"text": textController.text, "text": textController.text,
"ratio": ratio.value, "ratio": ratio.value,
"s": s, "s": s,
"styleName": styleName.value "styleName": styleName.value,
"modelType": modelApiOption.value == "使用MidJourney" ? MakeModelType.MJ : MakeModelType.SD
}); });
clearTextSelectedImage(); clearTextSelectedImage();
} }
......
...@@ -14,7 +14,7 @@ class ImageSquareListView extends StatelessWidget { ...@@ -14,7 +14,7 @@ class ImageSquareListView extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
// TODO: implement build // TODO: implement build
final controller = Get.find<AIDrawImageController>(); final controller = Get.find<AIDrawImageController>();
return SmartRefresher( return Obx(() => SmartRefresher(
enablePullUp: true, enablePullUp: true,
controller: refreshController, controller: refreshController,
onRefresh: () => controller.onPullRefresh(refreshController), onRefresh: () => controller.onPullRefresh(refreshController),
...@@ -29,9 +29,9 @@ class ImageSquareListView extends StatelessWidget { ...@@ -29,9 +29,9 @@ class ImageSquareListView extends StatelessWidget {
loadingText: "正在加载中...", loadingText: "正在加载中...",
noDataText: '没有更多数据啦' noDataText: '没有更多数据啦'
), ),
child: Obx(() => MasonryGridView.count( child: MasonryGridView.count(
padding: const EdgeInsets.fromLTRB(10, 10, 10, 10), padding: const EdgeInsets.fromLTRB(10, 10, 10, 10),
itemCount: controller.squareImgaes.value.length, itemCount: controller.squareImageCount.value,
crossAxisCount: 2, crossAxisCount: 2,
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
return InkWell( return InkWell(
...@@ -64,8 +64,8 @@ class ImageSquareListView extends StatelessWidget { ...@@ -64,8 +64,8 @@ class ImageSquareListView extends StatelessWidget {
}, },
mainAxisSpacing: 10.0, mainAxisSpacing: 10.0,
crossAxisSpacing: 10.0, crossAxisSpacing: 10.0,
)) )
); ));
} }
} }
\ No newline at end of file
import 'dart:io'; import 'dart:io';
import 'package:chart/pages/ai-draw-image/image_square_view.dart';
import 'package:chart/pages/ai-draw-image/text_to_image_view.dart'; import 'package:chart/pages/ai-draw-image/text_to_image_view.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
...@@ -107,14 +106,7 @@ import 'controller.dart'; ...@@ -107,14 +106,7 @@ import 'controller.dart';
}, },
child: Container( child: Container(
alignment: Alignment.center, alignment: Alignment.center,
// decoration: BoxDecoration( child: const Image(image: AssetImage("assets/images/添加图片.png", ), width: 30, height: 30,),
// border: Border.all(
// width: 1,
// color: AppColor.primary
// ),
// borderRadius: BorderRadius.circular(5)
// ),
child: Image(image: AssetImage("assets/images/添加图片.png", ), width: 30, height: 30,),
), ),
), ),
); );
......
...@@ -616,6 +616,10 @@ Widget makeSectionTitleView(String index, String name) { ...@@ -616,6 +616,10 @@ Widget makeSectionTitleView(String index, String name) {
// tip // tip
Container( Container(
padding: const EdgeInsets.fromLTRB(10, 0, 0, 0), padding: const EdgeInsets.fromLTRB(10, 0, 0, 0),
child: Row(
children: [
Expanded(
flex: 1,
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: const [ children: const [
...@@ -631,6 +635,63 @@ Widget makeSectionTitleView(String index, String name) { ...@@ -631,6 +635,63 @@ Widget makeSectionTitleView(String index, String name) {
], ],
), ),
), ),
Expanded(
flex: 1,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
InkWell(
onTap: () => controller.modelApiOption.value = '使用MidJourney',
child: Container(
height: 30,
child: Row(
children: [
Obx(() => Radio<String>(
value: '使用MidJourney',
groupValue: controller.modelApiOption.value,
activeColor: AppColor.primary,
onChanged: (value) {
controller.modelApiOption.value = value as String;
}
)),
const Text('使用MidJourney',
style: TextStyle(
fontSize: 13
),
)
],
),
),
),
InkWell(
onTap: () => controller.modelApiOption.value = '使用StableDiffusion',
child: Container(
height: 30,
child: Row(
children: [
Obx(() => Radio<String>(
value: '使用StableDiffusion',
groupValue: controller.modelApiOption.value,
activeColor: AppColor.primary,
onChanged: (value) {
controller.modelApiOption.value = value as String;
}
)),
const Text('使用StableDiffusion',
style: TextStyle(
fontSize: 13
),
)
],
),
),
)
],
)
)
],
),
),
const SizedBox(height: 20,), const SizedBox(height: 20,),
makeInsertPictureView(), makeInsertPictureView(),
const SizedBox(height: 20,), const SizedBox(height: 20,),
......
...@@ -5,6 +5,7 @@ import 'package:flutter/material.dart'; ...@@ -5,6 +5,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/src/widgets/framework.dart'; import 'package:flutter/src/widgets/framework.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import '../../common/routers/names.dart';
import '../../common/style/color.dart'; import '../../common/style/color.dart';
import 'controller.dart'; import 'controller.dart';
import 'image_square_view.dart'; import 'image_square_view.dart';
...@@ -15,19 +16,21 @@ class AIDrawImagePage extends GetView<AIDrawImageController> { ...@@ -15,19 +16,21 @@ class AIDrawImagePage extends GetView<AIDrawImageController> {
AIDrawImagePage({Key? key}) : super(key: key); AIDrawImagePage({Key? key}) : super(key: key);
var myTabs = [ var myTabs = const [
Tab(text: '文生图'), Tab(text: '文生图'),
Tab(text: '图生图'), Tab(text: '图生图'),
Tab(text: '图片广场'), Tab(text: '图片广场'),
]; ];
Widget makeTopTabView() { Widget makeTopTabView() {
return Padding(padding: EdgeInsets.fromLTRB(10, 20, 10, 10), return Padding(padding: const EdgeInsets.fromLTRB(10, 20, 10, 10),
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
InkWell( InkWell(
onTap: () {}, onTap: () {
Get.toNamed(AppRoutes.MY_WORK, arguments: {"operator": "work"});
},
child: Container( child: Container(
height: 30, height: 30,
width: 30, width: 30,
...@@ -35,7 +38,7 @@ class AIDrawImagePage extends GetView<AIDrawImageController> { ...@@ -35,7 +38,7 @@ class AIDrawImagePage extends GetView<AIDrawImageController> {
color: AppColor.gray1, color: AppColor.gray1,
borderRadius: BorderRadius.circular(15), borderRadius: BorderRadius.circular(15),
), ),
child: Align(alignment: Alignment.center, child: const Align(alignment: Alignment.center,
child: Image(image: AssetImage("assets/images/jifen1.png", ), width: 20, height: 20,) child: Image(image: AssetImage("assets/images/jifen1.png", ), width: 20, height: 20,)
), ),
), ),
...@@ -48,8 +51,8 @@ class AIDrawImagePage extends GetView<AIDrawImageController> { ...@@ -48,8 +51,8 @@ class AIDrawImagePage extends GetView<AIDrawImageController> {
height: 30, height: 30,
width: 270, width: 270,
child: TabBar( child: TabBar(
labelStyle: TextStyle(fontSize: 14), labelStyle: const TextStyle(fontSize: 14),
unselectedLabelStyle: TextStyle(fontSize: 14), unselectedLabelStyle: const TextStyle(fontSize: 14),
indicator: BoxDecoration( indicator: BoxDecoration(
color: AppColor.primary, // 设置背景颜色 color: AppColor.primary, // 设置背景颜色
borderRadius: BorderRadius.circular(15), // 设置圆角 borderRadius: BorderRadius.circular(15), // 设置圆角
...@@ -69,9 +72,9 @@ class AIDrawImagePage extends GetView<AIDrawImageController> { ...@@ -69,9 +72,9 @@ class AIDrawImagePage extends GetView<AIDrawImageController> {
color: AppColor.gray1, color: AppColor.gray1,
borderRadius: BorderRadius.circular(15), borderRadius: BorderRadius.circular(15),
), ),
child: Padding(padding: EdgeInsets.fromLTRB(10, 0, 10, 0), child: Padding(padding: const EdgeInsets.fromLTRB(10, 0, 10, 0),
child: Row( child: Row(
children: [ children: const [
Image(image: AssetImage("assets/images/jifen1.png", ), width: 20, height: 20,), Image(image: AssetImage("assets/images/jifen1.png", ), width: 20, height: 20,),
SizedBox(width: 5), SizedBox(width: 5),
Text("0"), Text("0"),
...@@ -93,7 +96,7 @@ class AIDrawImagePage extends GetView<AIDrawImageController> { ...@@ -93,7 +96,7 @@ class AIDrawImagePage extends GetView<AIDrawImageController> {
makeTextToImageView(), makeTextToImageView(),
makeImageToImageView(), makeImageToImageView(),
Container( Container(
decoration: BoxDecoration(color: AppColor.black1), decoration: const BoxDecoration(color: AppColor.black1),
child: makeImageSquareView(), child: makeImageSquareView(),
) )
] ]
...@@ -111,7 +114,7 @@ class AIDrawImagePage extends GetView<AIDrawImageController> { ...@@ -111,7 +114,7 @@ class AIDrawImagePage extends GetView<AIDrawImageController> {
controller.tabController = tabController; controller.tabController = tabController;
tabController.addListener(() { tabController.addListener(() {
if (tabController.index == 2 && controller.currentIndex != tabController.index) { if (tabController.index == 2 && controller.currentIndex != tabController.index) {
controller.requestSquareImages(); controller.requestSquareImages(false, null);
} }
controller.currentIndex = tabController.index; controller.currentIndex = tabController.index;
}); });
...@@ -137,7 +140,7 @@ class AIDrawImagePage extends GetView<AIDrawImageController> { ...@@ -137,7 +140,7 @@ class AIDrawImagePage extends GetView<AIDrawImageController> {
top: -20, top: -20,
left: -(Get.width * 1.2 - Get.width) / 2.0, left: -(Get.width * 1.2 - Get.width) / 2.0,
child: Image( child: Image(
image: AssetImage("assets/images/top_ai_draw_image.png"), image: const AssetImage("assets/images/top_ai_draw_image.png"),
height: 300, height: 300,
width: Get.width * 1.2, width: Get.width * 1.2,
fit: BoxFit.cover, fit: BoxFit.cover,
......
import 'dart:math'; import 'dart:math';
import 'package:chart/common/widgets/keep_alive_wrapper.dart';
import 'package:chart/common/widgets/wx_share.dart'; import 'package:chart/common/widgets/wx_share.dart';
import 'package:chart/pages/assistant/index.dart'; import 'package:chart/pages/assistant/index.dart';
import 'package:chart/pages/creation/index.dart'; import 'package:chart/pages/creation/index.dart';
...@@ -59,8 +60,8 @@ class ApplicationPage extends GetView<ApplicationController> { ...@@ -59,8 +60,8 @@ class ApplicationPage extends GetView<ApplicationController> {
HomePage(), HomePage(),
CreationPage(), CreationPage(),
// AssistantPage(), // AssistantPage(),
AIDrawImagePage(), KeepAliveWrapper(AIDrawImagePage()),
MyPage() KeepAliveWrapper(MyPage()),
]); ]);
} }
......
...@@ -25,23 +25,33 @@ class MyWorkController extends GetxController { ...@@ -25,23 +25,33 @@ class MyWorkController extends GetxController {
var models = AIDrawTextToImageModel(); var models = AIDrawTextToImageModel();
var collectImages = Rx<List<MyCollectData>>([]); var collectImages = Rx<List<MyCollectData>>([]);
var workImages = Rx<List<MyWorkData>>([]); var workImages = Rx<List<MyWorkData>>([]);
var workImageCount = 0.obs;
var collectImageCount = 0.obs;
var title = "".obs; var title = "".obs;
var page = 1;
var operator = "";
@override @override
void onInit() { void onInit() {
// TODO: implement onInit // TODO: implement onInit
super.onInit(); super.onInit();
final arguments = Get.arguments; final arguments = Get.arguments;
final operator = arguments["operator"]; operator = arguments["operator"];
if (operator == "work") { if (operator == "work") {
title.value = "我的作品"; title.value = "我的作品";
requestMyWorkImages(); requestMyWorkImages(false);
} else { } else {
title.value = "我的收藏"; title.value = "我的收藏";
requestMyCollectImages(); requestMyCollectImages(false);
} }
} }
@override
void onClose() {
// TODO: implement onClose
super.onClose();
}
onClickCollectImage(int index) async { onClickCollectImage(int index) async {
if (index >= 0 && index < collectImages.value.length) { if (index >= 0 && index < collectImages.value.length) {
final item = collectImages.value[index]; final item = collectImages.value[index];
...@@ -60,7 +70,7 @@ class MyWorkController extends GetxController { ...@@ -60,7 +70,7 @@ class MyWorkController extends GetxController {
"text": "", "text": "",
"ratio": "16:9", "ratio": "16:9",
"s": "", "s": "",
"styleName": "通用风格", "styleName": "--v 5.2",
"messageId": "" "messageId": ""
}); });
} }
...@@ -85,14 +95,15 @@ class MyWorkController extends GetxController { ...@@ -85,14 +95,15 @@ class MyWorkController extends GetxController {
"text": item.content ?? "", "text": item.content ?? "",
"ratio": "16:9", "ratio": "16:9",
"s": "", "s": "",
"styleName": item.style ?? "通用风格", "styleName": item.style ?? "--v 5.2",
"messageId": item.messageId ?? "" "messageId": item.messageId ?? ""
}); });
} }
} }
} }
requestMyWorkImages() async { requestMyWorkImages(bool ismore) async {
if (!ismore) {
EasyLoading.show( EasyLoading.show(
status: "正在加载我的作品", status: "正在加载我的作品",
dismissOnTap: false, dismissOnTap: false,
...@@ -101,16 +112,30 @@ class MyWorkController extends GetxController { ...@@ -101,16 +112,30 @@ class MyWorkController extends GetxController {
color: Colors.white, color: Colors.white,
size: 30, size: 30,
)); ));
final res = await UserAPI.getMyWorkImages(); }
final res = await UserAPI.getMyWorkImages(page);
if (ismore) {
refreshController.loadComplete();
} else {
refreshController.refreshCompleted();
}
EasyLoading.dismiss(); EasyLoading.dismiss();
if (res.status == 200) { if (res.status == 200) {
if (ismore) {
var array = workImages.value;
array.addAll(res.data ?? []);
workImages.value = array;
} else {
workImages.value = res.data ?? []; workImages.value = res.data ?? [];
}
workImageCount.value = workImages.value.length;
} else { } else {
EasyLoading.showError(res.message ?? "请求我的作品异常"); EasyLoading.showError(res.message ?? "请求我的作品异常");
} }
} }
requestMyCollectImages() async { requestMyCollectImages(bool ismore) async {
if (!ismore) {
EasyLoading.show( EasyLoading.show(
status: "正在加载我的收藏", status: "正在加载我的收藏",
dismissOnTap: false, dismissOnTap: false,
...@@ -119,24 +144,41 @@ class MyWorkController extends GetxController { ...@@ -119,24 +144,41 @@ class MyWorkController extends GetxController {
color: Colors.white, color: Colors.white,
size: 30, size: 30,
)); ));
final res = await UserAPI.getMyCollectImages(); }
final res = await UserAPI.getMyCollectImages(page);
refreshController.refreshCompleted();
EasyLoading.dismiss(); EasyLoading.dismiss();
if (res.status == 200) { if (res.status == 200) {
if (ismore) {
var array = collectImages.value;
array.addAll(res.data ?? []);
collectImages.value = array;
} else {
collectImages.value = res.data ?? []; collectImages.value = res.data ?? [];
}
collectImageCount.value = collectImages.value.length;
} else { } else {
EasyLoading.showError(res.message ?? "请求我的收藏异常"); EasyLoading.showError(res.message ?? "请求我的收藏异常");
} }
} }
onPullRefresh() { onPullRefresh() {
Future.delayed(Duration(seconds: 3), () { page = 0;
refreshController.refreshCompleted(); if (operator == "work") {
}); title.value = "我的作品";
requestMyWorkImages(false);
} else {
title.value = "我的收藏";
requestMyCollectImages(false);
}
} }
onLoadMore() { onLoadMore() async {
Future.delayed(Duration(seconds: 3), () { page += 1;
refreshController.loadComplete(); if (operator == "work") {
}); requestMyWorkImages(true);
} else {
requestMyCollectImages(true);
}
} }
} }
\ No newline at end of file
...@@ -118,6 +118,7 @@ class MyCollectData { ...@@ -118,6 +118,7 @@ class MyCollectData {
int? isCancel; int? isCancel;
String? createTime; String? createTime;
String? updateTime; String? updateTime;
String? prompt;
MyCollectData( MyCollectData(
{this.id, {this.id,
...@@ -125,6 +126,7 @@ class MyCollectData { ...@@ -125,6 +126,7 @@ class MyCollectData {
this.imgUrl, this.imgUrl,
this.isCancel, this.isCancel,
this.createTime, this.createTime,
this.prompt,
this.updateTime}); this.updateTime});
MyCollectData.fromJson(Map<String, dynamic> json) { MyCollectData.fromJson(Map<String, dynamic> json) {
...@@ -134,6 +136,7 @@ class MyCollectData { ...@@ -134,6 +136,7 @@ class MyCollectData {
isCancel = json['isCancel']; isCancel = json['isCancel'];
createTime = json['createTime']; createTime = json['createTime'];
updateTime = json['updateTime']; updateTime = json['updateTime'];
prompt = json['prompt'];
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
...@@ -144,6 +147,7 @@ class MyCollectData { ...@@ -144,6 +147,7 @@ class MyCollectData {
data['isCancel'] = this.isCancel; data['isCancel'] = this.isCancel;
data['createTime'] = this.createTime; data['createTime'] = this.createTime;
data['updateTime'] = this.updateTime; data['updateTime'] = this.updateTime;
data['prompt'] = this.prompt;
return data; return data;
} }
} }
\ No newline at end of file
...@@ -15,11 +15,11 @@ import './controller.dart'; ...@@ -15,11 +15,11 @@ import './controller.dart';
class MyWorkPage extends GetView<MyWorkController> { class MyWorkPage extends GetView<MyWorkController> {
const MyWorkPage({Key? key}) : super(key: key); const MyWorkPage({Key? key}) : super(key: key);
Widget makeListView() { Widget makeMyWorkListView() {
// TODO: implement build
final controller = Get.find<MyWorkController>(); final controller = Get.find<MyWorkController>();
return SmartRefresher( return Obx(() => SmartRefresher(
enablePullUp: true, enablePullUp: true,
enablePullDown: true,
controller: controller.refreshController, controller: controller.refreshController,
onRefresh: controller.onPullRefresh, onRefresh: controller.onPullRefresh,
onLoading: controller.onLoadMore, onLoading: controller.onLoadMore,
...@@ -33,22 +33,22 @@ class MyWorkPage extends GetView<MyWorkController> { ...@@ -33,22 +33,22 @@ class MyWorkPage extends GetView<MyWorkController> {
loadingText: "正在加载中...", loadingText: "正在加载中...",
noDataText: '没有更多数据啦' noDataText: '没有更多数据啦'
), ),
child: Obx(() { child: MasonryGridView.count(
if (controller.title.value == "我的收藏") { itemCount: controller.workImageCount.value,
return MasonryGridView.count(
itemCount: controller.collectImages.value.length,
crossAxisCount: 2, crossAxisCount: 2,
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
return InkWell( return InkWell(
onTap: () { onTap: () {
controller.onClickCollectImage(index); controller.onClickWorkImage(index);
}, },
child: ClipRRect( child: ClipRRect(
borderRadius: BorderRadius.circular(10), borderRadius: BorderRadius.circular(10),
child: CachedNetworkImage( child: CachedNetworkImage(
fit: BoxFit.cover, fit: BoxFit.cover,
height: index % 2 == 0 ? 260 : 200, height: index % 2 == 0 ? 260 : 200,
imageUrl: controller.collectImages.value[index].imgUrl ?? "", memCacheHeight: index % 2 == 0 ? 260 * 2 : 200 * 2,
maxHeightDiskCache: index % 2 == 0 ? 260 * 2 : 200 * 2,
imageUrl: controller.workImages.value[index].minioUrl ?? "",
placeholder: (context, url) => Container( placeholder: (context, url) => Container(
alignment: Alignment.center, alignment: Alignment.center,
child: const SizedBox( child: const SizedBox(
...@@ -67,24 +67,42 @@ class MyWorkPage extends GetView<MyWorkController> { ...@@ -67,24 +67,42 @@ class MyWorkPage extends GetView<MyWorkController> {
}, },
mainAxisSpacing: 10.0, mainAxisSpacing: 10.0,
crossAxisSpacing: 10.0, crossAxisSpacing: 10.0,
); )
));
} }
return MasonryGridView.count(
itemCount: controller.workImages.value.length, Widget makeMyCollectListView() {
// TODO: implement build
final controller = Get.find<MyWorkController>();
return Obx(() => SmartRefresher(
enablePullUp: true,
controller: controller.refreshController,
onRefresh: controller.onPullRefresh,
onLoading: controller.onLoadMore,
header: const ClassicHeader(
releaseText: "松开刷新",
refreshingText: "刷新数据中",
completeText: "刷新数据成功",
idleText: "下拉刷新"
),
footer: const ClassicFooter(
loadingText: "正在加载中...",
noDataText: '没有更多数据啦'
),
child: MasonryGridView.count(
itemCount: controller.collectImageCount.value,
crossAxisCount: 2, crossAxisCount: 2,
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
return InkWell( return InkWell(
onTap: () { onTap: () {
controller.onClickWorkImage(index); controller.onClickCollectImage(index);
}, },
child: ClipRRect( child: ClipRRect(
borderRadius: BorderRadius.circular(10), borderRadius: BorderRadius.circular(10),
child: CachedNetworkImage( child: CachedNetworkImage(
fit: BoxFit.cover, fit: BoxFit.cover,
height: index % 2 == 0 ? 260 : 200, height: index % 2 == 0 ? 260 : 200,
memCacheHeight: index % 2 == 0 ? 260 * 2 : 200 * 2, imageUrl: controller.collectImages.value[index].imgUrl ?? "",
maxHeightDiskCache: index % 2 == 0 ? 260 * 2 : 200 * 2,
imageUrl: controller.workImages.value[index].minioUrl ?? "",
placeholder: (context, url) => Container( placeholder: (context, url) => Container(
alignment: Alignment.center, alignment: Alignment.center,
child: const SizedBox( child: const SizedBox(
...@@ -103,9 +121,8 @@ class MyWorkPage extends GetView<MyWorkController> { ...@@ -103,9 +121,8 @@ class MyWorkPage extends GetView<MyWorkController> {
}, },
mainAxisSpacing: 10.0, mainAxisSpacing: 10.0,
crossAxisSpacing: 10.0, crossAxisSpacing: 10.0,
); )
}) ));
);
} }
@override @override
...@@ -125,7 +142,9 @@ class MyWorkPage extends GetView<MyWorkController> { ...@@ -125,7 +142,9 @@ class MyWorkPage extends GetView<MyWorkController> {
backgroundColor: const Color.fromARGB(0, 29, 33, 60), backgroundColor: const Color.fromARGB(0, 29, 33, 60),
), ),
body: SafeArea( body: SafeArea(
child: makeListView(), child: controller.title.value == "我的收藏" ?
makeMyCollectListView() :
makeMyWorkListView(),
), ),
); );
}, },
......
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