request_permission on location

location
Elham Rababah 5 years ago
parent c7c51ff55a
commit fcfb19963c

@ -5,6 +5,8 @@
In most cases you can leave this as-is, but you if you want to provide
additional functionality it is fine to subclass or reimplement
FlutterApplication and put your custom class here. -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<application
android:name="io.flutter.app.FlutterApplication"
android:label="driver App"

@ -1,14 +1,14 @@
import 'package:driverapp/config/config.dart';
import 'package:driverapp/core/model/orders/deliverd_order_req_model.dart';
import 'package:driverapp/core/model/orders/deliverd_order_res_model.dart';
import 'package:driverapp/core/model/orders/next_order_request_model.dart';
import 'package:driverapp/core/model/orders/pending_orders_req_model.dart';
import 'package:driverapp/core/model/orders/pending_orders_res_model.dart';
import 'package:driverapp/core/model/orders/update_order_status_request_model.dart';
import 'package:driverapp/core/model/scan_qr/scan_qr_request_model.dart';
import 'package:driverapp/core/service/base_service.dart';
import 'package:driverapp/core/model/orders/deliverd_order_req_model.dart';
import 'package:driverapp/uitl/utils.dart';
import 'package:location/location.dart';
import 'package:driverapp/core/model/orders/deliverd_order_res_model.dart';
class OrdersService extends BaseService {
List<PendingOrdersRes> _orders = List();
@ -30,32 +30,37 @@ class OrdersService extends BaseService {
);
Future getPendingOrders() async {
// if (await Utils.isLocationPermissionGranted()) {
LocationData loc = await Utils.getLocation();
PendingOrders _requestGetPendingOrders = PendingOrders(
searchKey: "",
pageSize: 0,
pageIndex: 0,
latitude: loc.latitude.toString(),
longitude: loc.longitude.toString(),
);
hasError = false;
try {
await baseAppClient.post(GET_ALL_ORDERS,
onSuccess: (dynamic response, int statusCode) {
_orders.clear();
response['PatientER_Delivery_GetAllOrderList'].forEach((order) {
_orders.add(PendingOrdersRes.fromJson(order));
});
}, onFailure: (String error, int statusCode) {
if (loc != null) {
PendingOrders _requestGetPendingOrders = PendingOrders(
searchKey: "",
pageSize: 0,
pageIndex: 0,
latitude: loc.latitude.toString(),
longitude: loc.longitude.toString(),
);
hasError = false;
try {
await baseAppClient.post(GET_ALL_ORDERS,
onSuccess: (dynamic response, int statusCode) {
_orders.clear();
response['PatientER_Delivery_GetAllOrderList'].forEach((order) {
_orders.add(PendingOrdersRes.fromJson(order));
});
}, onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
}, body: _requestGetPendingOrders.toJson());
} catch (e) {
hasError = true;
super.error = error;
}, body: _requestGetPendingOrders.toJson());
} catch (e) {
hasError = true;
super.error = error;
throw e;
throw e;
}
}
// }
}
Future insertOrder(ScanQrRequestModel _scanQrRequestModel) async {

@ -41,6 +41,12 @@ class _DashboardScreenState extends State<DashboardScreen> {
super.didChangeDependencies();
}
@override
void initState() {
super.initState();
Utils.getLocationPermission();
}
@override
Widget build(BuildContext context) {
int orderId;
@ -53,463 +59,463 @@ class _DashboardScreenState extends State<DashboardScreen> {
child: ListView(
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Padding(
padding: EdgeInsets.all(16.0),
child: Column(
children: <Widget>[
SafeArea(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Padding(
padding: EdgeInsets.all(16.0),
child: Column(
children: <Widget>[
SafeArea(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
TranslationBase.of(context).haveGreatDay,
style: TextStyle(
fontSize: 14.5,
color: Color(0xff636363),
fontWeight: FontWeight.w300),
),
Padding(
padding: EdgeInsets.only(top: 4.5),
child: Text(
_authenticationViewModel.user.userName,
style: TextStyle(
fontSize: 22.0,
color: Hexcolor("#343333"),
fontWeight: FontWeight.bold),
),
),
],
),
),
],
),
),
Padding(
padding: EdgeInsets.all(16.0),
child: SafeArea(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
TranslationBase.of(context).haveGreatDay,
style: TextStyle(
fontSize: 14.5,
color: Color(0xff636363),
fontWeight: FontWeight.w300),
),
Padding(
padding: EdgeInsets.only(top: 4.5),
child: Text(
_authenticationViewModel.user.userName,
style: TextStyle(
fontSize: 22.0,
color: Hexcolor("#343333"),
fontWeight: FontWeight.bold),
InkWell(
child: CircleAvatar(
radius: 25.5,
backgroundColor: Color(0xff30B7B9),
child: CircleAvatar(
backgroundColor: Color(0xff30B7B9),
maxRadius: 26.0,
child: Image.asset(
'assets/images/driver.png',
fit: BoxFit.contain,
),
),
),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => SettingPage(
driverName: _authenticationViewModel
.user.userName,
driverID: _authenticationViewModel
.user.userID)));
},
),
],
),
),
],
),
),
Padding(
padding: EdgeInsets.all(16.0),
child: SafeArea(
child: Column(
children: <Widget>[
InkWell(
child: CircleAvatar(
radius: 25.5,
backgroundColor: Color(0xff30B7B9),
child: CircleAvatar(
backgroundColor: Color(0xff30B7B9),
maxRadius: 26.0,
child: Image.asset(
'assets/images/driver.png',
fit: BoxFit.contain,
),
),
),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => SettingPage(
driverName: _authenticationViewModel
.user.userName,
driverID: _authenticationViewModel
.user.userID)));
},
),
],
),
),
],
),
],
),
Row(
children: <Widget>[
Expanded(
child: Column(
children: <Widget>[
Padding(
padding: EdgeInsets.symmetric(horizontal: 10.0),
child: Container(
height: MediaQuery.of(context).orientation ==
Row(
children: <Widget>[
Expanded(
child: Column(
children: <Widget>[
Padding(
padding: EdgeInsets.symmetric(horizontal: 10.0),
child: Container(
height: MediaQuery.of(context).orientation ==
Orientation.portrait
? MediaQuery.of(context).size.height * 0.16
: MediaQuery.of(context).size.height * 0.30,
width: MediaQuery.of(context).size.width * 0.44,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(15.0),
gradient: LINEAR_GRADIENT,
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Expanded(
child: Padding(
padding: EdgeInsets.all(2.0),
child: Column(
mainAxisAlignment:
? MediaQuery.of(context).size.height * 0.16
: MediaQuery.of(context).size.height * 0.30,
width: MediaQuery.of(context).size.width * 0.44,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(15.0),
gradient: LINEAR_GRADIENT,
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Expanded(
child: Padding(
padding: EdgeInsets.all(2.0),
child: Column(
mainAxisAlignment:
MainAxisAlignment.spaceEvenly,
children: <Widget>[
Text(
TranslationBase.of(context).youHave,
style: TextStyle(
color: Colors.white,
fontSize: MediaQuery.of(context)
.orientation ==
children: <Widget>[
Text(
TranslationBase.of(context).youHave,
style: TextStyle(
color: Colors.white,
fontSize: MediaQuery.of(context)
.orientation ==
Orientation.landscape
? SizeConfig.textMultiplier *
? SizeConfig.textMultiplier *
2.2
: SizeConfig.textMultiplier *
: SizeConfig.textMultiplier *
1.3,
),
),
Text(
'5',
style: TextStyle(
color: Colors.white,
fontSize:
),
),
Text(
'5',
style: TextStyle(
color: Colors.white,
fontSize:
SizeConfig.textMultiplier *
3.0),
),
Text(
TranslationBase.of(context)
.undeliveredPackages,
style: TextStyle(
color: Colors.white,
fontSize: MediaQuery.of(context)
.orientation ==
),
Text(
TranslationBase.of(context)
.undeliveredPackages,
style: TextStyle(
color: Colors.white,
fontSize: MediaQuery.of(context)
.orientation ==
Orientation.landscape
? SizeConfig.textMultiplier *
? SizeConfig.textMultiplier *
2.2
: SizeConfig.textMultiplier *
: SizeConfig.textMultiplier *
1.3,
),
)
],
),
)
],
),
),
),
),
),
Padding(
padding: EdgeInsets.only(right: 9.5),
child: Container(
width: 100,
height: 100,
decoration: BoxDecoration(
color: Colors.white10,
shape: BoxShape.circle),
child: Column(
mainAxisAlignment:
Padding(
padding: EdgeInsets.only(right: 9.5),
child: Container(
width: 100,
height: 100,
decoration: BoxDecoration(
color: Colors.white10,
shape: BoxShape.circle),
child: Column(
mainAxisAlignment:
MainAxisAlignment.center,
children: <Widget>[
Image.asset(
'assets/images/closed_box.png',
height: MediaQuery.of(context)
.orientation ==
children: <Widget>[
Image.asset(
'assets/images/closed_box.png',
height: MediaQuery.of(context)
.orientation ==
Orientation.portrait
? MediaQuery.of(context)
.size
.height *
? MediaQuery.of(context)
.size
.height *
0.09
: MediaQuery.of(context)
.size
.height *
: MediaQuery.of(context)
.size
.height *
0.20,
width: MediaQuery.of(context)
width: MediaQuery.of(context)
.size
.width *
0.20,
scale: 0.9,
fit: BoxFit.contain,
0.20,
scale: 0.9,
fit: BoxFit.contain,
),
],
),
],
),
),
),
],
),
],
),
),
)
],
),
),
Expanded(
child: Column(
children: <Widget>[
Padding(
padding: EdgeInsets.symmetric(horizontal: 10.0),
child: Container(
height: MediaQuery.of(context).orientation ==
),
)
],
),
),
Expanded(
child: Column(
children: <Widget>[
Padding(
padding: EdgeInsets.symmetric(horizontal: 10.0),
child: Container(
height: MediaQuery.of(context).orientation ==
Orientation.portrait
? MediaQuery.of(context).size.height * 0.16
: MediaQuery.of(context).size.height * 0.30,
width: MediaQuery.of(context).size.width * 0.45,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(15.0),
gradient: LINEAR_GRADIENT,
),
child: InkWell(
onTap: () => Navigator.push(
context,
MaterialPageRoute(
builder: (context) =>
DeliverdOrdersPage())),
child: Row(
mainAxisAlignment:
? MediaQuery.of(context).size.height * 0.16
: MediaQuery.of(context).size.height * 0.30,
width: MediaQuery.of(context).size.width * 0.45,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(15.0),
gradient: LINEAR_GRADIENT,
),
child: InkWell(
onTap: () => Navigator.push(
context,
MaterialPageRoute(
builder: (context) =>
DeliverdOrdersPage())),
child: Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: <Widget>[
Expanded(
child: Padding(
padding: EdgeInsets.all(2.0),
child: Column(
mainAxisAlignment:
children: <Widget>[
Expanded(
child: Padding(
padding: EdgeInsets.all(2.0),
child: Column(
mainAxisAlignment:
MainAxisAlignment.spaceEvenly,
children: <Widget>[
Text(
TranslationBase.of(context).youHave,
style: TextStyle(
color: Colors.white,
fontSize: MediaQuery.of(context)
.orientation ==
children: <Widget>[
Text(
TranslationBase.of(context).youHave,
style: TextStyle(
color: Colors.white,
fontSize: MediaQuery.of(context)
.orientation ==
Orientation.landscape
? SizeConfig.textMultiplier *
? SizeConfig.textMultiplier *
2.2
: SizeConfig.textMultiplier *
: SizeConfig.textMultiplier *
1.3,
),
),
Text(
'3',
style: TextStyle(
color: Colors.white,
fontSize:
),
),
Text(
'3',
style: TextStyle(
color: Colors.white,
fontSize:
SizeConfig.textMultiplier *
3.0),
),
Text(
TranslationBase.of(context)
.deliveredPackages,
style: TextStyle(
color: Colors.white,
fontSize: MediaQuery.of(context)
.orientation ==
),
Text(
TranslationBase.of(context)
.deliveredPackages,
style: TextStyle(
color: Colors.white,
fontSize: MediaQuery.of(context)
.orientation ==
Orientation.landscape
? SizeConfig.textMultiplier *
? SizeConfig.textMultiplier *
2.2
: SizeConfig.textMultiplier *
: SizeConfig.textMultiplier *
1.3,
),
)
],
),
),
),
Padding(
padding: EdgeInsets.only(right: 9.5),
child: Container(
width: 100,
height: 100,
decoration: BoxDecoration(
color: Colors.white10,
shape: BoxShape.circle,
),
)
],
),
),
),
child: Column(
mainAxisAlignment:
Padding(
padding: EdgeInsets.only(right: 9.5),
child: Container(
width: 100,
height: 100,
decoration: BoxDecoration(
color: Colors.white10,
shape: BoxShape.circle,
),
child: Column(
mainAxisAlignment:
MainAxisAlignment.center,
children: <Widget>[
Image.asset(
'assets/images/opend_box.png',
height: MediaQuery.of(context)
.orientation ==
children: <Widget>[
Image.asset(
'assets/images/opend_box.png',
height: MediaQuery.of(context)
.orientation ==
Orientation.portrait
? MediaQuery.of(context)
.size
.height *
? MediaQuery.of(context)
.size
.height *
0.09
: MediaQuery.of(context)
.size
.height *
: MediaQuery.of(context)
.size
.height *
0.20,
width: MediaQuery.of(context)
width: MediaQuery.of(context)
.size
.width *
0.20,
scale: 0.9,
fit: BoxFit.contain,
0.20,
scale: 0.9,
fit: BoxFit.contain,
),
],
),
],
),
),
),
],
),
],
),
),
),
),
)
],
),
)
],
),
),
],
),
],
),
Padding(
padding: EdgeInsets.symmetric(vertical: 16.0, horizontal: 15.0),
child: Row(
children: <Widget>[
Expanded(
child: InkWell(
onTap: () {
_scanQrAndGetPatient(context, model);
},
child: Container(
height: MediaQuery.of(context).orientation ==
Padding(
padding: EdgeInsets.symmetric(vertical: 16.0, horizontal: 15.0),
child: Row(
children: <Widget>[
Expanded(
child: InkWell(
onTap: () {
_scanQrAndGetPatient(context, model);
},
child: Container(
height: MediaQuery.of(context).orientation ==
Orientation.portrait
? MediaQuery.of(context).size.height * 0.18
: MediaQuery.of(context).size.height * 0.30,
width: MediaQuery.of(context).size.width * 0.50,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(15.0),
gradient: LINEAR_GRADIENT,
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
Column(
mainAxisAlignment: MainAxisAlignment.center,
? MediaQuery.of(context).size.height * 0.18
: MediaQuery.of(context).size.height * 0.30,
width: MediaQuery.of(context).size.width * 0.50,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(15.0),
gradient: LINEAR_GRADIENT,
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
Image.asset(
'assets/images/qr_code.png',
width: MediaQuery.of(context).size.width *
0.26,
height: MediaQuery.of(context)
.orientation ==
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Image.asset(
'assets/images/qr_code.png',
width: MediaQuery.of(context).size.width *
0.26,
height: MediaQuery.of(context)
.orientation ==
Orientation.portrait
? MediaQuery.of(context).size.height *
? MediaQuery.of(context).size.height *
0.14
: MediaQuery.of(context).size.height *
: MediaQuery.of(context).size.height *
0.28,
fit: BoxFit.contain,
)
],
),
Column(
mainAxisAlignment:
fit: BoxFit.contain,
)
],
),
Column(
mainAxisAlignment:
MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Padding(
padding: EdgeInsets.only(top: 8.0),
child: Text(
TranslationBase.of(context).scan,
style: TextStyle(
fontSize: MediaQuery.of(context)
.orientation ==
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Padding(
padding: EdgeInsets.only(top: 8.0),
child: Text(
TranslationBase.of(context).scan,
style: TextStyle(
fontSize: MediaQuery.of(context)
.orientation ==
Orientation.landscape
? SizeConfig.textMultiplier * 6.0
: SizeConfig.textMultiplier * 4.0,
color: Colors.white,
fontWeight: FontWeight.w400,
? SizeConfig.textMultiplier * 6.0
: SizeConfig.textMultiplier * 4.0,
color: Colors.white,
fontWeight: FontWeight.w400,
),
),
),
),
),
Padding(
padding: EdgeInsets.only(top: 0.0),
child: Text(
TranslationBase.of(context)
.toAddPackageToQue,
style: TextStyle(
fontSize: MediaQuery.of(context)
.orientation ==
Padding(
padding: EdgeInsets.only(top: 0.0),
child: Text(
TranslationBase.of(context)
.toAddPackageToQue,
style: TextStyle(
fontSize: MediaQuery.of(context)
.orientation ==
Orientation.landscape
? SizeConfig.textMultiplier * 3.0
: SizeConfig.textMultiplier * 2.0,
color: Colors.white,
letterSpacing: 0.2,
wordSpacing: 0.5,
? SizeConfig.textMultiplier * 3.0
: SizeConfig.textMultiplier * 2.0,
color: Colors.white,
letterSpacing: 0.2,
wordSpacing: 0.5,
),
),
),
),
),
],
)
],
)
],
),
),
),
),
),
)
],
),
),
Padding(
padding: EdgeInsets.symmetric(horizontal: 20.0, vertical: 1.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Column(
children: <Widget>[
Text(TranslationBase.of(context).nearestDropOffs,
style: TextStyle(
fontSize: 18.0,
color: Hexcolor("#343333"),
fontWeight: FontWeight.bold)),
)
],
),
if (model.state == ViewState.Idle)
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
InkWell(
child: Row(
children: <Widget>[
Text(
TranslationBase.of(context).seeAll,
style: TextStyle(
fontSize: 14.5, color: Color(0xff42B6AD)),
),
Padding(
padding: EdgeInsets.symmetric(horizontal: 20.0, vertical: 1.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Column(
children: <Widget>[
Text(TranslationBase.of(context).nearestDropOffs,
style: TextStyle(
fontSize: 18.0,
color: Hexcolor("#343333"),
fontWeight: FontWeight.bold)),
],
),
if (model.state == ViewState.Idle)
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
InkWell(
child: Row(
children: <Widget>[
Text(
TranslationBase.of(context).seeAll,
style: TextStyle(
fontSize: 14.5, color: Color(0xff42B6AD)),
),
Icon(
Icons.arrow_forward_ios,
size: 15.0,
color: Color(0xff42B6AD),
),
],
),
Icon(
Icons.arrow_forward_ios,
size: 15.0,
color: Color(0xff42B6AD),
onTap: () => Navigator.push(
context,
MaterialPageRoute(
builder: (context) => OrdersListScreen()),
),
],
),
onTap: () => Navigator.push(
context,
MaterialPageRoute(
builder: (context) => OrdersListScreen()),
),
),
],
),
],
],
),
),
NetworkBaseView(
baseViewModel: model,
child: Expanded(
child: ListView.builder(
shrinkWrap: true,
scrollDirection: Axis.vertical,
itemCount: model.orders == null
? 0
: model.orders.length < 3 ? model.orders.length : 3,
itemBuilder: (BuildContext context, int index) {
return Padding(
padding: EdgeInsets.symmetric(horizontal: 0.2),
child: OrderInfoCard(
order: model.orders[index],
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => InformationPage(
model.orders[index])));
}),
);
},
),
],
),
),
NetworkBaseView(
baseViewModel: model,
child: Expanded(
child: ListView.builder(
shrinkWrap: true,
scrollDirection: Axis.vertical,
itemCount: model.orders == null
? 0
: model.orders.length < 3 ? model.orders.length : 3,
itemBuilder: (BuildContext context, int index) {
return Padding(
padding: EdgeInsets.symmetric(horizontal: 0.2),
child: OrderInfoCard(
order: model.orders[index],
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => InformationPage(
model.orders[index])));
}),
);
},
),
),
),
],
),
],
),
),
),
),
);
}

