Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
Q
queue_flutter
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Ernanda
queue_flutter
Commits
d125b466
Commit
d125b466
authored
Feb 25, 2022
by
valdi
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
succes set ready, queue, and pick up
parent
3814b22d
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
644 additions
and
199 deletions
+644
-199
api.dart
lib/api.dart
+2
-1
ready_bloc.dart
lib/bloc/ready_bloc.dart
+9
-11
selected_ready_bloc.dart
lib/bloc/selected_ready_bloc.dart
+19
-0
queue_cubit.dart
lib/cubit/queue_cubit.dart
+5
-5
ready_cubit.dart
lib/cubit/ready_cubit.dart
+29
-0
ready_state.dart
lib/cubit/ready_state.dart
+30
-0
config.dart
lib/helper/config.dart
+9
-0
main.dart
lib/main.dart
+87
-0
main_page.dart
lib/main_page.dart
+280
-180
queue.dart
lib/models/queue.dart
+4
-1
pubspec.lock
pubspec.lock
+167
-1
pubspec.yaml
pubspec.yaml
+3
-0
No files found.
lib/api.dart
View file @
d125b466
import
'dart:async'
;
import
'dart:convert'
;
import
'package:http/http.dart'
as
http
;
import
'package:manager_queue/helper/config.dart'
;
import
'package:manager_queue/models/queue.dart'
;
import
'package:flutter/material.dart'
;
...
...
@@ -17,7 +18,7 @@ class ApiQueue {
}
static
Future
<
List
<
OrderQueue
>>
getQueue
()
async
{
String
apiUrl
=
"http://192.168.2.142:8000/api/getqueue"
;
String
apiUrl
=
apiUrlQueue
;
// print("Test");
List
<
OrderQueue
>
queues
=
[];
try
{
...
...
lib/bloc/ready_bloc.dart
View file @
d125b466
...
...
@@ -7,23 +7,21 @@ class ReadyBloc extends Cubit<List<OrderQueue>> {
Future
<
List
<
OrderQueue
>>
getData
()
async
{
var
apiQueue
=
await
ApiQueue
.
getQueue
();
return
apiQueue
;
return
apiQueue
.
where
((
i
)
=>
(
i
.
status
==
"Ready"
)).
toList
()
;
}
// List<OrderQueue> queues = [
// OrderQueue(id: "1", queue_number: '123', status: 'Ready'),
// OrderQueue(id: "2", queue_number: '1234', status: 'Ready'),
// OrderQueue(id: "3", queue_number: '12345', status: 'queue'),
// OrderQueue(id: "4", queue_number: '123456', status: 'queue'),
// OrderQueue(id: "5", queue_number: '12345633', status: 'Ready'),
// ];
// ReadyBloc() : super(Future.empty);
void
queueList
()
{
getData
().
then
((
value
)
{
// print(value);
emit
(
value
);
});
}
onPressed
(
OrderQueue
thisQueue
)
{
var
index
=
state
.
indexOf
(
thisQueue
);
thisQueue
.
isSelected
=
!
thisQueue
.
isSelected
;
state
[
index
]
=
thisQueue
;
print
(
'berubah'
);
emit
(
state
);
}
}
lib/bloc/selected_ready_bloc.dart
0 → 100644
View file @
d125b466
import
'package:bloc/bloc.dart'
;
import
'package:flutter/widgets.dart'
;
import
'package:manager_queue/models/queue.dart'
;
class
SelectedReadyBloc
extends
Cubit
<
List
<
OrderQueue
>>
{
SelectedReadyBloc
()
:
super
([]);
onPressed
(
OrderQueue
thisQueue
)
{
if
(
state
.
contains
(
thisQueue
))
{
state
.
remove
(
thisQueue
);
}
else
{
state
.
add
(
thisQueue
);
}
print
(
state
);
emit
(
state
);
}
}
lib/cubit/queue_cubit.dart
View file @
d125b466
...
...
@@ -11,12 +11,12 @@ class QueueCubit extends Cubit<QueueState> {
Future
<
void
>
getData
()
async
{
emit
(
QueueLoading
());
Future
.
delayed
(
const
Duration
(
milliseconds:
2000
),
()
async
{
var
apiQueue
=
await
ApiQueue
.
getQueue
();
var
data
=
apiQueue
.
where
((
i
)
=>
(
i
.
status
==
"In Queue"
)).
toList
();
//
Future.delayed(const Duration(milliseconds: 2000), () async {
var
apiQueue
=
await
ApiQueue
.
getQueue
();
var
data
=
apiQueue
.
where
((
i
)
=>
(
i
.
status
==
"In Queue"
)).
toList
();
emit
(
QueueLoaded
(
data
));
});
emit
(
QueueLoaded
(
data
));
//
});
}
onPressed
(
List
<
OrderQueue
>
active
,
OrderQueue
toUpdate
)
{
...
...
lib/cubit/ready_cubit.dart
0 → 100644
View file @
d125b466
import
'package:bloc/bloc.dart'
;
import
'package:equatable/equatable.dart'
;
import
'package:manager_queue/models/queue.dart'
;
import
'../api.dart'
;
part
'ready_state.dart'
;
class
ReadyCubit
extends
Cubit
<
ReadyState
>
{
ReadyCubit
()
:
super
(
ReadyInitial
());
Future
<
void
>
getData
()
async
{
emit
(
ReadyLoading
());
// Future.delayed(const Duration(milliseconds: 2000), () async {
var
apiQueue
=
await
ApiQueue
.
getQueue
();
var
data
=
apiQueue
.
where
((
i
)
=>
(
i
.
status
==
"Ready"
)).
toList
();
emit
(
ReadyLoaded
(
data
));
// });
}
onPressed
(
List
<
OrderQueue
>
active
,
OrderQueue
toUpdate
)
{
emit
(
ReadyInitial
());
var
index
=
active
.
indexOf
(
toUpdate
);
toUpdate
.
isSelectedReady
=
!
toUpdate
.
isSelectedReady
;
active
[
index
]
=
toUpdate
;
emit
(
ReadyUpdated
(
active
));
}
}
lib/cubit/ready_state.dart
0 → 100644
View file @
d125b466
part of
'ready_cubit.dart'
;
abstract
class
ReadyState
extends
Equatable
{
const
ReadyState
();
@override
List
<
Object
>
get
props
=>
[];
}
class
ReadyInitial
extends
ReadyState
{}
class
ReadyLoading
extends
ReadyState
{}
class
ReadyLoaded
extends
ReadyState
{
final
List
<
OrderQueue
>
readys
;
ReadyLoaded
(
this
.
readys
);
@override
List
<
Object
>
get
props
=>
[
readys
];
}
class
ReadyUpdated
extends
ReadyState
{
final
List
<
OrderQueue
>
readys
;
ReadyUpdated
(
this
.
readys
);
@override
List
<
Object
>
get
props
=>
[
readys
];
}
lib/helper/config.dart
0 → 100644
View file @
d125b466
import
'package:mqtt_client/mqtt_browser_client.dart'
;
const
String
apiUrlQueue
=
"http://192.168.2.142:8000/api/getqueue"
;
const
String
apiUrlUpdate
=
"http://192.168.2.142:8000/api/updatequeue"
;
const
String
mqttUrl
=
"ws://dev.ravku.com"
;
const
String
queueTopic
=
"queuetest/1"
;
const
String
queueMessage
=
"updateApi"
;
const
int
mqttPort
=
1883
;
final
mqClient
=
MqttBrowserClient
(
mqttUrl
,
""
);
lib/main.dart
View file @
d125b466
import
'dart:io'
;
import
'package:flutter/material.dart'
;
import
'package:flutter_bloc/flutter_bloc.dart'
;
import
'package:manager_queue/bloc/queue_bloc.dart'
;
import
'package:manager_queue/bloc/ready_bloc.dart'
;
import
'package:manager_queue/cubit/queue_cubit.dart'
;
import
'package:manager_queue/cubit/ready_cubit.dart'
;
import
'package:manager_queue/helper/config.dart'
;
import
'package:manager_queue/main_page.dart'
;
import
'package:mqtt_client/mqtt_client.dart'
;
import
'package:shared_preferences/shared_preferences.dart'
;
import
'bloc/selected_queue_bloc.dart'
;
import
'bloc/selected_ready_bloc.dart'
;
void
main
(
)
{
// var prefs = await SharedPreferences.getInstance();
runApp
(
MyApp
());
}
Future
<
int
>
runMqTT
(
BuildContext
context
)
async
{
mqClient
.
logging
(
on:
false
);
mqClient
.
setProtocolV311
();
mqClient
.
keepAlivePeriod
=
86400
;
mqClient
.
port
=
mqttPort
;
mqClient
.
onDisconnected
;
mqClient
.
onConnected
;
mqClient
.
onSubscribed
;
// mqClient.pongCallback = pong;
final
connMess
=
MqttConnectMessage
()
.
withClientIdentifier
(
'Mqtt_MyClientUniqueId'
)
.
withWillTopic
(
'willtopic'
)
// If you set this you must set a will message
.
withWillMessage
(
'My Will message'
)
.
startClean
()
// Non persistent session for testing
.
withWillQos
(
MqttQos
.
atLeastOnce
);
// print('EXAMPLE::Mosquitto client connecting....');
mqClient
.
connectionMessage
=
connMess
;
try
{
await
mqClient
.
connect
();
}
on
NoConnectionException
catch
(
e
)
{
// Raised by the client when connection fails.
// print('EXAMPLE::client exception - $e');
mqClient
.
disconnect
();
}
on
SocketException
catch
(
e
)
{
// Raised by the socket layer
// print('EXAMPLE::socket exception - $e');
mqClient
.
disconnect
();
}
if
(
mqClient
.
connectionStatus
!.
state
==
MqttConnectionState
.
connected
)
{
// print('EXAMPLE::Mosquitto client connected');
}
else
{
/// Use status here rather than state if you also want the broker return code.
// print(
// 'EXAMPLE::ERROR Mosquitto client connection failed - disconnecting, status is ${mqClient.connectionStatus}');
mqClient
.
disconnect
();
exit
(-
1
);
}
/// Ok, lets try a subscription
// print('EXAMPLE::Subscribing to the queuetest/1 topic');
var
topic
=
queueTopic
;
// Not a wildcard topic
mqClient
.
subscribe
(
topic
,
MqttQos
.
atMostOnce
);
/// The client has a change notifier object(see the Observable class) which we then listen to to get
/// notifications of published updates to each subscribed topic.
// mqClient.updates!.listen((List<MqttReceivedMessage<MqttMessage?>>? c) {
// final recMess = c![0].payload as MqttPublishMessage;
// final pt =
// MqttPublishPayload.bytesToStringAsString(recMess.payload.message);
// // if (c[0].topic == topic && pt == queueMessage) {
// // context.read<QueueBloc>().queueList();
// // // print("berhasil update API");
// // } else {
// // // print("tidak berhasil dapat message yang sesuai");
// // }
// print('Notifikasi masuk dari topic <${c[0].topic}>, isinya adalah: $pt ');
// print('');
// });
// print('EXAMPLE::Sleeping....');
// await MqttUtilities.asyncSleep(60);
// /// Finally, unsubscribe and exit gracefully
// print('EXAMPLE::Unsubscribing');
// mqClient.unsubscribe(topic);
/// Wait for the unsubscribe message from the broker if you wish.
// await MqttUtilities.asyncSleep(2);
// print('EXAMPLE::Disconnecting');
// mqClient.disconnect();
return
0
;
}
class
MyApp
extends
StatelessWidget
{
@override
Widget
build
(
BuildContext
context
)
{
runMqTT
(
context
);
return
MaterialApp
(
initialRoute:
'/'
,
routes:
{
...
...
@@ -22,6 +107,8 @@ class MyApp extends StatelessWidget {
BlocProvider
(
create:
(
_
)
=>
ReadyBloc
()),
BlocProvider
(
create:
(
_
)
=>
SelectedQueueBloc
()),
BlocProvider
(
create:
(
_
)
=>
QueueCubit
()),
BlocProvider
(
create:
(
_
)
=>
SelectedReadyBloc
()),
BlocProvider
(
create:
(
_
)
=>
ReadyCubit
()),
],
child:
MainPage
()),
},
debugShowCheckedModeBanner:
false
,
...
...
lib/main_page.dart
View file @
d125b466
import
'dart:collection'
;
import
'dart:convert'
;
import
'package:flutter/material.dart'
;
import
'package:flutter_bloc/flutter_bloc.dart'
;
...
...
@@ -6,9 +7,12 @@ import 'package:flutter_bloc/flutter_bloc.dart';
// import 'package:manager_queue/api.dart';
import
'package:manager_queue/bloc/queue_bloc.dart'
;
import
'package:manager_queue/bloc/ready_bloc.dart'
;
import
'package:manager_queue/helper/config.dart'
;
import
'package:manager_queue/models/queue.dart'
;
import
'package:http/http.dart'
as
http
;
import
'package:mqtt_client/mqtt_client.dart'
;
import
'cubit/queue_cubit.dart'
;
import
'cubit/ready_cubit.dart'
;
class
MainPage
extends
StatefulWidget
{
@override
...
...
@@ -16,56 +20,88 @@ class MainPage extends StatefulWidget {
}
class
_MainPageState
extends
State
<
MainPage
>
{
// var queue = ['1', '4', '5'];
List
<
dynamic
>
orderQueue
=
[];
List
<
dynamic
>
orderReady
=
[];
List
<
OrderQueue
>
queueSelected
=
[];
List
<
OrderQueue
>
readySelected
=
[];
List
<
OrderQueue
>
pickUp
=
[];
// List<dynamic> orderQueueList = [];
// @override
// void initState() {
// // orderQueueList = orderQueue.where((i) => (i.status == 'In Queue')).toList();
// // orderReady = orderQueue.where((i) => (i.status == 'Ready')).toList();
// // TODO: implement initState
// super.initState();
// }
List
<
String
>
queueSelected
=
[];
List
<
String
>
readySelected
=
[];
List
<
String
>
pickUp
=
[];
void
setToReady
(
List
<
OrderQueue
>
queueSelected
)
{
void
setToReady
(
List
queueSelected
)
async
{
var
apiUrl
=
apiUrlUpdate
;
for
(
var
i
in
queueSelected
)
{
orderQueue
.
remove
(
i
);
var
apiResult
=
await
http
.
post
(
Uri
.
parse
(
apiUrl
),
body:
{
"id"
:
i
.
toString
(),
"status"
:
"1"
});
var
jsonObject
=
jsonDecode
(
apiResult
.
body
)[
'status'
];
// if (jsonObject == true) {
// context.read<QueueCubit>().getData();
// context.read<ReadyCubit>().getData();
// } else {
// print("tidak berhasil");
// }
}
orderReady
.
addAll
(
queueSelected
);
context
.
read
<
QueueCubit
>().
getData
();
context
.
read
<
ReadyCubit
>().
getData
();
const
pubTopic
=
queueTopic
;
final
builder
=
MqttClientPayloadBuilder
();
builder
.
addString
(
queueMessage
);
mqClient
.
publishMessage
(
pubTopic
,
MqttQos
.
exactlyOnce
,
builder
.
payload
!);
}
void
setToQueue
(
List
<
OrderQueue
>
readySelected
)
{
void
setToQueue
(
List
readySelected
)
async
{
// print(readySelected);
var
apiUrl
=
apiUrlUpdate
;
for
(
var
i
in
readySelected
)
{
orderReady
.
remove
(
i
);
var
apiResult
=
await
http
.
post
(
Uri
.
parse
(
apiUrl
),
body:
{
"id"
:
i
.
toString
(),
"status"
:
"0"
});
var
jsonObject
=
jsonDecode
(
apiResult
.
body
)[
'status'
];
// if (jsonObject == true) {
// context.read<ReadyCubit>().getData();
// context.read<QueueCubit>().getData();
// } else {
// print("tidak berhasil");
// }
}
orderQueue
.
addAll
(
readySelected
);
context
.
read
<
ReadyCubit
>().
getData
();
context
.
read
<
QueueCubit
>().
getData
();
const
pubTopic
=
queueTopic
;
final
builder
=
MqttClientPayloadBuilder
();
builder
.
addString
(
queueMessage
);
mqClient
.
publishMessage
(
pubTopic
,
MqttQos
.
exactlyOnce
,
builder
.
payload
!);
}
void
setToPickUp
(
List
<
OrderQueue
>
readySelected
)
{
// void setToPickUp(List<OrderQueue> readySelected) {
// for (var i in readySelected) {
// orderReady.remove(i);
// }
// pickUp.addAll(readySelected);
// }
void
setToPickUp
(
List
readySelected
)
async
{
// print(readySelected);
var
apiUrl
=
apiUrlUpdate
;
for
(
var
i
in
readySelected
)
{
orderReady
.
remove
(
i
);
var
apiResult
=
await
http
.
post
(
Uri
.
parse
(
apiUrl
),
body:
{
"id"
:
i
.
toString
(),
"status"
:
"2"
});
var
jsonObject
=
jsonDecode
(
apiResult
.
body
)[
'status'
];
// if (jsonObject == true) {
// context.read<ReadyCubit>().getData();
// context.read<QueueCubit>().getData();
// } else {
// print("tidak berhasil");
// }
}
pickUp
.
addAll
(
readySelected
);
context
.
read
<
ReadyCubit
>().
getData
();
const
pubTopic
=
queueTopic
;
final
builder
=
MqttClientPayloadBuilder
();
builder
.
addString
(
queueMessage
);
mqClient
.
publishMessage
(
pubTopic
,
MqttQos
.
exactlyOnce
,
builder
.
payload
!);
}
// void queueSelectItem(List<Queue> _queueselect) {
// }
@override
Widget
build
(
BuildContext
context
)
{
context
.
read
<
QueueCubit
>().
getData
();
// context.read<ReadyBloc>().queueList();
print
(
"Rebuild"
);
context
.
read
<
ReadyCubit
>().
getData
();
return
MaterialApp
(
debugShowCheckedModeBanner:
false
,
...
...
@@ -123,12 +159,6 @@ class _MainPageState extends State<MainPage> {
context
.
read
<
QueueCubit
>()
.
onPressed
(
state
.
queues
,
thisQueue
);
// print(context
// .read<SelectedQueueBloc>()
// .state
// .contains(thisQueue)
// ? 'ADA LOH'
// : 'GAK ADA LOH');
},
child:
Card
(
color:
Colors
.
black38
,
...
...
@@ -138,12 +168,7 @@ class _MainPageState extends State<MainPage> {
),
child:
Center
(
child:
Text
(
thisQueue
.
isSelected
?
"Pesanan "
+
thisQueue
.
queue_number
+
" ✅ "
:
"Pesanan "
+
thisQueue
.
queue_number
,
"Pesanan "
+
thisQueue
.
queue_number
,
style:
TextStyle
(
fontSize:
20
),
))),
),
...
...
@@ -151,7 +176,6 @@ class _MainPageState extends State<MainPage> {
},
);
}
else
if
(
state
is
QueueUpdated
)
{
print
(
'updated'
);
return
GridView
.
builder
(
itemCount:
state
.
queues
.
length
,
gridDelegate:
...
...
@@ -162,6 +186,13 @@ class _MainPageState extends State<MainPage> {
childAspectRatio:
2
),
itemBuilder:
(
BuildContext
context
,
int
index
)
{
var
thisQueue
=
state
.
queues
[
index
];
if
(
thisQueue
.
isSelected
)
{
if
(!
queueSelected
.
contains
(
thisQueue
.
id
))
{
queueSelected
.
add
(
thisQueue
.
id
);
}
}
else
{
queueSelected
.
remove
(
thisQueue
.
id
);
}
return
Material
(
borderRadius:
BorderRadius
.
circular
(
10
),
child:
InkWell
(
...
...
@@ -169,12 +200,6 @@ class _MainPageState extends State<MainPage> {
context
.
read
<
QueueCubit
>()
.
onPressed
(
state
.
queues
,
thisQueue
);
// print(context
// .read<SelectedQueueBloc>()
// .state
// .contains(thisQueue)
// ? 'ADA LOH'
// : 'GAK ADA LOH');
},
child:
Card
(
color:
thisQueue
.
isSelected
...
...
@@ -186,12 +211,7 @@ class _MainPageState extends State<MainPage> {
),
child:
Center
(
child:
Text
(
thisQueue
.
isSelected
?
"Pesanan "
+
thisQueue
.
queue_number
+
" ✅ "
:
"Pesanan "
+
thisQueue
.
queue_number
,
"Pesanan "
+
thisQueue
.
queue_number
,
style:
TextStyle
(
fontSize:
20
),
))),
),
...
...
@@ -205,33 +225,21 @@ class _MainPageState extends State<MainPage> {
),
),
),
Container
(
width:
1000
,
height:
100
,
color:
Colors
.
lightBlue
,
alignment:
Alignment
.
center
,
child:
Material
(
InkWell
(
onTap:
()
{
setToReady
(
queueSelected
);
},
child:
Container
(
width:
1000
,
height:
100
,
color:
Colors
.
lightBlue
,
alignment:
Alignment
.
center
,
child:
InkWell
(
onTap:
()
{
setState
(()
{
if
(
orderReady
.
contains
(
queueSelected
))
{
queueSelected
.
remove
(
queueSelected
);
}
else
{
orderReady
.
addAll
(
queueSelected
);
}
// print(queueSelected.toString());
});
},
splashColor:
Colors
.
amber
,
child:
GestureDetector
(
onTap:
()
=>
setToReady
(
queueSelected
),
child:
Text
(
"SET TO READY"
,
style:
TextStyle
(
fontSize:
30
,
fontWeight:
FontWeight
.
w700
),
),
onTap:
()
=>
setToReady
(
queueSelected
),
child:
Text
(
"SET TO READY"
,
style:
TextStyle
(
fontSize:
30
,
fontWeight:
FontWeight
.
w700
),
),
),
),
...
...
@@ -264,21 +272,43 @@ class _MainPageState extends State<MainPage> {
fontSize:
30
,
fontWeight:
FontWeight
.
w700
),
),
),
Container
(
width:
400
,
height:
100
,
margin:
EdgeInsets
.
all
(
20
),
decoration:
BoxDecoration
(
borderRadius:
BorderRadius
.
all
(
Radius
.
circular
(
20
),
InkWell
(
onTap:
()
{
print
(
"clear"
);
showDialog
(
context:
context
,
builder:
(
BuildContext
context
)
=>
AlertDialog
(
title:
Text
(
"Clear"
),
content:
Text
(
"Are you sure to clear?"
),
actions:
<
Widget
>[
TextButton
(
onPressed:
()
=>
Navigator
.
pop
(
context
),
child:
Text
(
'Cancel'
),
),
TextButton
(
onPressed:
()
=>
Navigator
.
pop
(
context
),
child:
Text
(
'OK'
),
),
],
),
);
},
child:
Container
(
width:
400
,
height:
100
,
margin:
EdgeInsets
.
all
(
20
),
decoration:
BoxDecoration
(
borderRadius:
BorderRadius
.
all
(
Radius
.
circular
(
20
),
),
color:
Colors
.
amber
,
),
alignment:
Alignment
.
center
,
child:
Text
(
"CLEAR"
,
style:
TextStyle
(
fontSize:
30
,
fontWeight:
FontWeight
.
w700
),
),
color:
Colors
.
amber
,
),
alignment:
Alignment
.
center
,
child:
Text
(
"CLEAR"
,
style:
TextStyle
(
fontSize:
30
,
fontWeight:
FontWeight
.
w700
),
),
),
],
...
...
@@ -309,81 +339,159 @@ class _MainPageState extends State<MainPage> {
child:
MediaQuery
.
removePadding
(
context:
context
,
removeTop:
true
,
child:
BlocBuilder
<
ReadyBloc
,
List
<
dynamic
>>(
builder:
(
context
,
list
)
{
List
<
dynamic
>
orderReady
=
[];
orderReady
=
list
.
where
((
i
)
=>
(
i
.
status
==
"Ready"
)).
toList
();
return
GridView
.
builder
(
itemCount:
orderReady
.
length
,
gridDelegate:
const
SliverGridDelegateWithFixedCrossAxisCount
(
crossAxisCount:
2
,
crossAxisSpacing:
10
,
mainAxisSpacing:
5
,
childAspectRatio:
2
),
itemBuilder:
(
BuildContext
context
,
int
index
)
{
var
thisReady
=
orderReady
[
index
];
return
Material
(
borderRadius:
BorderRadius
.
circular
(
10
),
child:
InkWell
(
onTap:
()
{
setState
(()
{
if
(
readySelected
.
contains
(
thisReady
))
{
readySelected
.
remove
(
thisReady
);
}
else
{
readySelected
.
add
(
thisReady
);
}
print
(
readySelected
.
toString
());
});
},
child:
Card
(
color:
Colors
.
black38
,
shape:
RoundedRectangleBorder
(
borderRadius:
BorderRadius
.
circular
(
10
),
child:
BlocConsumer
<
ReadyCubit
,
ReadyState
>(
listener:
(
context
,
state
)
{
print
(
'listener'
);
print
(
state
);
},
builder:
(
context
,
state
)
{
if
(
state
is
ReadyLoading
)
{
return
CircularProgressIndicator
();
}
else
if
(
state
is
ReadyLoaded
)
{
return
GridView
.
builder
(
itemCount:
state
.
readys
.
length
,
gridDelegate:
const
SliverGridDelegateWithFixedCrossAxisCount
(
crossAxisCount:
2
,
crossAxisSpacing:
10
,
mainAxisSpacing:
5
,
childAspectRatio:
2
),
itemBuilder:
(
BuildContext
context
,
int
index
)
{
var
thisQueue
=
state
.
readys
[
index
];
return
Material
(
borderRadius:
BorderRadius
.
circular
(
10
),
child:
InkWell
(
onTap:
()
{
context
.
read
<
ReadyCubit
>()
.
onPressed
(
state
.
readys
,
thisQueue
);
},
child:
Card
(
color:
Colors
.
black38
,
shape:
RoundedRectangleBorder
(
borderRadius:
BorderRadius
.
circular
(
10
),
),
child:
Center
(
child:
Text
(
"Pesanan "
+
thisQueue
.
queue_number
,
style:
TextStyle
(
fontSize:
20
),
))),
),
child:
Center
(
child:
Text
(
readySelected
.
contains
(
thisReady
)
?
"Pesanan "
+
thisReady
.
queue_number
+
" ✅"
:
"Pesanan "
+
thisReady
.
queue_number
,
style:
TextStyle
(
fontSize:
20
),
),
);
},
);
}
else
if
(
state
is
ReadyUpdated
)
{
return
GridView
.
builder
(
itemCount:
state
.
readys
.
length
,
gridDelegate:
const
SliverGridDelegateWithFixedCrossAxisCount
(
crossAxisCount:
2
,
crossAxisSpacing:
10
,
mainAxisSpacing:
5
,
childAspectRatio:
2
),
itemBuilder:
(
BuildContext
context
,
int
index
)
{
var
thisQueue
=
state
.
readys
[
index
];
if
(
thisQueue
.
isSelectedReady
)
{
if
(!
readySelected
.
contains
(
thisQueue
.
id
))
{
readySelected
.
add
(
thisQueue
.
id
);
}
}
else
{
readySelected
.
remove
(
thisQueue
.
id
);
}
return
Material
(
borderRadius:
BorderRadius
.
circular
(
10
),
child:
InkWell
(
onTap:
()
{
context
.
read
<
ReadyCubit
>()
.
onPressed
(
state
.
readys
,
thisQueue
);
},
child:
Card
(
color:
thisQueue
.
isSelectedReady
?
Colors
.
blue
:
Colors
.
black38
,
shape:
RoundedRectangleBorder
(
borderRadius:
BorderRadius
.
circular
(
10
),
),
child:
Center
(
child:
Text
(
"Pesanan "
+
thisQueue
.
queue_number
,
style:
TextStyle
(
fontSize:
20
),
))),
),
)
,
)
,
)
;
}
,
);
},
);
}),
}
else
{
return
SizedBox
();
}
},
),
// child: BlocBuilder<ReadyBloc, List<dynamic>>(
// builder: (context, list) {
// List<dynamic> orderReady = [];
// orderReady = list;
// return GridView.builder(
// itemCount: orderReady.length,
// gridDelegate:
// const SliverGridDelegateWithFixedCrossAxisCount(
// crossAxisCount: 2,
// crossAxisSpacing: 10,
// mainAxisSpacing: 5,
// childAspectRatio: 2),
// itemBuilder: (BuildContext context, int index) {
// var thisReady = orderReady[index];
// return Material(
// borderRadius: BorderRadius.circular(10),
// child: InkWell(
// onTap: () {
// setState(() {
// if (readySelected.contains(thisReady)) {
// readySelected.remove(thisReady);
// } else {
// readySelected.add(thisReady);
// }
// print(readySelected.toString());
// });
// },
// child: Card(
// color: Colors.black38,
// shape: RoundedRectangleBorder(
// borderRadius: BorderRadius.circular(10),
// ),
// child: Center(
// child: Text(
// readySelected.contains(thisReady)
// ? "Pesanan " + thisReady.id + " ✅"
// : "Pesanan " + thisReady.id,
// style: TextStyle(fontSize: 20),
// ),
// ),
// ),
// ),
// );
// },
// );
// }),
),
),
Row
(
children:
[
Flexible
(
flex:
1
,
child:
Container
(
height:
100
,
color:
Colors
.
green
,
alignment:
Alignment
.
center
,
child:
InkWell
(
onTap:
()
{
setState
(()
{
if
(
orderQueue
.
contains
(
readySelected
))
{
readySelected
.
remove
(
readySelected
);
}
else
{
orderQueue
.
addAll
(
readySelected
);
}
// print(queueSelected.toString());
});
},
splashColor:
Colors
.
amber
,
child:
GestureDetector
(
child:
InkWell
(
onTap:
()
{
setToQueue
(
readySelected
);
},
child:
Container
(
height:
100
,
color:
Colors
.
green
,
alignment:
Alignment
.
center
,
child:
InkWell
(
onTap:
()
=>
setToQueue
(
readySelected
),
child:
Text
(
"SET TO QUEUE"
,
...
...
@@ -397,23 +505,15 @@ class _MainPageState extends State<MainPage> {
),
Flexible
(
flex:
1
,
child:
Container
(
height:
100
,
color:
Colors
.
black26
,
alignment:
Alignment
.
center
,
child:
InkWell
(
onTap:
()
{
setState
(()
{
if
(
pickUp
.
contains
(
readySelected
))
{
readySelected
.
remove
(
readySelected
);
}
else
{
pickUp
.
addAll
(
readySelected
);
}
// print(queueSelected.toString());
});
},
child:
GestureDetector
(
child:
InkWell
(
onTap:
()
{
setToPickUp
(
readySelected
);
},
child:
Container
(
height:
100
,
color:
Colors
.
black26
,
alignment:
Alignment
.
center
,
child:
InkWell
(
onTap:
()
=>
setToPickUp
(
readySelected
),
child:
Text
(
"PICK UP"
,
...
...
lib/models/queue.dart
View file @
d125b466
...
...
@@ -3,12 +3,14 @@ class OrderQueue {
final
String
queue_number
;
final
String
status
;
bool
isSelected
=
false
;
bool
isSelectedReady
=
false
;
OrderQueue
(
{
required
this
.
id
,
required
this
.
queue_number
,
required
this
.
status
,
required
this
.
isSelected
});
required
this
.
isSelected
,
required
this
.
isSelectedReady
});
factory
OrderQueue
.
createOrderQueue
(
Map
<
String
,
dynamic
>
json
)
{
return
OrderQueue
(
...
...
@@ -16,6 +18,7 @@ class OrderQueue {
queue_number:
json
[
'queue_number'
].
toString
(),
status:
json
[
'status'
].
toString
(),
isSelected:
false
,
isSelectedReady:
false
,
);
}
}
pubspec.lock
View file @
d125b466
...
...
@@ -50,6 +50,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.15.0"
crypto:
dependency: transitive
description:
name: crypto
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.1"
cupertino_icons:
dependency: "direct main"
description:
...
...
@@ -64,6 +71,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.3"
event_bus:
dependency: transitive
description:
name: event_bus
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0"
fake_async:
dependency: transitive
description:
...
...
@@ -71,6 +85,20 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.0"
ffi:
dependency: transitive
description:
name: ffi
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.2"
file:
dependency: transitive
description:
name: file
url: "https://pub.dartlang.org"
source: hosted
version: "6.1.2"
flutter:
dependency: "direct main"
description: flutter
...
...
@@ -95,6 +123,11 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_web_plugins:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
http:
dependency: "direct main"
description:
...
...
@@ -109,6 +142,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "4.0.0"
js:
dependency: transitive
description:
name: js
url: "https://pub.dartlang.org"
source: hosted
version: "0.6.4"
lints:
dependency: transitive
description:
...
...
@@ -137,6 +177,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.7.0"
mqtt_client:
dependency: "direct main"
description:
name: mqtt_client
url: "https://pub.dartlang.org"
source: hosted
version: "9.6.5"
multi_select_flutter:
dependency: "direct main"
description:
...
...
@@ -158,6 +205,48 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.8.1"
path_provider_linux:
dependency: transitive
description:
name: path_provider_linux
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.5"
path_provider_platform_interface:
dependency: transitive
description:
name: path_provider_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.3"
path_provider_windows:
dependency: transitive
description:
name: path_provider_windows
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.5"
platform:
dependency: transitive
description:
name: platform
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.0"
plugin_platform_interface:
dependency: transitive
description:
name: plugin_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.2"
process:
dependency: transitive
description:
name: process
url: "https://pub.dartlang.org"
source: hosted
version: "4.2.4"
provider:
dependency: transitive
description:
...
...
@@ -165,6 +254,62 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "6.0.2"
shared_preferences:
dependency: "direct main"
description:
name: shared_preferences
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.13"
shared_preferences_android:
dependency: transitive
description:
name: shared_preferences_android
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.11"
shared_preferences_ios:
dependency: transitive
description:
name: shared_preferences_ios
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
shared_preferences_linux:
dependency: transitive
description:
name: shared_preferences_linux
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
shared_preferences_macos:
dependency: transitive
description:
name: shared_preferences_macos
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.3"
shared_preferences_platform_interface:
dependency: transitive
description:
name: shared_preferences_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0"
shared_preferences_web:
dependency: transitive
description:
name: shared_preferences_web
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.3"
shared_preferences_windows:
dependency: transitive
description:
name: shared_preferences_windows
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
sky_engine:
dependency: transitive
description: flutter
...
...
@@ -219,6 +364,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.0"
uuid:
dependency: "direct main"
description:
name: uuid
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.6"
vector_math:
dependency: transitive
description:
...
...
@@ -226,6 +378,20 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.1"
win32:
dependency: transitive
description:
name: win32
url: "https://pub.dartlang.org"
source: hosted
version: "2.4.1"
xdg_directories:
dependency: transitive
description:
name: xdg_directories
url: "https://pub.dartlang.org"
source: hosted
version: "0.2.0+1"
sdks:
dart: ">=2.16.1 <3.0.0"
flutter: ">=
1.16
.0"
flutter: ">=
2.8
.0"
pubspec.yaml
View file @
d125b466
...
...
@@ -33,7 +33,10 @@ dependencies:
sdk
:
flutter
flutter_bloc
:
^8.0.1
http
:
^0.13.4
mqtt_client
:
^9.6.5
multi_select_flutter
:
^4.0.0
shared_preferences
:
^2.0.13
uuid
:
^3.0.6
dev_dependencies
:
flutter_lints
:
^1.0.0
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment