修改包名 androidlogo 充公我喜欢的 喜欢我的 最近来访
@ -42,9 +42,23 @@ android {
|
|||||||
main.java.srcDirs += 'src/main/kotlin'
|
main.java.srcDirs += 'src/main/kotlin'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
signingConfigs {
|
||||||
|
debug {
|
||||||
|
storeFile file('../leyuan.jks')
|
||||||
|
storePassword 'leyuan'
|
||||||
|
keyAlias = 'leyuan'
|
||||||
|
keyPassword 'leyuan'
|
||||||
|
}
|
||||||
|
release {
|
||||||
|
storeFile file('../leyuan.jks')
|
||||||
|
storePassword 'leyuan'
|
||||||
|
keyAlias = 'leyuan'
|
||||||
|
keyPassword 'leyuan'
|
||||||
|
}
|
||||||
|
}
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
|
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
|
||||||
applicationId "com.example.circle_app"
|
applicationId "com.leyuan.app"
|
||||||
// You can update the following values to match your application needs.
|
// You can update the following values to match your application needs.
|
||||||
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
|
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
|
||||||
minSdkVersion 21
|
minSdkVersion 21
|
||||||
|
|||||||
@ -1,8 +1,9 @@
|
|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="com.example.circle_app">
|
package="com.leyuan.app">
|
||||||
<!-- The INTERNET permission is required for development. Specifically,
|
<!-- The INTERNET permission is required for development. Specifically,
|
||||||
the Flutter tool needs it to communicate with the running application
|
the Flutter tool needs it to communicate with the running application
|
||||||
to allow setting breakpoints, to provide hot reload, etc.
|
to allow setting breakpoints, to provide hot reload, etc.
|
||||||
|
|
||||||
-->
|
-->
|
||||||
<uses-permission android:name="android.permission.INTERNET"/>
|
<uses-permission android:name="android.permission.INTERNET"/>
|
||||||
</manifest>
|
</manifest>
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="com.example.circle_app">
|
package="com.leyuan.app">
|
||||||
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
|
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
|
||||||
<uses-permission android:name="android.permission.INTERNET"/>
|
<uses-permission android:name="android.permission.INTERNET"/>
|
||||||
<uses-permission
|
<uses-permission
|
||||||
|
|||||||
BIN
circle_app/android/app/src/main/ic_launcher-playstore.png
Normal file
|
After Width: | Height: | Size: 56 KiB |
@ -1,4 +1,4 @@
|
|||||||
package com.example.circle_app
|
package com.leyuan.app
|
||||||
|
|
||||||
import io.flutter.embedding.android.FlutterActivity
|
import io.flutter.embedding.android.FlutterActivity
|
||||||
|
|
||||||
@ -0,0 +1,74 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector
|
||||||
|
android:height="108dp"
|
||||||
|
android:width="108dp"
|
||||||
|
android:viewportHeight="108"
|
||||||
|
android:viewportWidth="108"
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<path android:fillColor="#3DDC84"
|
||||||
|
android:pathData="M0,0h108v108h-108z"/>
|
||||||
|
<path android:fillColor="#00000000" android:pathData="M9,0L9,108"
|
||||||
|
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
|
||||||
|
<path android:fillColor="#00000000" android:pathData="M19,0L19,108"
|
||||||
|
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
|
||||||
|
<path android:fillColor="#00000000" android:pathData="M29,0L29,108"
|
||||||
|
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
|
||||||
|
<path android:fillColor="#00000000" android:pathData="M39,0L39,108"
|
||||||
|
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
|
||||||
|
<path android:fillColor="#00000000" android:pathData="M49,0L49,108"
|
||||||
|
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
|
||||||
|
<path android:fillColor="#00000000" android:pathData="M59,0L59,108"
|
||||||
|
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
|
||||||
|
<path android:fillColor="#00000000" android:pathData="M69,0L69,108"
|
||||||
|
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
|
||||||
|
<path android:fillColor="#00000000" android:pathData="M79,0L79,108"
|
||||||
|
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
|
||||||
|
<path android:fillColor="#00000000" android:pathData="M89,0L89,108"
|
||||||
|
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
|
||||||
|
<path android:fillColor="#00000000" android:pathData="M99,0L99,108"
|
||||||
|
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
|
||||||
|
<path android:fillColor="#00000000" android:pathData="M0,9L108,9"
|
||||||
|
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
|
||||||
|
<path android:fillColor="#00000000" android:pathData="M0,19L108,19"
|
||||||
|
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
|
||||||
|
<path android:fillColor="#00000000" android:pathData="M0,29L108,29"
|
||||||
|
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
|
||||||
|
<path android:fillColor="#00000000" android:pathData="M0,39L108,39"
|
||||||
|
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
|
||||||
|
<path android:fillColor="#00000000" android:pathData="M0,49L108,49"
|
||||||
|
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
|
||||||
|
<path android:fillColor="#00000000" android:pathData="M0,59L108,59"
|
||||||
|
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
|
||||||
|
<path android:fillColor="#00000000" android:pathData="M0,69L108,69"
|
||||||
|
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
|
||||||
|
<path android:fillColor="#00000000" android:pathData="M0,79L108,79"
|
||||||
|
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
|
||||||
|
<path android:fillColor="#00000000" android:pathData="M0,89L108,89"
|
||||||
|
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
|
||||||
|
<path android:fillColor="#00000000" android:pathData="M0,99L108,99"
|
||||||
|
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
|
||||||
|
<path android:fillColor="#00000000" android:pathData="M19,29L89,29"
|
||||||
|
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
|
||||||
|
<path android:fillColor="#00000000" android:pathData="M19,39L89,39"
|
||||||
|
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
|
||||||
|
<path android:fillColor="#00000000" android:pathData="M19,49L89,49"
|
||||||
|
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
|
||||||
|
<path android:fillColor="#00000000" android:pathData="M19,59L89,59"
|
||||||
|
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
|
||||||
|
<path android:fillColor="#00000000" android:pathData="M19,69L89,69"
|
||||||
|
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
|
||||||
|
<path android:fillColor="#00000000" android:pathData="M19,79L89,79"
|
||||||
|
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
|
||||||
|
<path android:fillColor="#00000000" android:pathData="M29,19L29,89"
|
||||||
|
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
|
||||||
|
<path android:fillColor="#00000000" android:pathData="M39,19L39,89"
|
||||||
|
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
|
||||||
|
<path android:fillColor="#00000000" android:pathData="M49,19L49,89"
|
||||||
|
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
|
||||||
|
<path android:fillColor="#00000000" android:pathData="M59,19L59,89"
|
||||||
|
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
|
||||||
|
<path android:fillColor="#00000000" android:pathData="M69,19L69,89"
|
||||||
|
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
|
||||||
|
<path android:fillColor="#00000000" android:pathData="M79,19L79,89"
|
||||||
|
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
|
||||||
|
</vector>
|
||||||
@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<background android:drawable="@drawable/ic_launcher_background"/>
|
||||||
|
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
||||||
|
</adaptive-icon>
|
||||||
@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<background android:drawable="@drawable/ic_launcher_background"/>
|
||||||
|
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
||||||
|
</adaptive-icon>
|
||||||
|
Before Width: | Height: | Size: 6.8 KiB After Width: | Height: | Size: 6.5 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 6.9 KiB |
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 4.1 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 63 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 27 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 27 KiB |
@ -1,5 +1,5 @@
|
|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="com.example.circle_app">
|
package="com.leyuan.app">
|
||||||
<!-- The INTERNET permission is required for development. Specifically,
|
<!-- The INTERNET permission is required for development. Specifically,
|
||||||
the Flutter tool needs it to communicate with the running application
|
the Flutter tool needs it to communicate with the running application
|
||||||
to allow setting breakpoints, to provide hot reload, etc.
|
to allow setting breakpoints, to provide hot reload, etc.
|
||||||
|
|||||||
@ -1,111 +1,62 @@
|
|||||||
|
import 'dart:ffi';
|
||||||
|
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:pull_to_refresh/pull_to_refresh.dart';
|
import 'package:pull_to_refresh/pull_to_refresh.dart';
|
||||||
|
|
||||||
import '../../network/api.dart';
|
import '../../network/api.dart';
|
||||||
import '../../network/dio_manager.dart';
|
import '../../network/dio_manager.dart';
|
||||||
|
import '../../util/util.dart';
|
||||||
import 'state.dart';
|
import 'state.dart';
|
||||||
|
|
||||||
class FriendslistLogic extends GetxController {
|
class FriendslistLogic extends GetxController {
|
||||||
|
|
||||||
final RefreshController refreshController = RefreshController();
|
final RefreshController refreshController = RefreshController();
|
||||||
final FriendslistState state = FriendslistState();
|
final FriendslistState state = FriendslistState();
|
||||||
final type = Get.arguments as String;
|
|
||||||
int page = 1;
|
int page = 1;
|
||||||
int isVip = 0;
|
int isVip = 0;
|
||||||
bool isLoad = true;
|
bool isLoad = true;
|
||||||
List<UserInfo> lists = [];
|
List<UserInfo> lists = [];
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void onInit() async{
|
void onInit() async {
|
||||||
super.onInit();
|
super.onInit();
|
||||||
initList();
|
initList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
initList() async {
|
||||||
initList() async{
|
if (page == 1) {
|
||||||
if(page==1){
|
|
||||||
lists.clear();
|
lists.clear();
|
||||||
}
|
}
|
||||||
switch(type){
|
var data = await DioManager.instance
|
||||||
case "0":
|
.get(url: Api.followList, params: {'page': page});
|
||||||
var data =
|
var bean = BaseResponse<User>.fromJson(data, (data) => User.fromJson(data));
|
||||||
await DioManager.instance.get(url: Api.followList, params: {
|
if (bean.isSuccess()) {
|
||||||
'page':page
|
lists.addAll(bean.data.lists);
|
||||||
});
|
}
|
||||||
var bean = BaseResponse<User>.fromJson(data, (data) => User.fromJson(data));
|
isLoad = false;
|
||||||
if (bean.isSuccess()) {
|
update();
|
||||||
lists.addAll(bean.data.lists);
|
if (page == 1) {
|
||||||
}
|
refreshController.refreshCompleted();
|
||||||
isLoad = false;
|
} else {
|
||||||
update();
|
refreshController.loadComplete();
|
||||||
if(page == 1){
|
|
||||||
refreshController.refreshCompleted();
|
|
||||||
}else{
|
|
||||||
refreshController.loadComplete();
|
|
||||||
}
|
|
||||||
return ;
|
|
||||||
case "1":
|
|
||||||
var data =
|
|
||||||
await DioManager.instance.get(url: Api.fansList, params: {
|
|
||||||
'page':page
|
|
||||||
});
|
|
||||||
var bean = BaseResponse<User>.fromJson(data, (data) => User.fromJson(data));
|
|
||||||
if (bean.isSuccess()) {
|
|
||||||
lists.addAll(bean.data.lists);
|
|
||||||
}
|
|
||||||
isLoad = false;
|
|
||||||
update();
|
|
||||||
if(page == 1){
|
|
||||||
refreshController.refreshCompleted();
|
|
||||||
}else{
|
|
||||||
refreshController.loadComplete();
|
|
||||||
}
|
|
||||||
return ;
|
|
||||||
case "2":
|
|
||||||
var data =
|
|
||||||
await DioManager.instance.get(url: Api.visitList, params: {
|
|
||||||
'page':page
|
|
||||||
});
|
|
||||||
var bean = BaseResponse<User>.fromJson(data, (data) => User.fromJson(data));
|
|
||||||
if (bean.isSuccess()) {
|
|
||||||
lists.addAll(bean.data.lists);
|
|
||||||
}
|
|
||||||
|
|
||||||
isLoad = false;
|
|
||||||
update();
|
|
||||||
if(page == 1){
|
|
||||||
refreshController.refreshCompleted();
|
|
||||||
}else{
|
|
||||||
refreshController.loadComplete();
|
|
||||||
}
|
|
||||||
return ;
|
|
||||||
case "3":
|
|
||||||
var data =
|
|
||||||
await DioManager.instance.get(url: Api.visitList, params: {
|
|
||||||
'page':page
|
|
||||||
});
|
|
||||||
var bean = BaseResponse<User>.fromJson(data, (data) => User.fromJson(data));
|
|
||||||
if (bean.isSuccess()) {
|
|
||||||
lists.addAll(bean.data.lists);
|
|
||||||
}
|
|
||||||
|
|
||||||
isLoad = false;
|
|
||||||
update();
|
|
||||||
if(page == 1){
|
|
||||||
refreshController.refreshCompleted();
|
|
||||||
}else{
|
|
||||||
refreshController.loadComplete();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setLike(int index) async {
|
||||||
|
var data = await DioManager.instance.post(
|
||||||
|
url: "${Api.setLike + lists[index].id.toString()}/follow",
|
||||||
|
params: {'status': lists[index].isLike? "0" : "1"});
|
||||||
|
var bean = BaseResponse<dynamic>.fromJson(
|
||||||
|
data,
|
||||||
|
(jsonData) => jsonData,
|
||||||
|
);
|
||||||
|
if (bean.isSuccess()) {
|
||||||
|
lists[index].isLike = !lists[index].isLike;
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
showToast(bean.msg);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class User {
|
class User {
|
||||||
final List<UserInfo> lists;
|
final List<UserInfo> lists;
|
||||||
final int total;
|
final int total;
|
||||||
@ -114,7 +65,8 @@ class User {
|
|||||||
|
|
||||||
factory User.fromJson(Map<String, dynamic> json) {
|
factory User.fromJson(Map<String, dynamic> json) {
|
||||||
final List<dynamic> userList = json['lists'];
|
final List<dynamic> userList = json['lists'];
|
||||||
final List<UserInfo> users = userList.map((user) => UserInfo.fromJson(user)).toList();
|
final List<UserInfo> users =
|
||||||
|
userList.map((user) => UserInfo.fromJson(user)).toList();
|
||||||
final int total = json['total'];
|
final int total = json['total'];
|
||||||
return User(lists: users, total: total);
|
return User(lists: users, total: total);
|
||||||
}
|
}
|
||||||
@ -131,7 +83,7 @@ class UserInfo {
|
|||||||
final int gender;
|
final int gender;
|
||||||
final int role;
|
final int role;
|
||||||
final int orientation;
|
final int orientation;
|
||||||
|
bool isLike = true;
|
||||||
final double lng;
|
final double lng;
|
||||||
final double lat;
|
final double lat;
|
||||||
final String city;
|
final String city;
|
||||||
@ -148,6 +100,7 @@ class UserInfo {
|
|||||||
required this.gender,
|
required this.gender,
|
||||||
required this.role,
|
required this.role,
|
||||||
required this.orientation,
|
required this.orientation,
|
||||||
|
this.isLike = true,
|
||||||
required this.lng,
|
required this.lng,
|
||||||
required this.lat,
|
required this.lat,
|
||||||
required this.city,
|
required this.city,
|
||||||
@ -173,4 +126,3 @@ class UserInfo {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -28,7 +28,7 @@ class FriendslistPage extends StatelessWidget {
|
|||||||
child: Scaffold(
|
child: Scaffold(
|
||||||
backgroundColor: Colors.transparent,
|
backgroundColor: Colors.transparent,
|
||||||
appBar: MyAppBar(
|
appBar: MyAppBar(
|
||||||
centerTitle: _getTitleName(logic.type),
|
centerTitle: "我喜欢的",
|
||||||
),
|
),
|
||||||
body: SafeArea(
|
body: SafeArea(
|
||||||
child: logic.isLoad ? loaddingWidget(true) : logic.lists.isEmpty ? noResultWidget() : SmartRefresher(
|
child: logic.isLoad ? loaddingWidget(true) : logic.lists.isEmpty ? noResultWidget() : SmartRefresher(
|
||||||
@ -39,7 +39,7 @@ class FriendslistPage extends StatelessWidget {
|
|||||||
padding: EdgeInsets.all(10.sp),
|
padding: EdgeInsets.all(10.sp),
|
||||||
itemCount: logic.lists.length,
|
itemCount: logic.lists.length,
|
||||||
itemBuilder: (context, index) {
|
itemBuilder: (context, index) {
|
||||||
return ListItem(logic.lists[index]);
|
return ListItem(logic.lists[index],index);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -49,7 +49,7 @@ class FriendslistPage extends StatelessWidget {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget ListItem(UserInfo item) {
|
Widget ListItem(UserInfo item,int index) {
|
||||||
return GestureDetector(
|
return GestureDetector(
|
||||||
onTap: (){
|
onTap: (){
|
||||||
Get.toNamed(AppRoutes.UserInfoActivity, arguments: item.id.toString());
|
Get.toNamed(AppRoutes.UserInfoActivity, arguments: item.id.toString());
|
||||||
@ -82,7 +82,7 @@ class FriendslistPage extends StatelessWidget {
|
|||||||
left: 0,
|
left: 0,
|
||||||
bottom: 0,
|
bottom: 0,
|
||||||
|
|
||||||
child: item.vip>0 ?
|
child: item.vip!=null&&item.vip>0 ?
|
||||||
Image(
|
Image(
|
||||||
image: AssetImage(getBaseImage("vip")),
|
image: AssetImage(getBaseImage("vip")),
|
||||||
width: 44.sp,
|
width: 44.sp,
|
||||||
@ -119,22 +119,22 @@ class FriendslistPage extends StatelessWidget {
|
|||||||
// Pla
|
// Pla
|
||||||
Spacer(),
|
Spacer(),
|
||||||
GestureDetector(onTap: (){
|
GestureDetector(onTap: (){
|
||||||
showToast("私聊");
|
|
||||||
|
logic.setLike(index);
|
||||||
},
|
},
|
||||||
child: Container(
|
child: Container(
|
||||||
width: 60,
|
width: 75,
|
||||||
height: 28,
|
height: 28,
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: Color(0xFFFF4D7C),
|
color: Color(0xFFFF4D7C),
|
||||||
borderRadius: BorderRadius.circular(14),
|
borderRadius: BorderRadius.circular(14),
|
||||||
),
|
),
|
||||||
child: Center(
|
child:
|
||||||
child: Text(
|
Center(
|
||||||
"私聊",
|
child: Text(item.isLike?"取消喜欢":"喜欢", style: TextStyle(fontSize: 14, color: Colors.white)),
|
||||||
style: TextStyle(fontSize: 14, color: Colors.white),
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
),),
|
),
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),);
|
),);
|
||||||
@ -174,20 +174,7 @@ class FriendslistPage extends StatelessWidget {
|
|||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
String _getTitleName(String type) {
|
|
||||||
switch (type) {
|
|
||||||
case "0":
|
|
||||||
return "我喜欢的";
|
|
||||||
case "1":
|
|
||||||
return "喜欢我的";
|
|
||||||
case "2":
|
|
||||||
return "最近访客";
|
|
||||||
case "3":
|
|
||||||
return "最近来访";
|
|
||||||
default:
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void _onRefresh() async {
|
void _onRefresh() async {
|
||||||
logic.page = 1;
|
logic.page = 1;
|
||||||
|
|||||||
10
circle_app/lib/app/likelist/binding.dart
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import 'package:get/get.dart';
|
||||||
|
|
||||||
|
import 'logic.dart';
|
||||||
|
|
||||||
|
class LikelistBinding extends Bindings {
|
||||||
|
@override
|
||||||
|
void dependencies() {
|
||||||
|
Get.lazyPut(() => LikelistLogic());
|
||||||
|
}
|
||||||
|
}
|
||||||
163
circle_app/lib/app/likelist/logic.dart
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
import 'dart:ffi';
|
||||||
|
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
import 'package:pull_to_refresh/pull_to_refresh.dart';
|
||||||
|
|
||||||
|
import '../../network/api.dart';
|
||||||
|
import '../../network/dio_manager.dart';
|
||||||
|
import '../../util/util.dart';
|
||||||
|
import 'state.dart';
|
||||||
|
|
||||||
|
class LikelistLogic extends GetxController {
|
||||||
|
|
||||||
|
final RefreshController refreshController = RefreshController();
|
||||||
|
final LikelistState state = LikelistState();
|
||||||
|
|
||||||
|
int page = 1;
|
||||||
|
int isVip = 0;
|
||||||
|
bool isLoad = true;
|
||||||
|
List<UserListItem> lists = [];
|
||||||
|
@override
|
||||||
|
void onInit() async{
|
||||||
|
super.onInit();
|
||||||
|
initList();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
initList() async{
|
||||||
|
if(page==1){
|
||||||
|
lists.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
var data =
|
||||||
|
await DioManager.instance.get(url: Api.fansList, params: {
|
||||||
|
'page':page
|
||||||
|
});
|
||||||
|
var bean = BaseResponse<UserList>.fromJson(data, (data) => UserList.fromJson(data));
|
||||||
|
if (bean.isSuccess()) {
|
||||||
|
lists.addAll(bean.data.lists);
|
||||||
|
}
|
||||||
|
isLoad = false;
|
||||||
|
update();
|
||||||
|
if(page == 1){
|
||||||
|
refreshController.refreshCompleted();
|
||||||
|
}else{
|
||||||
|
refreshController.loadComplete();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
setLike(int index) async {
|
||||||
|
var data = await DioManager.instance.post(
|
||||||
|
url: "${Api.setLike + lists[index].user.id.toString()}/follow",
|
||||||
|
params: {'status': lists[index].isLike?"0":"1"});
|
||||||
|
var bean = BaseResponse<dynamic>.fromJson(
|
||||||
|
data,
|
||||||
|
(jsonData) => jsonData,
|
||||||
|
);
|
||||||
|
if (bean.isSuccess()) {
|
||||||
|
lists[index].isLike = !lists[index].isLike;
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
showToast(bean.msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class User {
|
||||||
|
final int id;
|
||||||
|
final String nickname;
|
||||||
|
final String avatar;
|
||||||
|
final String signature;
|
||||||
|
final String birthday;
|
||||||
|
final int age;
|
||||||
|
final int vip;
|
||||||
|
final int gender;
|
||||||
|
final int role;
|
||||||
|
final int orientation;
|
||||||
|
final double lng;
|
||||||
|
final double lat;
|
||||||
|
final String city;
|
||||||
|
final String avatarThumb;
|
||||||
|
|
||||||
|
User({
|
||||||
|
required this.id,
|
||||||
|
required this.nickname,
|
||||||
|
required this.avatar,
|
||||||
|
required this.signature,
|
||||||
|
required this.birthday,
|
||||||
|
required this.age,
|
||||||
|
required this.vip,
|
||||||
|
required this.gender,
|
||||||
|
required this.role,
|
||||||
|
required this.orientation,
|
||||||
|
required this.lng,
|
||||||
|
required this.lat,
|
||||||
|
required this.city,
|
||||||
|
required this.avatarThumb,
|
||||||
|
});
|
||||||
|
|
||||||
|
factory User.fromJson(Map<String, dynamic> json) {
|
||||||
|
return User(
|
||||||
|
id: json['id'],
|
||||||
|
nickname: json['nickname'],
|
||||||
|
avatar: json['avatar'],
|
||||||
|
signature: json['signature'],
|
||||||
|
birthday: json['birthday'],
|
||||||
|
age: json['age'],
|
||||||
|
vip: json['vip'],
|
||||||
|
gender: json['gender'],
|
||||||
|
role: json['role'],
|
||||||
|
orientation: json['orientation'],
|
||||||
|
lng: json['lng'],
|
||||||
|
lat: json['lat'],
|
||||||
|
city: json['city'],
|
||||||
|
avatarThumb: json['avatar_thumb'],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class UserListItem {
|
||||||
|
final User user;
|
||||||
|
bool isLike;
|
||||||
|
|
||||||
|
UserListItem({
|
||||||
|
required this.user,
|
||||||
|
required this.isLike,
|
||||||
|
});
|
||||||
|
|
||||||
|
factory UserListItem.fromJson(Map<String, dynamic> json) {
|
||||||
|
return UserListItem(
|
||||||
|
user: User.fromJson(json['user']),
|
||||||
|
isLike: json['isLike'],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class UserList {
|
||||||
|
final List<UserListItem> lists;
|
||||||
|
|
||||||
|
UserList({
|
||||||
|
required this.lists,
|
||||||
|
});
|
||||||
|
|
||||||
|
factory UserList.fromJson(Map<String, dynamic> json) {
|
||||||
|
List<UserListItem> userItems = [];
|
||||||
|
if (json['lists'] != null) {
|
||||||
|
for (var item in json['lists']) {
|
||||||
|
userItems.add(UserListItem.fromJson(item));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return UserList(
|
||||||
|
lists: userItems,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
5
circle_app/lib/app/likelist/state.dart
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
class LikelistState {
|
||||||
|
LikelistState() {
|
||||||
|
///Initialize variables
|
||||||
|
}
|
||||||
|
}
|
||||||
196
circle_app/lib/app/likelist/view.dart
Normal file
@ -0,0 +1,196 @@
|
|||||||
|
import 'package:cached_network_image/cached_network_image.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
import 'package:pull_to_refresh/pull_to_refresh.dart';
|
||||||
|
|
||||||
|
import '../../components/my_app_bar.dart';
|
||||||
|
import '../../router/app_routers.dart';
|
||||||
|
import '../../util/util.dart';
|
||||||
|
import 'logic.dart';
|
||||||
|
|
||||||
|
class LikelistPage extends StatelessWidget {
|
||||||
|
LikelistPage({Key? key}) : super(key: key);
|
||||||
|
|
||||||
|
final logic = Get.find<LikelistLogic>();
|
||||||
|
final state = Get.find<LikelistLogic>().state;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return GetBuilder<LikelistLogic>(builder: (logic) {
|
||||||
|
return Container(
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
image: DecorationImage(
|
||||||
|
image: AssetImage(getBaseImage("home_back")),
|
||||||
|
fit: BoxFit.cover,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
child: Scaffold(
|
||||||
|
backgroundColor: Colors.transparent,
|
||||||
|
appBar: MyAppBar(
|
||||||
|
centerTitle: "喜欢我的",
|
||||||
|
),
|
||||||
|
body: SafeArea(
|
||||||
|
child: logic.isLoad
|
||||||
|
? loaddingWidget(true)
|
||||||
|
: logic.lists.isEmpty
|
||||||
|
? noResultWidget()
|
||||||
|
: SmartRefresher(
|
||||||
|
controller: logic.refreshController,
|
||||||
|
onRefresh: _onRefresh,
|
||||||
|
onLoading: _onLoading,
|
||||||
|
child: ListView.builder(
|
||||||
|
padding: EdgeInsets.all(10.sp),
|
||||||
|
itemCount: logic.lists.length,
|
||||||
|
itemBuilder: (context, index) {
|
||||||
|
return ListItem(logic.lists[index], index);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget ListItem(UserListItem item, int index) {
|
||||||
|
return GestureDetector(
|
||||||
|
onTap: () {
|
||||||
|
Get.toNamed(AppRoutes.UserInfoActivity,
|
||||||
|
arguments: item.user.id.toString());
|
||||||
|
},
|
||||||
|
child: Container(
|
||||||
|
margin: EdgeInsets.only(bottom: 21),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Stack(
|
||||||
|
children: [
|
||||||
|
ClipOval(
|
||||||
|
child: GestureDetector(
|
||||||
|
onTap: () {
|
||||||
|
var imgList = <String>[];
|
||||||
|
imgList.add(item.user.avatar);
|
||||||
|
Get.toNamed(AppRoutes.Swiper,
|
||||||
|
arguments: {'imaglist': imgList, 'index': 0});
|
||||||
|
},
|
||||||
|
child: CachedNetworkImage(
|
||||||
|
fit: BoxFit.cover,
|
||||||
|
imageUrl: item.user.avatar,
|
||||||
|
width: 53.sp,
|
||||||
|
height: 53.sp,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Positioned(
|
||||||
|
right: 0,
|
||||||
|
left: 0,
|
||||||
|
bottom: 0,
|
||||||
|
child: item.isLike
|
||||||
|
? Image(
|
||||||
|
image: AssetImage(getBaseImage("vip")),
|
||||||
|
width: 44.sp,
|
||||||
|
height: 18.sp,
|
||||||
|
)
|
||||||
|
: Container(),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
SizedBox(width: 10.sp),
|
||||||
|
Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
item.user.nickname,
|
||||||
|
style: const TextStyle(
|
||||||
|
color: Colors.white70,
|
||||||
|
fontSize: 14,
|
||||||
|
fontWeight: FontWeight.bold),
|
||||||
|
),
|
||||||
|
SizedBox(width: 4.sp),
|
||||||
|
// SizedBox(height: 8.sp),
|
||||||
|
_buildInfoRow(item),
|
||||||
|
// Placeholder image
|
||||||
|
],
|
||||||
|
),
|
||||||
|
SizedBox(height: 8.sp),
|
||||||
|
Container(
|
||||||
|
width: 150.sp,
|
||||||
|
child: Text(
|
||||||
|
item.user.signature,
|
||||||
|
style: TextStyle(fontSize: 12.sp, color: Color(0xFFB7BECC)),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
// Pla
|
||||||
|
Spacer(),
|
||||||
|
GestureDetector(
|
||||||
|
onTap: () {
|
||||||
|
logic.setLike(index);
|
||||||
|
},
|
||||||
|
child: Container(
|
||||||
|
width: 75,
|
||||||
|
height: 28,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Color(0xFFFF4D7C),
|
||||||
|
borderRadius: BorderRadius.circular(14),
|
||||||
|
),
|
||||||
|
child: Center(
|
||||||
|
child: Text(item.isLike ? "互相关注" : "关注",
|
||||||
|
style: TextStyle(fontSize: 14, color: Colors.white)),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildInfoRow(UserListItem userInfoBean) {
|
||||||
|
String ageMsg = getAgeCOntent(
|
||||||
|
userInfoBean.user.gender,
|
||||||
|
userInfoBean.user.age,
|
||||||
|
userInfoBean.user.role,
|
||||||
|
userInfoBean.user.orientation);
|
||||||
|
return Row(
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.circular(17),
|
||||||
|
gradient: LinearGradient(
|
||||||
|
colors: [
|
||||||
|
Color.fromRGBO(141, 255, 248, 1.0),
|
||||||
|
Color.fromRGBO(181, 211, 255, 1.0),
|
||||||
|
],
|
||||||
|
begin: Alignment.centerLeft,
|
||||||
|
end: Alignment.centerRight,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
padding: EdgeInsets.only(
|
||||||
|
top: 2.sp, bottom: 2.sp, left: 10.sp, right: 10.sp),
|
||||||
|
child: Text(
|
||||||
|
ageMsg,
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.black,
|
||||||
|
fontSize: 10,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(width: 6.sp),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _onRefresh() async {
|
||||||
|
logic.page = 1;
|
||||||
|
logic.initList();
|
||||||
|
}
|
||||||
|
|
||||||
|
void _onLoading() async {
|
||||||
|
logic.page = logic.page + 1;
|
||||||
|
logic.initList();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -28,6 +28,7 @@ class MinefragmentLogic extends GetxController {
|
|||||||
int orientation = -1;
|
int orientation = -1;
|
||||||
|
|
||||||
String enterHomeInfoMsg = "进入主页";
|
String enterHomeInfoMsg = "进入主页";
|
||||||
|
String JoinedCircle = "";
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void onInit() async {
|
void onInit() async {
|
||||||
@ -43,9 +44,11 @@ class MinefragmentLogic extends GetxController {
|
|||||||
like_count = bean.data.likeCount ?? 0;
|
like_count = bean.data.likeCount ?? 0;
|
||||||
like_me_count = bean.data.likeMeCount ?? 0;
|
like_me_count = bean.data.likeMeCount ?? 0;
|
||||||
recent_visit_count = bean.data.recentVisitCount ?? 0;
|
recent_visit_count = bean.data.recentVisitCount ?? 0;
|
||||||
|
JoinedCircle = "${"加入了"+bean.data.joininterestcount.toString()}个圈子";
|
||||||
SharedPreferences sharedPreferences =
|
SharedPreferences sharedPreferences =
|
||||||
await SharedPreferences.getInstance();
|
await SharedPreferences.getInstance();
|
||||||
|
|
||||||
|
|
||||||
int likeMeCount = sharedPreferences.getInt(SharedPreferencesHelper.LIKEMECOUNT)??0;
|
int likeMeCount = sharedPreferences.getInt(SharedPreferencesHelper.LIKEMECOUNT)??0;
|
||||||
int recentVisitCount = sharedPreferences.getInt(SharedPreferencesHelper.RECENTVISITCOUNT)??0;
|
int recentVisitCount = sharedPreferences.getInt(SharedPreferencesHelper.RECENTVISITCOUNT)??0;
|
||||||
sharedPreferences.setString(SharedPreferencesHelper.PHOTO, bean.data.phone);
|
sharedPreferences.setString(SharedPreferencesHelper.PHOTO, bean.data.phone);
|
||||||
@ -151,6 +154,7 @@ class MineResponseBean {
|
|||||||
String? vipExpireDate;
|
String? vipExpireDate;
|
||||||
int? vipExpireDays;
|
int? vipExpireDays;
|
||||||
String phone;
|
String phone;
|
||||||
|
int? joininterestcount;
|
||||||
|
|
||||||
MineResponseBean(
|
MineResponseBean(
|
||||||
{required this.user,
|
{required this.user,
|
||||||
@ -159,7 +163,8 @@ class MineResponseBean {
|
|||||||
required this.recentVisitCount,
|
required this.recentVisitCount,
|
||||||
this.vipExpireDate,
|
this.vipExpireDate,
|
||||||
this.vipExpireDays,
|
this.vipExpireDays,
|
||||||
required this.phone});
|
required this.phone,
|
||||||
|
required this.joininterestcount});
|
||||||
|
|
||||||
factory MineResponseBean.fromJson(Map<String, dynamic> json) {
|
factory MineResponseBean.fromJson(Map<String, dynamic> json) {
|
||||||
return MineResponseBean(
|
return MineResponseBean(
|
||||||
@ -170,6 +175,9 @@ class MineResponseBean {
|
|||||||
recentVisitCount: json['recent_visit_count'],
|
recentVisitCount: json['recent_visit_count'],
|
||||||
vipExpireDate: json['vip_expire_date'],
|
vipExpireDate: json['vip_expire_date'],
|
||||||
vipExpireDays: json['vip_expire_days'],
|
vipExpireDays: json['vip_expire_days'],
|
||||||
|
joininterestcount: json['join_interest_count'],
|
||||||
|
|
||||||
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,3 +1,5 @@
|
|||||||
|
import 'dart:math';
|
||||||
|
|
||||||
import 'package:cached_network_image/cached_network_image.dart';
|
import 'package:cached_network_image/cached_network_image.dart';
|
||||||
import 'package:circle_app/router/app_routers.dart';
|
import 'package:circle_app/router/app_routers.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
@ -51,7 +53,7 @@ class MinefragmentPage extends StatelessWidget {
|
|||||||
fit: BoxFit.fill,
|
fit: BoxFit.fill,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
_CircleLiveView(),
|
_CircleLiveView(logic),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -60,10 +62,10 @@ class MinefragmentPage extends StatelessWidget {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _CircleLiveView() {
|
Widget _CircleLiveView(MinefragmentLogic logic) {
|
||||||
return Container(
|
return Container(
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [_CircleItemView(), _HelpItemView(), _SetUpItemView()],
|
children: [_CircleItemView(logic), _HelpItemView(), _SetUpItemView()],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -151,7 +153,7 @@ class MinefragmentPage extends StatelessWidget {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _CircleItemView() {
|
Widget _CircleItemView(MinefragmentLogic logic) {
|
||||||
return GestureDetector(
|
return GestureDetector(
|
||||||
behavior: HitTestBehavior.opaque,
|
behavior: HitTestBehavior.opaque,
|
||||||
onTap: () {
|
onTap: () {
|
||||||
@ -179,7 +181,7 @@ class MinefragmentPage extends StatelessWidget {
|
|||||||
Row(
|
Row(
|
||||||
children: [
|
children: [
|
||||||
Text(
|
Text(
|
||||||
"加入了3个圈子",
|
logic.JoinedCircle,
|
||||||
style: TextStyle(color: Colors.white30),
|
style: TextStyle(color: Colors.white30),
|
||||||
),
|
),
|
||||||
Image(
|
Image(
|
||||||
@ -207,7 +209,7 @@ class MinefragmentPage extends StatelessWidget {
|
|||||||
GestureDetector(
|
GestureDetector(
|
||||||
behavior: HitTestBehavior.opaque,
|
behavior: HitTestBehavior.opaque,
|
||||||
onTap: () {
|
onTap: () {
|
||||||
Get.toNamed(AppRoutes.FriendsActivity, arguments: "0");
|
Get.toNamed(AppRoutes.FriendsActivity);
|
||||||
},
|
},
|
||||||
child: Container(
|
child: Container(
|
||||||
child: Column(
|
child: Column(
|
||||||
@ -249,7 +251,7 @@ class MinefragmentPage extends StatelessWidget {
|
|||||||
sharedPreferences.setInt(SharedPreferencesHelper.LIKEMECOUNT, logic.like_me_count);
|
sharedPreferences.setInt(SharedPreferencesHelper.LIKEMECOUNT, logic.like_me_count);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
Get.toNamed(AppRoutes.FriendsActivity, arguments: "1");
|
Get.toNamed(AppRoutes.LikeListActivity);
|
||||||
},
|
},
|
||||||
child: Stack(
|
child: Stack(
|
||||||
children: [
|
children: [
|
||||||
@ -308,13 +310,8 @@ class MinefragmentPage extends StatelessWidget {
|
|||||||
SharedPreferencesHelper.getInstance().then((sharedPreferences) {
|
SharedPreferencesHelper.getInstance().then((sharedPreferences) {
|
||||||
sharedPreferences.setInt(SharedPreferencesHelper.RECENTVISITCOUNT, logic.recent_visit_count);
|
sharedPreferences.setInt(SharedPreferencesHelper.RECENTVISITCOUNT, logic.recent_visit_count);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Get.toNamed(AppRoutes.VisitorListActivity);
|
||||||
Get.toNamed(AppRoutes.FriendsActivity, arguments: "2");
|
|
||||||
|
|
||||||
},
|
},
|
||||||
child: Stack(
|
child: Stack(
|
||||||
children: [
|
children: [
|
||||||
|
|||||||
10
circle_app/lib/app/visitorlist/binding.dart
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import 'package:get/get.dart';
|
||||||
|
|
||||||
|
import 'logic.dart';
|
||||||
|
|
||||||
|
class VisitorlistBinding extends Bindings {
|
||||||
|
@override
|
||||||
|
void dependencies() {
|
||||||
|
Get.lazyPut(() => VisitorlistLogic());
|
||||||
|
}
|
||||||
|
}
|
||||||
146
circle_app/lib/app/visitorlist/logic.dart
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
import 'dart:ffi';
|
||||||
|
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
import 'package:pull_to_refresh/pull_to_refresh.dart';
|
||||||
|
|
||||||
|
import '../../network/api.dart';
|
||||||
|
import '../../network/dio_manager.dart';
|
||||||
|
import '../../util/util.dart';
|
||||||
|
import 'state.dart';
|
||||||
|
|
||||||
|
class VisitorlistLogic extends GetxController {
|
||||||
|
|
||||||
|
final RefreshController refreshController = RefreshController();
|
||||||
|
final VisitorlistState state = VisitorlistState();
|
||||||
|
int page = 1;
|
||||||
|
int isVip = 0;
|
||||||
|
bool isLoad = true;
|
||||||
|
List<UserListItem> lists = [];
|
||||||
|
|
||||||
|
@override
|
||||||
|
void onInit() async {
|
||||||
|
super.onInit();
|
||||||
|
initList();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
initList() async {
|
||||||
|
if (page == 1) {
|
||||||
|
lists.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
var data =
|
||||||
|
await DioManager.instance.get(url: Api.visitList, params: {
|
||||||
|
'page': page
|
||||||
|
});
|
||||||
|
var bean = BaseResponse<UserList>.fromJson(
|
||||||
|
data, (data) => UserList.fromJson(data));
|
||||||
|
if (bean.isSuccess()) {
|
||||||
|
lists.addAll(bean.data.lists);
|
||||||
|
}
|
||||||
|
|
||||||
|
isLoad = false;
|
||||||
|
update();
|
||||||
|
if (page == 1) {
|
||||||
|
refreshController.refreshCompleted();
|
||||||
|
} else {
|
||||||
|
refreshController.loadComplete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class User {
|
||||||
|
final int id;
|
||||||
|
final String nickname;
|
||||||
|
final String avatar;
|
||||||
|
final String signature;
|
||||||
|
final String birthday;
|
||||||
|
final int age;
|
||||||
|
final int vip;
|
||||||
|
final int gender;
|
||||||
|
final int role;
|
||||||
|
final int orientation;
|
||||||
|
final double lng;
|
||||||
|
final double lat;
|
||||||
|
final String city;
|
||||||
|
final String avatarThumb;
|
||||||
|
|
||||||
|
User({
|
||||||
|
required this.id,
|
||||||
|
required this.nickname,
|
||||||
|
required this.avatar,
|
||||||
|
required this.signature,
|
||||||
|
required this.birthday,
|
||||||
|
required this.age,
|
||||||
|
required this.vip,
|
||||||
|
required this.gender,
|
||||||
|
required this.role,
|
||||||
|
required this.orientation,
|
||||||
|
required this.lng,
|
||||||
|
required this.lat,
|
||||||
|
required this.city,
|
||||||
|
required this.avatarThumb,
|
||||||
|
});
|
||||||
|
|
||||||
|
factory User.fromJson(Map<String, dynamic> json) {
|
||||||
|
return User(
|
||||||
|
id: json['id'],
|
||||||
|
nickname: json['nickname'],
|
||||||
|
avatar: json['avatar'],
|
||||||
|
signature: json['signature'],
|
||||||
|
birthday: json['birthday'],
|
||||||
|
age: json['age'],
|
||||||
|
vip: json['vip'],
|
||||||
|
gender: json['gender'],
|
||||||
|
role: json['role'],
|
||||||
|
orientation: json['orientation'],
|
||||||
|
lng: json['lng'],
|
||||||
|
lat: json['lat'],
|
||||||
|
city: json['city'],
|
||||||
|
avatarThumb: json['avatar_thumb'],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class UserListItem {
|
||||||
|
final User user;
|
||||||
|
final String accountId;
|
||||||
|
|
||||||
|
UserListItem({
|
||||||
|
required this.user,
|
||||||
|
required this.accountId,
|
||||||
|
});
|
||||||
|
|
||||||
|
factory UserListItem.fromJson(Map<String, dynamic> json) {
|
||||||
|
return UserListItem(
|
||||||
|
user: User.fromJson(json['user']),
|
||||||
|
accountId: json['account_id'],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class UserList {
|
||||||
|
final List<UserListItem> lists;
|
||||||
|
|
||||||
|
UserList({
|
||||||
|
required this.lists,
|
||||||
|
});
|
||||||
|
|
||||||
|
factory UserList.fromJson(Map<String, dynamic> json) {
|
||||||
|
List<UserListItem> userItems = [];
|
||||||
|
if (json['lists'] != null) {
|
||||||
|
for (var item in json['lists']) {
|
||||||
|
userItems.add(UserListItem.fromJson(item));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return UserList(
|
||||||
|
lists: userItems,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
5
circle_app/lib/app/visitorlist/state.dart
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
class VisitorlistState {
|
||||||
|
VisitorlistState() {
|
||||||
|
///Initialize variables
|
||||||
|
}
|
||||||
|
}
|
||||||
189
circle_app/lib/app/visitorlist/view.dart
Normal file
@ -0,0 +1,189 @@
|
|||||||
|
import 'package:cached_network_image/cached_network_image.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
import 'package:pull_to_refresh/pull_to_refresh.dart';
|
||||||
|
|
||||||
|
import '../../components/my_app_bar.dart';
|
||||||
|
import '../../router/app_routers.dart';
|
||||||
|
import '../../util/util.dart';
|
||||||
|
import 'logic.dart';
|
||||||
|
|
||||||
|
class VisitorlistPage extends StatelessWidget {
|
||||||
|
VisitorlistPage({Key? key}) : super(key: key);
|
||||||
|
|
||||||
|
final logic = Get.find<VisitorlistLogic>();
|
||||||
|
final state = Get.find<VisitorlistLogic>().state;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return GetBuilder<VisitorlistLogic>(builder: (logic) {
|
||||||
|
return Container(
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
image: DecorationImage(
|
||||||
|
image: AssetImage(getBaseImage("home_back")),
|
||||||
|
fit: BoxFit.cover,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
child: Scaffold(
|
||||||
|
backgroundColor: Colors.transparent,
|
||||||
|
appBar: MyAppBar(
|
||||||
|
centerTitle:"最近访客",
|
||||||
|
),
|
||||||
|
body: SafeArea(
|
||||||
|
child: logic.isLoad ? loaddingWidget(true) : logic.lists.isEmpty ? noResultWidget() : SmartRefresher(
|
||||||
|
controller: logic.refreshController,
|
||||||
|
onRefresh: _onRefresh,
|
||||||
|
onLoading: _onLoading,
|
||||||
|
child: ListView.builder(
|
||||||
|
padding: EdgeInsets.all(10.sp),
|
||||||
|
itemCount: logic.lists.length,
|
||||||
|
itemBuilder: (context, index) {
|
||||||
|
return ListItem(logic.lists[index],index);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget ListItem(UserListItem item,int index) {
|
||||||
|
return GestureDetector(
|
||||||
|
onTap: (){
|
||||||
|
Get.toNamed(AppRoutes.UserInfoActivity, arguments: item.user.id.toString());
|
||||||
|
},
|
||||||
|
child: Container(
|
||||||
|
margin: EdgeInsets.only(bottom: 21),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Stack(children: [
|
||||||
|
ClipOval(
|
||||||
|
child: GestureDetector(
|
||||||
|
onTap: () {
|
||||||
|
var imgList = <String>[];
|
||||||
|
imgList.add(item.user.avatar);
|
||||||
|
Get.toNamed(AppRoutes.Swiper, arguments: {
|
||||||
|
'imaglist': imgList,
|
||||||
|
'index': 0
|
||||||
|
});
|
||||||
|
},
|
||||||
|
child: CachedNetworkImage(
|
||||||
|
fit: BoxFit.cover,
|
||||||
|
imageUrl: item.user.avatar,
|
||||||
|
width: 53.sp,
|
||||||
|
height: 53.sp,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Positioned(
|
||||||
|
right: 0,
|
||||||
|
left: 0,
|
||||||
|
bottom: 0,
|
||||||
|
|
||||||
|
child: item.user.vip!=0 ?
|
||||||
|
Image(
|
||||||
|
image: AssetImage(getBaseImage("vip")),
|
||||||
|
width: 44.sp,
|
||||||
|
height: 18.sp,
|
||||||
|
):Container(),)
|
||||||
|
],),
|
||||||
|
SizedBox(width: 10.sp),
|
||||||
|
Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
item.user.nickname,
|
||||||
|
style: const TextStyle(color :Colors.white70,fontSize: 14, fontWeight: FontWeight.bold),
|
||||||
|
),
|
||||||
|
SizedBox(width: 4.sp),
|
||||||
|
// SizedBox(height: 8.sp),
|
||||||
|
_buildInfoRow(item),
|
||||||
|
// Placeholder image
|
||||||
|
],
|
||||||
|
),
|
||||||
|
|
||||||
|
SizedBox(height: 8.sp),
|
||||||
|
Container(
|
||||||
|
width: 150.sp,
|
||||||
|
child: Text(
|
||||||
|
item.user.signature,
|
||||||
|
style: TextStyle(fontSize: 12.sp, color: Color(0xFFB7BECC)),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
// Pla
|
||||||
|
Spacer(),
|
||||||
|
GestureDetector(onTap: (){
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
},
|
||||||
|
child: Container(
|
||||||
|
width: 60,
|
||||||
|
height: 28,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Color(0xFFFF4D7C),
|
||||||
|
borderRadius: BorderRadius.circular(14),
|
||||||
|
),
|
||||||
|
child: Center(
|
||||||
|
child: Text("私聊", style: TextStyle(fontSize: 14, color: Colors.white)),
|
||||||
|
)
|
||||||
|
|
||||||
|
,
|
||||||
|
),),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Widget _buildInfoRow(UserListItem userInfoBean) {
|
||||||
|
String ageMsg = getAgeCOntent(userInfoBean.user.gender, userInfoBean.user.age,
|
||||||
|
userInfoBean.user.role, userInfoBean.user.orientation);
|
||||||
|
return Row(
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.circular(17),
|
||||||
|
gradient: LinearGradient(
|
||||||
|
colors: [
|
||||||
|
Color.fromRGBO(141, 255, 248, 1.0),
|
||||||
|
Color.fromRGBO(181, 211, 255, 1.0),
|
||||||
|
],
|
||||||
|
begin: Alignment.centerLeft,
|
||||||
|
end: Alignment.centerRight,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
padding: EdgeInsets.only(
|
||||||
|
top: 2.sp, bottom: 2.sp, left: 10.sp, right: 10.sp),
|
||||||
|
child: Text(
|
||||||
|
ageMsg ,
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.black,
|
||||||
|
fontSize: 10,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(width: 6.sp),
|
||||||
|
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void _onRefresh() async {
|
||||||
|
logic.page = 1;
|
||||||
|
logic.initList();
|
||||||
|
}
|
||||||
|
|
||||||
|
void _onLoading() async {
|
||||||
|
logic.page = logic.page + 1;
|
||||||
|
logic.initList();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -18,6 +18,8 @@ import 'package:circle_app/app/help/binding.dart';
|
|||||||
import 'package:circle_app/app/help/view.dart';
|
import 'package:circle_app/app/help/view.dart';
|
||||||
import 'package:circle_app/app/home/binding.dart';
|
import 'package:circle_app/app/home/binding.dart';
|
||||||
import 'package:circle_app/app/home/view.dart';
|
import 'package:circle_app/app/home/view.dart';
|
||||||
|
import 'package:circle_app/app/likelist/binding.dart';
|
||||||
|
import 'package:circle_app/app/likelist/view.dart';
|
||||||
import 'package:circle_app/app/login/login/view.dart';
|
import 'package:circle_app/app/login/login/view.dart';
|
||||||
import 'package:circle_app/app/minefragment/binding.dart';
|
import 'package:circle_app/app/minefragment/binding.dart';
|
||||||
import 'package:circle_app/app/minefragment/view.dart';
|
import 'package:circle_app/app/minefragment/view.dart';
|
||||||
@ -46,6 +48,7 @@ import 'package:circle_app/app/text/binding.dart';
|
|||||||
import 'package:circle_app/app/text/view.dart';
|
import 'package:circle_app/app/text/view.dart';
|
||||||
import 'package:circle_app/app/userinfo/binding.dart';
|
import 'package:circle_app/app/userinfo/binding.dart';
|
||||||
import 'package:circle_app/app/userinfo/view.dart';
|
import 'package:circle_app/app/userinfo/view.dart';
|
||||||
|
import 'package:circle_app/app/visitorlist/view.dart';
|
||||||
import 'package:circle_app/app/webview/binding.dart';
|
import 'package:circle_app/app/webview/binding.dart';
|
||||||
import 'package:circle_app/app/webview/view.dart';
|
import 'package:circle_app/app/webview/view.dart';
|
||||||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||||
@ -54,6 +57,7 @@ import 'package:get/get_navigation/src/routes/get_route.dart';
|
|||||||
import '../app/blacklist/view.dart';
|
import '../app/blacklist/view.dart';
|
||||||
import '../app/circle/binding.dart';
|
import '../app/circle/binding.dart';
|
||||||
import '../app/splash/view.dart';
|
import '../app/splash/view.dart';
|
||||||
|
import '../app/visitorlist/binding.dart';
|
||||||
import 'app_routers.dart';
|
import 'app_routers.dart';
|
||||||
|
|
||||||
class AppPages {
|
class AppPages {
|
||||||
@ -179,5 +183,15 @@ class AppPages {
|
|||||||
page: () => MyfeedbacklistPage(),
|
page: () => MyfeedbacklistPage(),
|
||||||
binding: MyfeedbacklistBinding(),
|
binding: MyfeedbacklistBinding(),
|
||||||
),
|
),
|
||||||
|
GetPage(
|
||||||
|
name: AppRoutes.LikeListActivity,
|
||||||
|
page: () => LikelistPage(),
|
||||||
|
binding: LikelistBinding(),
|
||||||
|
),
|
||||||
|
GetPage(
|
||||||
|
name: AppRoutes.VisitorListActivity,
|
||||||
|
page: () => VisitorlistPage(),
|
||||||
|
binding: VisitorlistBinding(),
|
||||||
|
),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,6 +11,8 @@ abstract class AppRoutes {
|
|||||||
static const BlackActivity = '/user/BlackActivity';
|
static const BlackActivity = '/user/BlackActivity';
|
||||||
static const HelpActivity = '/user/HelpActivity';
|
static const HelpActivity = '/user/HelpActivity';
|
||||||
static const FriendsActivity = '/user/FriendsActivity';
|
static const FriendsActivity = '/user/FriendsActivity';
|
||||||
|
static const LikeListActivity = '/user/LikeListActivity';
|
||||||
|
static const VisitorListActivity = '/user/VisitorListActivity';
|
||||||
static const UserInfoActivity = '/user/UserInfoActivity';
|
static const UserInfoActivity = '/user/UserInfoActivity';
|
||||||
static const ReportActivity = '/user/ReportActivity';
|
static const ReportActivity = '/user/ReportActivity';
|
||||||
static const FeedbackActivity = '/user/FeedbackActivity';
|
static const FeedbackActivity = '/user/FeedbackActivity';
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
import 'package:circle_app/util/util.dart';
|
import 'package:circle_app/util/util.dart';
|
||||||
|
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:path_provider/path_provider.dart';
|
import 'package:path_provider/path_provider.dart';
|
||||||
|
|
||||||
@ -84,11 +85,13 @@ class CacheUtil {
|
|||||||
// Get.back();
|
// Get.back();
|
||||||
} else if (value >= 0) {
|
} else if (value >= 0) {
|
||||||
// Get.back();
|
// Get.back();
|
||||||
showToast("正在清理中···");
|
//showToast("正在清理中···");
|
||||||
|
SmartDialog.showLoading(msg: "正在清理中···");
|
||||||
Future.delayed(Duration(seconds: 2), () async {
|
Future.delayed(Duration(seconds: 2), () async {
|
||||||
//删除缓存目录
|
//删除缓存目录
|
||||||
await delDir(_tempDir);
|
await delDir(_tempDir);
|
||||||
await loadCache();
|
await loadCache();
|
||||||
|
SmartDialog.dismiss();
|
||||||
showToast("清理缓存成功");
|
showToast("清理缓存成功");
|
||||||
callback("0KB");
|
callback("0KB");
|
||||||
});
|
});
|
||||||
@ -96,6 +99,7 @@ class CacheUtil {
|
|||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
print(e);
|
print(e);
|
||||||
|
SmartDialog.dismiss();
|
||||||
showToast("清除缓存失败");
|
showToast("清除缓存失败");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -258,3 +258,6 @@ navigateToUserAgreement(){
|
|||||||
navigateToPrivacyPolicy(){
|
navigateToPrivacyPolicy(){
|
||||||
Get.toNamed(AppRoutes.WebViewActivity,arguments: {'title':"隐私协议","url":"https://docs.qq.com/doc/DZXhvcXV6b1RNTUx1"});
|
Get.toNamed(AppRoutes.WebViewActivity,arguments: {'title':"隐私协议","url":"https://docs.qq.com/doc/DZXhvcXV6b1RNTUx1"});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//发布内容规范
|
||||||
|
//合伙人协议
|
||||||
@ -7,7 +7,7 @@ project(runner LANGUAGES CXX)
|
|||||||
set(BINARY_NAME "circle_app")
|
set(BINARY_NAME "circle_app")
|
||||||
# The unique GTK application identifier for this application. See:
|
# The unique GTK application identifier for this application. See:
|
||||||
# https://wiki.gnome.org/HowDoI/ChooseApplicationID
|
# https://wiki.gnome.org/HowDoI/ChooseApplicationID
|
||||||
set(APPLICATION_ID "com.example.circle_app")
|
set(APPLICATION_ID "com.leyuan.app")
|
||||||
|
|
||||||
# Explicitly opt in to modern CMake behaviors to avoid warnings with recent
|
# Explicitly opt in to modern CMake behaviors to avoid warnings with recent
|
||||||
# versions of CMake.
|
# versions of CMake.
|
||||||
|
|||||||