File diff suppressed because one or more lines are too long

@ -1,5 +1,9 @@
import 'package:app_settings/app_settings.dart';
import 'package:connectivity/connectivity.dart';
import 'package:driverapp/config/config.dart';
import 'package:driverapp/pages/setting/request_permission_page.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:location/location.dart';
import 'app_shared_preferences.dart';
@ -21,7 +25,7 @@ class Utils {
/// Check The Internet Connection
static Future<bool> checkConnection() async {
ConnectivityResult connectivityResult =
await (Connectivity().checkConnectivity());
await (Connectivity().checkConnectivity());
if ((connectivityResult == ConnectivityResult.mobile) ||
(connectivityResult == ConnectivityResult.wifi)) {
return true;
@ -44,9 +48,63 @@ class Utils {
FocusScope.of(context).unfocus();
}
static isLocationPermissionGranted() async {
return (await location.hasPermission()) == PermissionStatus.granted;
}
static Location location = new Location();
static Future<PermissionStatus> getLocationPermission() async {
bool _serviceEnabled;
PermissionStatus _permissionGranted;
_serviceEnabled = await location.serviceEnabled();
if (!_serviceEnabled) {
try {
_serviceEnabled = await location.requestService();
} catch (e) {
print(e);
}
if (!_serviceEnabled) {
// Route to another page and send to him message "You have to enable location"
}
}
_permissionGranted = await location.hasPermission();
if (_permissionGranted == PermissionStatus.denied) {
// _permissionGranted = await location.requestPermission();
if (_permissionGranted == PermissionStatus.denied) {
// Route to another page and send to him message "You have to give Permission"
Navigator.pushReplacement(
AppGlobal.context,
MaterialPageRoute(
builder: (context) => RequestPermissionPage(),
),
);
//return _permissionGranted;
} else if (_permissionGranted == PermissionStatus.deniedForever) {
AppSettings.openLocationSettings();
// open setting page
}
} else if (_permissionGranted == PermissionStatus.deniedForever) {
AppSettings.openLocationSettings();
// open setting page
}
return _permissionGranted;
}
static getLocation() async {
// AppGlobal.context
Location location = new Location();
LocationData currentLocation = await location.getLocation();
LocationData currentLocation;
// await getLocationPermission();
try {
currentLocation = await location.getLocation();
} catch (e) {
await getLocationPermission();
print(e);
}
return currentLocation;
}

@ -75,6 +75,9 @@ dependencies:
#gradient
gradient_app_bar: ^0.1.3
app_settings: ^4.0.3

Loading…
Cancel
Save