import 'dart:async';
|
import 'dart:io';
|
import 'dart:ui';
|
|
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/material.dart';
|
import 'package:flutter/rendering.dart';
|
import 'package:flutter_baidu_mapapi_base/flutter_baidu_mapapi_base.dart';
|
import 'package:flutter_baidu_mapapi_map/flutter_baidu_mapapi_map.dart';
|
import 'package:locations/api/http.dart';
|
import 'package:locations/model/map/location_model.dart';
|
import 'package:locations/model/map/location_user_model.dart';
|
import 'package:locations/model/user/user_info.dart';
|
import 'package:locations/ui/map/location_search.dart';
|
import 'package:locations/ui/mine/add_location_person.dart';
|
import 'package:locations/ui/mine/login.dart';
|
import 'package:locations/ui/widget/button.dart';
|
import 'package:locations/ui/widget/capture.dart';
|
import 'package:locations/ui/widget/dialog.dart';
|
import 'package:locations/ui/widget/map_marker.dart';
|
import 'package:locations/utils/event_bus_util.dart';
|
import 'package:locations/utils/global.dart';
|
import 'package:locations/utils/location_util.dart';
|
import 'package:locations/utils/map_util.dart';
|
import 'package:locations/utils/pageutils.dart';
|
import 'package:locations/utils/string_util.dart';
|
import 'package:locations/utils/ui_constant.dart';
|
import 'package:locations/utils/ui_utils.dart';
|
import 'package:locations/utils/user_util.dart';
|
import 'package:path_provider/path_provider.dart';
|
|
typedef OnPositionHiidenChange = void Function(bool hidden);
|
|
BMFMapController? _mapController;
|
|
class LocationPage extends StatefulWidget {
|
LocationPage({Key? key, required this.title}) : super(key: key);
|
|
// This widget is the home page of your application. It is stateful, meaning
|
// that it has a State object (defined below) that contains fields that affect
|
// how it looks.
|
|
// This class is the configuration for the state. It holds the values (in this
|
// case the title) provided by the parent (in this case the App widget) and
|
// used by the build method of the State. Fields in a Widget subclass are
|
// always marked "final".
|
|
final String title;
|
|
@override
|
_LocationPageState createState() => _LocationPageState();
|
}
|
|
class _LocationPageState extends State<LocationPage>
|
with AutomaticKeepAliveClientMixin {
|
GlobalKey rootWidgetKey = GlobalKey();
|
CaptureController _captureController = CaptureController();
|
|
//用户marker
|
BMFMarker? userMarker;
|
String? portrait;
|
BaiduLocation? location;
|
|
BMFMapOptions mapOptions = BMFMapOptions(
|
showMapScaleBar: false,
|
mapType: BMFMapType.Standard,
|
center: Global.currentPosition != null
|
? Global.currentPosition
|
: BMFCoordinate(39.917215, 116.380341),
|
mapScaleBarPosition: BMFPoint(0, 200),
|
zoomLevel: 12,
|
mapPadding: BMFEdgeInsets(left: 30, top: 0, right: 30, bottom: 200));
|
|
var eventBusLocation;
|
|
@override
|
void initState() {
|
super.initState();
|
eventBusLocation = eventBus.on<UserLocationInfoEventBus>().listen((event) {
|
//设置用户头像
|
setState(() {
|
portrait = (event.user == null ||
|
StringUtil.isNullOrEmpty(event.user!.portrait)
|
? null
|
: event.user!.portrait);
|
});
|
location = event.location;
|
drawMarker(
|
BMFCoordinate(event.location!.latitude!, event.location!.longitude!));
|
});
|
_getLocationInvite();
|
}
|
|
void _getLocationInvite() async {
|
var uid = await UserUtil.getUid();
|
if (uid == null) {
|
return;
|
}
|
Map<String, dynamic>? result =
|
await LocationApiUtil.getInviteLocation(uid!);
|
if (result!["code"] == 0) {
|
LocationUserModel model = LocationUserModel.fromJson(result["data"]);
|
showGeneralDialog(
|
context: context,
|
pageBuilder: (BuildContext buildContext, Animation<double> animation,
|
Animation<double> secondaryAnimation) {
|
return RequireLocationDialog(model.targetPhone!, () {
|
LocationApiUtil.rejectInviteLocation(uid, model.id!)
|
.then((value) {
|
if (value!["code"] == 0) {
|
Navigator.of(context).pop();
|
} else {
|
ToastUtil.toast(value!["msg"]);
|
}
|
});
|
}, () {
|
LocationApiUtil.agreeInviteLocation(uid, model.id!).then((value) {
|
if (value!["code"] == 0) {
|
Navigator.of(context).pop();
|
} else {
|
ToastUtil.toast(value!["msg"]);
|
}
|
});
|
});
|
});
|
}
|
}
|
|
|
|
@override
|
void dispose() {
|
super.dispose();
|
(eventBusLocation as StreamSubscription).cancel();
|
}
|
|
@override
|
Widget build(BuildContext context) {
|
return Scaffold(
|
resizeToAvoidBottomInset: false,
|
backgroundColor: Colors.white,
|
body: Stack(
|
children: [
|
getMapView(),
|
PositionInfoPage(),
|
Positioned(
|
top: -100,
|
child: RepaintBoundary(
|
key: rootWidgetKey,
|
child: Image.asset(
|
"assets/images/mine/icon_mine_default_portrait.png",
|
height: 33,
|
width: 33,
|
))),
|
Align(
|
alignment: Alignment.bottomCenter,
|
child: getAddLocationObjectView()),
|
|
//地图marker截图组件
|
Positioned(
|
top: -100,
|
child: CaptureWidget(
|
widget: PersonLocationMarker(portrait == null
|
? Image.asset(
|
"assets/images/mine/icon_mine_default_portrait.png",
|
)
|
: Image.network(portrait!)),
|
captureController: _captureController,
|
))
|
],
|
));
|
}
|
|
//控件阴影
|
List<BoxShadow> getViewShadow() {
|
return [
|
BoxShadow(
|
blurRadius: 6.5,
|
spreadRadius: 1,
|
color: Color(0x4D0E96FF),
|
)
|
];
|
}
|
|
//获取地图视图
|
Widget getMapView() {
|
return Container(
|
child: BMFMapWidget(
|
onBMFMapCreated: (controller) {
|
_mapController = controller;
|
if (location != null) {
|
drawMarker(
|
BMFCoordinate(location!.latitude!, location!.longitude!));
|
}
|
},
|
mapOptions: mapOptions,
|
),
|
);
|
}
|
|
//画marker
|
void drawMarker(BMFCoordinate location) async {
|
if (_mapController == null) {
|
return;
|
}
|
Directory? tempDir = await getExternalStorageDirectory();
|
String tempPath = tempDir!.path;
|
File? file =
|
await _captureController.capturePng("$tempPath/location_person.png");
|
if (userMarker == null) {
|
userMarker =
|
await MapUtil.addMarker(_mapController, location, file!.path);
|
} else {
|
userMarker!.updateIcon(file!.path);
|
userMarker!.updatePosition(location);
|
}
|
_mapController!.setCenterCoordinate(location, true);
|
}
|
|
//添加想定位的人
|
Widget getAddLocationObjectView() {
|
return InkWell(
|
onTap: () {
|
UserUtil.isLogin().then((value) {
|
if (!value) {
|
NavigatorUtil.navigateToNextPage(
|
context, LoginPage(title: ""), (data) {});
|
return;
|
}
|
NavigatorUtil.navigateToNextPage(
|
context, AddLocationPersonPage(title: ""), (data) {});
|
});
|
},
|
child: Container(
|
alignment: Alignment.topCenter,
|
height: 72,
|
margin: const EdgeInsets.fromLTRB(10, 0, 10, 0),
|
padding: const EdgeInsets.fromLTRB(0, 18, 0, 0),
|
decoration: BoxDecoration(
|
color: Colors.white,
|
borderRadius: BorderRadius.only(
|
topLeft: Radius.circular(10), topRight: Radius.circular(10)),
|
boxShadow: getViewShadow()),
|
child: Flex(
|
direction: Axis.horizontal,
|
mainAxisAlignment: MainAxisAlignment.center,
|
crossAxisAlignment: CrossAxisAlignment.center,
|
children: [
|
Image.asset(
|
"assets/images/common/icon_person.png",
|
height: 17,
|
),
|
Container(
|
width: 11,
|
height: 1,
|
),
|
const Text(
|
"添加想定位的对象",
|
style: TextStyle(color: ColorConstant.theme, fontSize: 15),
|
)
|
],
|
),
|
));
|
}
|
|
@override
|
bool get wantKeepAlive => true;
|
}
|
|
//控件阴影
|
List<BoxShadow> getViewShadow() {
|
return [
|
BoxShadow(
|
blurRadius: 6.5,
|
spreadRadius: 1,
|
color: Color(0x4D0E96FF),
|
)
|
];
|
}
|
|
/*****************定位信息****************/
|
|
class PositionInfoPage extends StatefulWidget {
|
PositionInfoPage({Key? key}) : super(key: key);
|
|
@override
|
_PositionInfoPageState createState() => _PositionInfoPageState();
|
}
|
|
class _PositionInfoPageState extends State<PositionInfoPage>
|
with SingleTickerProviderStateMixin {
|
//位置信息是否隐藏
|
bool locationInfoHidden = true;
|
|
UserInfo? user;
|
|
BaiduLocation? _location;
|
|
GlobalKey rootWidgetKey = GlobalKey();
|
|
var eventBusLogin;
|
|
List<LocationUserModel>? userList;
|
|
@override
|
void initState() {
|
super.initState();
|
UserUtil.getUserInfo().then((value) {
|
setState(() {
|
user = value;
|
});
|
//开始定位
|
LocationUtil.startLocation(0, (state, map) {
|
if (state == LocationState.success) {
|
BaiduLocation location = BaiduLocation.fromJson(map);
|
setState(() {
|
_location = location;
|
});
|
eventBus.fire(UserLocationInfoEventBus(_location, user));
|
}
|
});
|
});
|
//注册eventbus
|
eventBusLogin = eventBus.on<LoginEventBus>().listen((event) {
|
if (event.isLogin) {
|
UserUtil.getUserInfo().then((value) {
|
setState(() {
|
user = value;
|
});
|
});
|
} else {
|
setState(() {
|
user = null;
|
});
|
}
|
});
|
}
|
|
@override
|
void dispose() {
|
super.dispose();
|
//取消订阅
|
eventBusLogin.cancel();
|
}
|
|
|
|
void _selectLocationUser() async {
|
await _getLocationUsers();
|
|
if (userList == null || userList!.isEmpty) {
|
ToastUtil.toast("请先添加定位对象");
|
return;
|
}
|
|
var selectUserType = await showGeneralDialog(
|
context: context,
|
pageBuilder: (BuildContext buildContext, Animation<double> animation,
|
Animation<double> secondaryAnimation) =>
|
ListViewDialog(
|
ListView.builder(
|
padding: EdgeInsets.zero,
|
itemCount: userList!.length,
|
itemBuilder: (BuildContext context, int index) {
|
return _getUserItem(userList![index], index);
|
}),
|
() {
|
Navigator.of(context).pop();
|
},
|
));
|
}
|
|
Future _getLocationUsers() async {
|
var uid = await UserUtil.getUid();
|
if (uid == null) return;
|
Map<String, dynamic>? result =
|
await LocationApiUtil.getLocationUsers(uid, 1);
|
|
if (result!["code"] == 0) {
|
List<dynamic> list = result!["data"]["list"];
|
List<LocationUserModel> users = [];
|
list.forEach((element) {
|
users.add(LocationUserModel.fromJson(element));
|
});
|
userList = users;
|
} else {
|
ToastUtil.toast(result!["msg"]);
|
}
|
}
|
|
@override
|
Widget build(BuildContext context) {
|
return Container(
|
padding: const EdgeInsets.fromLTRB(10, 35, 10, 0),
|
child: Flex(direction: Axis.vertical, children: [
|
//----------搜索框--------
|
Flex(
|
direction: Axis.horizontal,
|
children: [
|
Expanded(
|
child: InkWell(
|
onTap: () {
|
NavigatorUtil.navigateToNextPage(
|
context, LocationSearchPage(), (data) {});
|
},
|
child: Container(
|
alignment: Alignment.center,
|
padding: EdgeInsets.fromLTRB(13, 0, 13, 0),
|
height: 45,
|
decoration: BoxDecoration(
|
color: Colors.white,
|
borderRadius: BorderRadius.circular(10),
|
boxShadow: getViewShadow()),
|
child: Flex(
|
direction: Axis.horizontal,
|
children: [
|
Image.asset(
|
"assets/images/main/icon_location_search.png",
|
height: 19,
|
),
|
Container(
|
width: 10,
|
),
|
const Expanded(
|
child: Text("地图上找位置",
|
style: TextStyle(
|
fontSize: 14,
|
color: Color(0xFFC4CDD1))))
|
],
|
),
|
))),
|
InkWell(
|
onTap: () {
|
print("sos");
|
},
|
child: Container(
|
width: 45,
|
height: 45,
|
margin: const EdgeInsets.only(left: 8.5),
|
decoration: BoxDecoration(
|
color: Colors.white,
|
boxShadow: getViewShadow(),
|
borderRadius: BorderRadius.circular(23)),
|
alignment: Alignment.center,
|
child: Image.asset(
|
"assets/images/main/icon_location_sos.png",
|
height: 35,
|
),
|
))
|
],
|
),
|
//---------个人信息与定位信息---
|
Container(
|
height: 400,
|
child: Stack(
|
children: [
|
//位置信息
|
_location == null
|
? Container()
|
: getPositionInfoView(context),
|
//个人信息
|
Container(
|
height: 100,
|
margin: EdgeInsets.only(top: 10),
|
padding: EdgeInsets.only(left: 15, top: 8, right: 15),
|
decoration: BoxDecoration(
|
borderRadius: BorderRadius.only(
|
bottomLeft:
|
Radius.circular(locationInfoHidden ? 10 : 0),
|
bottomRight:
|
Radius.circular(locationInfoHidden ? 10 : 0),
|
topLeft: Radius.circular(10),
|
topRight: Radius.circular(10)),
|
color: Colors.white,
|
boxShadow: getViewShadow()),
|
child: Stack(
|
alignment: Alignment.topCenter,
|
children: [
|
user == null
|
? Container()
|
: InkWell(
|
onTap: () {
|
_selectLocationUser();
|
},
|
child: Flex(
|
mainAxisAlignment: MainAxisAlignment.center,
|
direction: Axis.horizontal,
|
children: [
|
Image.asset(
|
"assets/images/main/icon_location_change_person.png",
|
width: 13,
|
),
|
Text(
|
" 切换实时定位人",
|
style: TextStyle(
|
color: ColorConstant.theme,
|
fontSize: 15),
|
)
|
],
|
)),
|
//个人信息
|
Flex(
|
direction: Axis.horizontal,
|
crossAxisAlignment: CrossAxisAlignment.center,
|
children: [
|
user == null
|
? Image(
|
image: AssetImage(
|
"assets/images/mine/icon_mine_default_portrait.png"),
|
height: 33,
|
width: 33,
|
)
|
: Image.network(
|
user!.portrait!,
|
width: 33,
|
height: 33,
|
),
|
Container(
|
width: 5,
|
),
|
Expanded(
|
child: Flex(
|
direction: Axis.vertical,
|
mainAxisAlignment: MainAxisAlignment.center,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
children: user == null
|
? [
|
Container(
|
width: 60,
|
child: MyOutlineButton(
|
"去登录",
|
5,
|
onClick: () {
|
NavigatorUtil.navigateToNextPage(
|
context, LoginPage(title: ""),
|
(data) {
|
UserUtil.getUserInfo()
|
.then((value) {
|
setState(() {
|
user = value;
|
});
|
});
|
});
|
},
|
))
|
]
|
: [
|
Text(
|
user!.nickName!,
|
softWrap: false,
|
overflow: TextOverflow.ellipsis,
|
style: TextStyle(
|
color: Color(0xFFA0A0A0),
|
fontSize: 18),
|
),
|
Container(
|
height: 2,
|
),
|
Text(
|
"ID:${user!.id!}",
|
style: TextStyle(
|
color: Color(0xFFA0A0A0),
|
fontSize: 12),
|
)
|
],
|
)),
|
Container(
|
width: 5,
|
),
|
Flex(
|
direction: Axis.vertical,
|
mainAxisAlignment: MainAxisAlignment.center,
|
children: user == null
|
? []
|
: [
|
MyOutlineButton(
|
"生成轨迹",
|
13,
|
height: 26,
|
width: 82,
|
fontSize: 12,
|
onClick: () {
|
print("生成轨迹");
|
},
|
),
|
Container(
|
height: 6,
|
),
|
MyOutlineButton(
|
"实时共享",
|
13,
|
height: 26,
|
width: 82,
|
fontSize: 12,
|
onClick: () {
|
print("实时共享");
|
},
|
),
|
])
|
],
|
)
|
],
|
),
|
),
|
|
//更多
|
_location == null
|
? Container()
|
: Positioned(
|
left: MediaQuery.of(context).size.width / 2 -
|
10 -
|
70 / 2,
|
top: 80,
|
child: InkWell(
|
onTap: () {
|
setState(() {
|
locationInfoHidden = !locationInfoHidden;
|
});
|
},
|
child: Container(
|
width: 70,
|
height: 40,
|
child: Stack(
|
alignment: Alignment.bottomCenter,
|
children: [
|
Container(
|
height: 30,
|
width: 60,
|
margin: EdgeInsets.only(top: 0),
|
alignment: Alignment.center,
|
decoration: BoxDecoration(
|
color: Colors.white,
|
borderRadius:
|
BorderRadius.circular(15),
|
boxShadow: getViewShadow()),
|
),
|
Positioned(
|
top: 0,
|
child: Container(
|
height: 25,
|
width: 70,
|
alignment: Alignment.bottomCenter,
|
|
decoration: BoxDecoration(
|
color: Colors.white,
|
),
|
// child: Text(
|
// "收起",
|
// style: TextStyle(
|
// color: ColorConstant.theme,
|
// fontSize: 11),
|
// )
|
)),
|
Positioned(
|
bottom: 5,
|
child: Text(
|
locationInfoHidden ? "展开" : "收起",
|
style: TextStyle(
|
color: ColorConstant.theme,
|
fontSize: 11),
|
)),
|
]))))
|
],
|
)),
|
]));
|
}
|
|
Widget _getStatus(LocationInviteStatus? status, LocationUserModel user) {
|
switch (status) {
|
case LocationInviteStatus.sentInvite:
|
return const Text(
|
"等待同意",
|
style: TextStyle(color: ColorConstant.theme, fontSize: 15),
|
);
|
|
case LocationInviteStatus.agree:
|
return InkWell(
|
onTap: () {
|
Navigator.pop(context, user);
|
},
|
child: Container(
|
padding: const EdgeInsets.only(left: 10, right: 10),
|
height: 25,
|
decoration: BoxDecoration(
|
color: Colors.white,
|
border: Border.all(color: ColorConstant.theme),
|
borderRadius: BorderRadius.circular(10)),
|
child: Row(
|
mainAxisAlignment: MainAxisAlignment.center,
|
crossAxisAlignment: CrossAxisAlignment.center,
|
children: [
|
Image.asset(
|
"assets/images/user/icon_user_location.png",
|
height: 15,
|
),
|
Container(
|
width: 5,
|
),
|
const Text(
|
"去定位",
|
style: TextStyle(color: ColorConstant.theme, fontSize: 15),
|
)
|
],
|
),
|
));
|
case LocationInviteStatus.reject:
|
return const Text(
|
"对方拒接",
|
style: TextStyle(color: Color(0xFF9DAAB3), fontSize: 15),
|
);
|
}
|
|
return Container();
|
}
|
|
Image _getPortrait(LocationUserType? type) {
|
String img = "assets/images/user/";
|
switch (type) {
|
case LocationUserType.father:
|
img += "icon_user_type_father.png";
|
break;
|
case LocationUserType.mother:
|
img += "icon_user_type_mother.png";
|
break;
|
case LocationUserType.husband:
|
img += "icon_user_type_husband.png";
|
break;
|
case LocationUserType.wife:
|
img += "icon_user_type_wife.png";
|
break;
|
case LocationUserType.daughter:
|
img += "icon_user_type_daughter.png";
|
break;
|
case LocationUserType.son:
|
img += "icon_user_type_son.png";
|
break;
|
case LocationUserType.other:
|
img += "icon_user_type_other.png";
|
}
|
|
return Image.asset(
|
img,
|
height: 31,
|
);
|
}
|
|
Widget _getUserItem(LocationUserModel user, int index) {
|
return Column(children: [
|
Container(
|
padding: const EdgeInsets.fromLTRB(27, 0, 27, 0),
|
height: 80,
|
decoration: BoxDecoration(
|
color: Colors.white,
|
borderRadius: index == 0
|
? const BorderRadius.only(
|
topLeft: Radius.circular(10),
|
topRight: Radius.circular(10))
|
: BorderRadius.zero),
|
child: Row(
|
children: [
|
Container(
|
width: 40,
|
alignment: Alignment.center,
|
child: _getPortrait(user.userType),
|
),
|
Container(
|
width: 8,
|
),
|
Expanded(
|
child: Column(
|
mainAxisAlignment: MainAxisAlignment.center,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
children: [
|
Text(
|
user.targetName!,
|
style: const TextStyle(
|
fontSize: 18, color: ColorConstant.theme),
|
),
|
Container(
|
height: 5,
|
),
|
Text(
|
user.targetPhone!,
|
style:
|
const TextStyle(fontSize: 15, color: Color(0xFF9DAAB3)),
|
),
|
],
|
)),
|
_getStatus(user.status, user)
|
],
|
)),
|
Container(
|
height: 1,
|
color: Colors.white,
|
padding: const EdgeInsets.only(left: 27, right: 27),
|
child: Container(
|
color: const Color(0xFF9DAAB3),
|
),
|
)
|
]);
|
}
|
|
Widget getPositionInfoView(BuildContext context) {
|
if (!locationInfoHidden) {
|
return Positioned(
|
top: 110,
|
child: ClipRRect(
|
borderRadius: const BorderRadius.only(
|
bottomLeft: Radius.circular(10),
|
bottomRight: Radius.circular(10)),
|
child: BackdropFilter(
|
filter: ImageFilter.blur(sigmaX: 10, sigmaY: 10),
|
child: Container(
|
padding: const EdgeInsets.all(18),
|
height: 120,
|
width: MediaQuery.of(context).size.width - 10 * 2,
|
color: Colors.white.withAlpha(180),
|
child: Flex(
|
mainAxisAlignment: MainAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.center,
|
direction: Axis.vertical,
|
children: [
|
Container(
|
padding: const EdgeInsets.fromLTRB(12, 5, 12, 5),
|
decoration: BoxDecoration(
|
color: const Color(0xFFCACDD3),
|
borderRadius: BorderRadius.circular(20)),
|
child: Text(
|
_location!.locTime!,
|
style: const TextStyle(
|
color: Colors.white, fontSize: 10),
|
),
|
),
|
Container(
|
height: 2,
|
),
|
Flex(
|
direction: Axis.horizontal,
|
children: [
|
Image.asset(
|
"assets/images/main/icon_location_position_name.png",
|
height: 16,
|
),
|
const Text(
|
" 当前位置:",
|
style: TextStyle(
|
color: Color(0xFF999999), fontSize: 12),
|
),
|
Expanded(
|
child: Text(
|
_location!.address!,
|
softWrap: false,
|
overflow: TextOverflow.ellipsis,
|
style: TextStyle(
|
color: Color(0xFFBABABA), fontSize: 12),
|
))
|
],
|
),
|
Container(
|
height: 4,
|
),
|
Container(
|
child: Flex(
|
direction: Axis.horizontal,
|
children: [
|
Image.asset(
|
"assets/images/main/icon_location_position_location.png",
|
height: 15,
|
),
|
const Text(
|
" 经 纬 度:",
|
style: TextStyle(
|
color: Color(0xFF999999), fontSize: 12),
|
),
|
Expanded(
|
child: Text(
|
"N ${_location!.latitude!},W ${_location!.longitude!}",
|
softWrap: false,
|
overflow: TextOverflow.ellipsis,
|
style: const TextStyle(
|
color: Color(0xFFBABABA), fontSize: 12),
|
))
|
],
|
)),
|
Container(
|
height: 5,
|
),
|
Flex(
|
direction: Axis.horizontal,
|
mainAxisAlignment: MainAxisAlignment.center,
|
crossAxisAlignment: CrossAxisAlignment.center,
|
children: [
|
Text(
|
"查看全部共100次定位 ",
|
style: TextStyle(
|
color: Color(0xFF9DAAB3), fontSize: 10),
|
),
|
Image.asset(
|
"assets/images/main/icon_location_position_more.png",
|
height: 10,
|
),
|
],
|
),
|
],
|
),
|
))));
|
} else {
|
return Container();
|
}
|
}
|
}
|