mongodb_mobile 0.0.7 mongodb_mobile: ^0.0.7 copied to clipboard
A new flutter plugin project.
import 'dart:async';
import 'dart:convert';
import 'dart:math';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:mongodb_mobile/carrier.dart';
import 'package:mongodb_mobile/mongodb_mobile.dart';
void main() {
debugPrint(
'π π π Flutter MongoDB Mobile Platform Example App starting ... : ${DateTime.now().toIso8601String()} π§©π§©π§©');
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'MongoPluginExample',
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.pink,
),
home: MongoExamplePage(),
);
}
}
class MongoExamplePage extends StatefulWidget {
@override
_MongoExamplePageState createState() => _MongoExamplePageState();
}
class _MongoExamplePageState extends State<MongoExamplePage> implements ConfigListener {
static const MONGO_CONN =
"mongodb+srv://aubs:aubrey3@ar001-1xhdt.mongodb.net/ardb?retryWrites=true&w=majority";
@override
void initState() {
super.initState();
// setMongoAtlasAppID();
// listenToMongoChangeEvents();
_getState();
}
@override
onConfigSaved() {
isConfig = false;
_getState();
}
_getState() async {
appID = await getAppID();
collectionName = await getCollectionName();
databaseName = await getDatabaseName();
databaseType = await getDatabaseType();
if (appID == null || collectionName == null || databaseName == null) {
setState(() {
isConfig = true;
});
return;
}
_logWidgets = List();
_logWidgets.add(LogDisplay(type: 1, message: 'Call Logging Started', date: DateTime.now()));
setState(() {
if (databaseType.contains('Mobile')) {
setLocalMongoAppID();
isRemote = false;
} else {
setMongoAtlasAppID();
isRemote = true;
}
});
}
// Platform messages are asynchronous, so we initialize in an async method.
Future<void> setLocalMongoAppID() async {
String platformVersion;
try {
platformVersion = await MongodbMobile.platformVersion;
debugPrint('_MyAppState: π§©π§©π§© Platform Version : π $platformVersion');
var res = await MongodbMobile.setAppID({
'appID': 'exampleApp',
'type': MongodbMobile.LOCAL_DATABASE,
});
print(res);
showSnackbar(
scaffoldKey: _key,
message: 'π π π LOCAL DB connection succeeded',
textColor: Colors.white,
backgroundColor: Colors.teal.shade900);
} on PlatformException catch (f) {
print('πΏπΏπΏπΏπΏπΏπΏπΏ PlatformException π π π - $f');
showSnackbar(
scaffoldKey: _key,
message: 'π½ Local database connection failed π½ π½ π½ ',
textColor: Colors.yellow,
backgroundColor: Colors.pink.shade900);
}
if (!mounted) return;
setState(() {});
}
static const API_KEY =
"HkcniZshpeSsJFgHxFYvBbGppUZyOEDFyrVwzsjqSXzluBy16r90EBTU5esygnuW";
Future<void> setMongoAtlasAppID() async {
try {
debugPrint('\n\n π π π setting remote MongoDB Stitch App ID ....');
var res = await MongodbMobile.setAppID({
'appID': 'routebuilder-scewg',
'type': MongodbMobile.ATLAS_DATABASE,
'email': 'hacker1@admin',
'password': 'aubrey3'
});
print(res);
showSnackbar(
scaffoldKey: _key,
message: 'β€οΈ 𧑠π π π π Mongo Atlas connected',
textColor: Colors.white,
backgroundColor: Colors.teal.shade900);
} on PlatformException catch (f) {
print('πΏπΏπΏπΏπΏπΏπΏπΏ PlatformException π π π - $f');
showSnackbar(
scaffoldKey: _key,
message: 'π½ Atlas connection failed π½ π½ π½ ',
textColor: Colors.yellow,
backgroundColor: Colors.pink.shade900);
}
if (!mounted) return;
setState(() {});
}
Random random = Random(DateTime.now().millisecondsSinceEpoch);
/// Add document to a collection
Future insertDocument() async {
debugPrint('\n\nπ π inserting a document ....');
dynamic result;
try {
var clientID = DateTime.now().toIso8601String();
var fIndex = random.nextInt(fNames.length - 1);
var lIndex = random.nextInt(lNames.length - 1);
var carrier = Carrier(db: databaseName, collection: collectionName, data: {
'name': fNames.elementAt(fIndex),
'lastName': lNames.elementAt(lIndex),
'clientID': clientID,
'wealth': random.nextInt(100000) * 1.04,
'date': DateTime.now().toUtc().toIso8601String(),
'desc': 'π serve with purpose π'
});
_logWidgets.add(LogDisplay(type: 1, message: 'inserting Document', date: DateTime.now()));
result = await MongodbMobile.insert(carrier);
clientIDs.add(clientID);
debugPrint(
'\n\nπ§©π§©π§©π§©π§©π§© _MyAppState: insertDocument π§©π§©π§© document added : π id: $result\n\n\n');
_logWidgets.add(LogDisplay(type: 2, message: 'Document inserted', date: DateTime.now()));
setState(() {
});
showSnackbar(
message: ' π§©π§©π§© Document inserted',
scaffoldKey: _key,
backgroundColor: Colors.black,
textColor: Colors.white);
} on PlatformException catch (f) {
print('πΏπΏπΏπΏπΏπΏπΏπΏ PlatformException π π π - $f');
showSnackbar(
message: ' π‘ π‘ Document insert failed',
scaffoldKey: _key,
backgroundColor: Colors.red.shade700,
textColor: Colors.yellow);
}
}
/// Sync collection
Future syncCollection() async {
debugPrint('\n\nπ π syncCollection ....');
dynamic result;
try {
_logWidgets.add(LogDisplay(type: 1, message: 'Sync Atlas DB', date: DateTime.now()));
var carrier = Carrier(db: databaseName, collection: collectionName);
result = await MongodbMobile.sync(carrier);
_logWidgets.add(LogDisplay(type: 2, message: 'Atlas DB sync started', date: DateTime.now()));
setState(() {
});
debugPrint(
'\n\nπ§©π§©π§©π§©π§©π§© _MyAppState: syncCollection: π§©π§©π§© π result: $result\n\n\n');
showSnackbar(
message: ' π§©π§©π§© Mobile - Atlas Sync started',
scaffoldKey: _key,
backgroundColor: Colors.black,
textColor: Colors.white);
} on PlatformException catch (f) {
print('πΏπΏπΏπΏπΏπΏπΏπΏ PlatformException π π π - $f');
showSnackbar(
message: ' π‘ π‘ Sync Collection failed',
scaffoldKey: _key,
backgroundColor: Colors.red.shade700,
textColor: Colors.yellowAccent);
}
}
/// Add document to a collection
Future addToArray() async {
debugPrint('\n\nπ π addToArray nested in document ....');
if (clientIDs.isEmpty) {
showSnackbar(
scaffoldKey: _key,
message: 'Please insert document first',
textColor: Colors.yellow,
backgroundColor: Colors.red);
return;
}
dynamic result;
try {
var id = clientIDs.elementAt(0);
var carrier = Carrier(
db: databaseName,
collection: collectionName,
id: {
'field': 'clientID',
'value': id,
},
arrayName: "musicTracks",
data: {
'artist': 'Michael Jackson',
'track': 'Dirty Diana',
'date': new DateTime.now().toIso8601String(),
});
var carrier1 = Carrier(
db: databaseName,
collection: collectionName,
id: {
'field': 'clientID',
'value': id,
},
arrayName: "musicTracks",
data: {
'artist': 'Michael Jackson',
'track': 'Thriller',
'date': new DateTime.now().toIso8601String(),
});
var carrier2 = Carrier(
db: databaseName,
collection: collectionName,
id: {
'field': 'clientID',
'value': id,
},
arrayName: "musicTracks",
data: {
'artist': 'Michael Jackson',
'track': 'Earth Song',
'date': new DateTime.now().toIso8601String(),
});
var carrier3 = Carrier(
db: databaseName,
collection: collectionName,
id: {
'field': 'clientID',
'value': id,
},
arrayName: "musicTracks",
data: {
'artist': 'Michael Jackson',
'track': 'We Are The World',
'date': new DateTime.now().toIso8601String(),
});
_logWidgets.add(LogDisplay(type: 1, message: 'Add element to nested array in Document', date: DateTime.now()));
result = await MongodbMobile.addToArray(carrier);
_logWidgets.add(LogDisplay(type: 2, message: 'Array element 1 added', date: DateTime.now()));
debugPrint(
'\n\nπ§©π§©π§©π§©π§©π§© _MyAppState: addToArray π§©π§©π§© element 2 added to nested array : π result: $result\n\n\n');
result = await MongodbMobile.addToArray(carrier1);
_logWidgets.add(LogDisplay(type: 2, message: 'Array element added', date: DateTime.now()));
debugPrint(
'\n\nπ§©π§©π§©π§©π§©π§© _MyAppState: addToArray π§©π§©π§© element 3 added to nested array : π result: $result\n\n\n');
result = await MongodbMobile.addToArray(carrier2);
_logWidgets.add(LogDisplay(type: 2, message: 'Array element added', date: DateTime.now()));
debugPrint(
'\n\nπ§©π§©π§©π§©π§©π§© _MyAppState: addToArray π§©π§©π§© element 4 added to nested array : π result: $result\n\n\n');
result = await MongodbMobile.addToArray(carrier3);
_logWidgets.add(LogDisplay(type: 2, message: 'Array element added', date: DateTime.now()));
debugPrint(
'\n\nπ§©π§©π§©π§©π§©π§© _MyAppState: addToArray π§©π§©π§© element added to nested array : π result: $result\n\n\n');
setState(() {
});
showSnackbar(
message: ' π§©π§©π§© element added to nested array',
scaffoldKey: _key,
backgroundColor: Colors.black,
textColor: Colors.lightBlue);
} on PlatformException catch (f) {
print('πΏπΏπΏπΏπΏπΏπΏπΏ PlatformException π π π - $f');
showSnackbar(
scaffoldKey: _key,
message: f.message,
textColor: Colors.yellow,
backgroundColor: Colors.red);
}
}
List<String> clientIDs = List();
List documents = List();
/// Get all documents from a collection
Future getAllDocuments() async {
debugPrint('\n\nπ π getAllDocuments ....');
try {
_logWidgets.add(LogDisplay(type: 1, message: 'find all Documents', date: DateTime.now()));
var carrier = Carrier(db: databaseName, collection: collectionName);
documents = await MongodbMobile.getAll(carrier);
_logWidgets.add(LogDisplay(type: 2, message: 'Documents found: ${documents.length}', date: DateTime.now()));
debugPrint(
'\n\nπ π π _MyAppState: getAllDocuments π§©π§©π§© retrieved : π ${documents.length} documents π \n\n\n');
var cnt = 0;
documents.forEach((m) {
cnt++;
debugPrint(' π§©π§©π§© #$cnt π $m');
// debugPrint(' π§©π§©π§© #$cnt π ${m['name']} ${m['lastName']}');
});
showSnackbar(
message: 'π π π ${documents.length} documents found',
scaffoldKey: _key,
backgroundColor: Colors.black,
textColor: Colors.white);
} on PlatformException catch (f) {
print('πΏπΏπΏπΏπΏπΏπΏπΏ PlatformException π π π - $f');
showSnackbar(
message: 'π π π ${documents.length} documents failed',
scaffoldKey: _key,
backgroundColor: Colors.red[700],
textColor: Colors.yellow);
}
}
/// Delete document from a collection
Future delete() async {
debugPrint('\n\nπ π delete ....');
if (clientIDs.isEmpty) {
showSnackbar(
scaffoldKey: _key,
message: 'Please insert document first',
textColor: Colors.yellow,
backgroundColor: Colors.red);
return;
}
try {
var carrier = Carrier(
db: databaseName,
collection: collectionName,
id: {
'field': 'clientID',
'value': clientIDs.elementAt(0),
},
);
_logWidgets.add(LogDisplay(type: 1, message: 'delete Document', date: DateTime.now()));
var res = await MongodbMobile.delete(carrier);
_logWidgets.add(LogDisplay(type: 2, message: 'Document deleted', date: DateTime.now()));
clientIDs.removeAt(0);
debugPrint(
'\n\nπ π π _MyAppState:delete: π§©π§©π§© deleted : π : $res π \n\n\n');
setState(() {
});
showSnackbar(
message: 'π π π document deleted',
scaffoldKey: _key,
backgroundColor: Colors.black,
textColor: Colors.white);
} on PlatformException catch (f) {
print('πΏπΏπΏπΏπΏπΏπΏπΏ PlatformException π π π - $f');
showSnackbar(
message: 'π π π document delete failed',
scaffoldKey: _key,
backgroundColor: Colors.pink[700],
textColor: Colors.white);
}
}
/// get one document from a collection
Future getOne() async {
debugPrint('\n\nπ π get one doc ....');
if (clientIDs.isEmpty) {
showSnackbar(
scaffoldKey: _key,
message: 'Please insert document first',
textColor: Colors.yellow,
backgroundColor: Colors.red);
return;
}
try {
_logWidgets.add(LogDisplay(type: 2, message: 'get 1 Document by property', date: DateTime.now()));
var carrier = Carrier(
db: databaseName,
collection: collectionName,
id: {
'field': 'clientID',
'value': clientIDs.elementAt(0),
},
);
var res = await MongodbMobile.getOne(carrier);
_logWidgets.add(LogDisplay(type: 2, message: 'Document obtained', date: DateTime.now()));
setState(() {
});
debugPrint(
'\n\nπ π π _MyAppState:getOne: π§©π§©π§© get one : π : $res π \n\n\n');
showSnackbar(
message: 'π π π document retrieved',
scaffoldKey: _key,
backgroundColor: Colors.black,
textColor: Colors.white);
} on PlatformException catch (f) {
print('πΏπΏπΏπΏπΏπΏπΏπΏ PlatformException π π π - $f');
}
}
/// Replace document from a collection
Future updateDocument() async {
debugPrint('\n\nπ π replace ....');
if (clientIDs.isEmpty) {
showSnackbar(
scaffoldKey: _key,
message: 'Please insert document first',
textColor: Colors.yellow,
backgroundColor: Colors.red[800]);
return;
}
try {
_logWidgets.add(LogDisplay(type: 2, message: 'update Document', date: DateTime.now()));
print('ππππ updating document with clientID: π ${clientIDs.elementAt(0)}');
var carrier = Carrier(db: databaseName, collection: collectionName, id: {
'field': 'clientID',
'value': clientIDs.elementAt(0),
}, fields: {
// 'name': 'Aubrey π½ St. Vincent',
// 'lastName': 'Malabie π¦π¦π¦ III',
'wealth': 5555522.55,
'clientID': clientIDs.elementAt(0),
'date': DateTime.now().toUtc().toIso8601String(),
'desc': 'π¬ π serve with UPDATED purpose π π¬ '
});
var res = await MongodbMobile.update(carrier);
_logWidgets.add(LogDisplay(type: 2, message: 'Document updated', date: DateTime.now()));
debugPrint(
'\n\nπ π π _MyAppState:replace: π§©π§©π§© replaced : π 1 document : $res π \n\n\n');
showSnackbar(
message: 'π π π document replaced',
scaffoldKey: _key,
backgroundColor: Colors.indigo.shade800,
textColor: Colors.white);
} on PlatformException catch (f) {
print('πΏπΏπΏπΏπΏπΏπΏπΏ PlatformException π π π - $f');
}
}
/// Query Mongo database using collection properties
Future query() async {
debugPrint('\n\nπ π getByProperty ....');
try {
_logWidgets.add(LogDisplay(type: 1, message: 'start Query', date: DateTime.now()));
var carrier = Carrier(db: databaseName, collection: collectionName, query: {
"gt": {"wealth": 5000},
"eq": {"lastName": lNames.elementAt(random.nextInt(lNames.length - 1))},
"and": true,
"or": false,
"limit": 0
});
dynamic object = await MongodbMobile.query(carrier);
_logWidgets.add(LogDisplay(type: 2, message: 'Documents found ${object.length}', date: DateTime.now()));
debugPrint(
'\n\nπ π π _MyAppState: query: π§©π§©π§© retrieved : π ${object.length} documents π see below: \n\n\n');
var cnt = 0;
object.forEach((m) {
cnt++;
debugPrint(' π₯¬π₯¬π₯¬ #$cnt π $m');
});
showSnackbar(
message: ' π π π ${object.length} documents found',
scaffoldKey: _key,
backgroundColor: Colors.purple,
textColor: Colors.white);
} on PlatformException catch (f) {
print('πΏπΏπΏπΏπΏπΏπΏπΏ PlatformException π π π - $f');
}
}
EventChannel channel = EventChannel(MongodbMobile.MONGO_CHANGE_EVENTS);
void listenToMongoChangeEvents() {
// Consuming events on the Dart side.
channel.receiveBroadcastStream().listen((dynamic event) {
print(
'\n\nπΊ πΊ πΊ Received change event from Mongo: π¦ $event π¦ π¦ π¦ \n\n');
_logWidgets.add(LogDisplay(type: 2, message: '𧩠𧩠Mongo Change Event', date: DateTime.now()));
setState(() {
});
var changeEvent = json.decode(event['changeEvent']);
var document = json.decode(event['document']);
print(changeEvent);
print(document);
}, onError: (dynamic error) {
print('Received error: ${error.message}');
});
print(
'\n\nπ¦ π¦ π¦ Listening to Channel events for π¦ Mongo Change Events\n');
}
void showSnackbar(
{@required GlobalKey<ScaffoldState> scaffoldKey,
@required String message,
@required Color textColor,
@required Color backgroundColor}) {
if (scaffoldKey.currentState == null) {
print('AppSnackbar.showSnackbar --- currentState is NULL, quit ..');
return;
}
scaffoldKey.currentState.removeCurrentSnackBar();
scaffoldKey.currentState.showSnackBar(new SnackBar(
content: _getText(message, textColor),
duration: new Duration(seconds: 15),
backgroundColor: backgroundColor,
));
}
static Widget _getText(
String message,
Color textColor,
) {
return Text(
message,
overflow: TextOverflow.clip,
style: new TextStyle(color: textColor),
);
}
GlobalKey<ScaffoldState> _key = GlobalKey();
bool isRemote = false;
BuildContext mContext;
String appID, collectionName, databaseName, databaseType;
@override
Widget build(BuildContext context) {
return Scaffold(
key: _key,
appBar: AppBar(
title: Center(
child: Padding(
padding: EdgeInsets.all(12),
child: Text(
'MongoDB Plugin',
style: TextStyle(
fontWeight: FontWeight.w900,
fontSize: 20,
color: Colors.white),
),
),
),
actions: <Widget>[
IconButton(
icon: Icon(Icons.settings),
onPressed: () {
setState(() {
isConfig = true;
});
},
),
],
backgroundColor:
isRemote ? Colors.pink.shade300 : Colors.deepOrange.shade300,
bottom: PreferredSize(
preferredSize: Size.fromHeight(140),
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: <Widget>[
SizedBox(
height: 8,
),
Row(
children: <Widget>[
Text(
(isRemote != null && isRemote) ? 'MongoDB Atlas' : 'Mobile Database',
style: TextStyle(
fontSize: 24,
color: Colors.white,
fontWeight: FontWeight.w900),
),
],
),
SizedBox(
height: 20,
),
Row(
children: <Widget>[
Text('Database Name:', style: TextStyle(fontWeight: FontWeight.w700),),
SizedBox(width: 8,),
Text(
(databaseName == null) ? '' : databaseName,
style: TextStyle(
fontSize: 18,
color: Colors.white,
fontWeight: FontWeight.w900),
),
],
),
SizedBox(
height: 8,
),
Row(
children: <Widget>[
Text('Collection Name:', style: TextStyle(fontWeight: FontWeight.w700),),
SizedBox(width: 8,),
Text(
(collectionName == null) ? '' : collectionName,
style: TextStyle(
fontSize: 18,
color: Colors.white,
fontWeight: FontWeight.w900),
),
],
),
],
),
),
),
),
backgroundColor: Colors.brown.shade50,
floatingActionButton: FloatingActionButton(
onPressed: () {
if (_logWidgets.isEmpty) {
_showInfo();
} else {
_showLogs();
}
},
child: Icon(Icons.bug_report),
backgroundColor:
(isRemote != null && isRemote) ? Colors.pink.shade600 : Colors.deepOrange.shade600,
elevation: 24,
),
body: Stack(
children: <Widget>[
isConfig? Padding(
padding: const EdgeInsets.all(12.0),
child: Config(listener: this,),
) : Center(
child: Padding(
padding: const EdgeInsets.all(12.0),
child: Card(
elevation: 8,
child: Padding(
padding: const EdgeInsets.all(20.0),
child: ListView(
children: <Widget>[
Center(
child: Text(
'8 Mongo API\'s',
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w900,
color: Colors.indigo.shade200),
),
),
SizedBox(
height: 8,
),
Container(
width: 260,
child: RaisedButton(
onPressed: insertDocument,
elevation: 16,
color: Colors.pink.shade300,
child: Padding(
padding: const EdgeInsets.all(20.0),
child: Text(
'Insert One Document',
style: TextStyle(color: Colors.white),
),
),
),
),
SizedBox(
height: 12,
),
Container(
width: 260,
child: RaisedButton(
onPressed: getAllDocuments,
elevation: 16,
color: Colors.purple.shade300,
child: Padding(
padding: const EdgeInsets.all(20.0),
child: Text(
'Get All Documents',
style: TextStyle(color: Colors.white),
),
),
),
),
SizedBox(
height: 12,
),
Container(
width: 260,
child: RaisedButton(
onPressed: query,
elevation: 16,
color: Colors.teal.shade300,
child: Padding(
padding: const EdgeInsets.all(20.0),
child: Text(
'Query By Properties',
style: TextStyle(color: Colors.white),
),
),
),
),
SizedBox(
height: 12,
),
Container(
width: 260,
child: RaisedButton(
onPressed: delete,
elevation: 16,
color: Colors.blue.shade400,
child: Padding(
padding: const EdgeInsets.all(20.0),
child: Text(
'Delete Document',
style: TextStyle(color: Colors.white),
),
),
),
),
SizedBox(
height: 12,
),
Container(
width: 260,
child: RaisedButton(
onPressed: updateDocument,
elevation: 16,
color: Colors.brown.shade400,
child: Padding(
padding: const EdgeInsets.all(20.0),
child: Text(
'Update Document',
style: TextStyle(color: Colors.white),
),
),
),
),
SizedBox(
height: 12,
),
Container(
width: 260,
child: RaisedButton(
onPressed: getOne,
elevation: 16,
color: Colors.indigo.shade400,
child: Padding(
padding: const EdgeInsets.all(20.0),
child: Text(
'Get One Document',
style: TextStyle(color: Colors.white),
),
),
),
),
SizedBox(
height: 12,
),
Container(
width: 260,
child: RaisedButton(
onPressed: addToArray,
elevation: 16,
color: Colors.orange.shade500,
child: Padding(
padding: const EdgeInsets.all(20.0),
child: Text(
'Add To Nested Array',
style: TextStyle(color: Colors.white),
),
),
),
),
SizedBox(
height: 12,
),
isRemote
? Container(
width: 260,
child: RaisedButton(
onPressed: syncCollection,
elevation: 16,
color: Colors.lime.shade700,
child: Padding(
padding: const EdgeInsets.all(20.0),
child: Text(
'Sync Collection',
style: TextStyle(color: Colors.white),
),
),
),
)
: Container(),
SizedBox(
height: 12,
),
Text(txt),
],
),
),
),
),
),
],
),
);
}
List<LogDisplay> _logWidgets = List();
bool isConfig = false;
var txt = 'π π π Flutter MongoDB Mobile Plugin ' +
'This project contains the source code for a plugin that enables Flutter apps to use the MongoDB Mobile embedded database. '
'The example app included creates a database and a test collection and helps to load data.';
var txt2 = 'For more, check out the source code in Github!';
void _showInfo() {
showDialog(
context: context,
builder: (_) => new AlertDialog(
title: new Text(
"MongoDB Plugin",
style: TextStyle(
fontWeight: FontWeight.w900,
fontSize: 28,
color: Theme.of(context).primaryColor),
),
content: Container(
height: 260.0,
child: Column(
children: <Widget>[
Padding(
padding: const EdgeInsets.all(20.0),
child: Column(
children: <Widget>[
Text(
info,
style: TextStyle(
fontWeight: FontWeight.normal, fontSize: 16),
),
SizedBox(
height: 20,
),
Text(
txt2,
style: TextStyle(
fontWeight: FontWeight.normal, fontSize: 16),
),
SizedBox(
height: 12,
),
],
),
),
],
),
),
actions: <Widget>[
Padding(
padding: const EdgeInsets.only(bottom: 20.0),
child: FlatButton(
onPressed: () {
Navigator.pop(context);
},
// color: Colors.blue.shade700,
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Text(
'CLOSE, Thanks!',
style: TextStyle(color: Colors.blue.shade600),
),
),
),
),
],
));
}
void _showLogs() {
Navigator.push(context, MaterialPageRoute(
builder: (context) => LogDisplayList(
logDisplays: _logWidgets,
),
));
}
var info =
'π This app exercises all the API\'s from the Flutter mongodb_mobile plugin in the Dart Pub library π π π';
List<String> fNames = [
"John",
"Vusi",
"Lulu",
"Kgabi",
"Peter",
"Cyril",
"Nancy",
"Donald",
'Rogers',
'Lesego',
'Leslie',
'Fatima',
"Catherine",
'Musapa',
'Benjamin',
'Rachel',
'Georgia',
'California',
"Obby",
"Tiger"
];
List<String> lNames = [
"Marule",
"Woods",
"Obama",
'Trump',
'van der Merwe',
'Sithole',
"Ramaphosa",
"Malenga",
"Jackson",
"Maringa",
"Johnson",
"Petersen",
"Bhengu"
];
}
enum DatabaseType { Atlas, Mobile }
class Config extends StatefulWidget {
final ConfigListener listener;
Config({@required this.listener});
@override
_ConfigState createState() => _ConfigState();
}
class _ConfigState extends State<Config> {
DatabaseType _databaseType = DatabaseType.Atlas;
TextEditingController _appIDController = TextEditingController();
TextEditingController _dbController = TextEditingController();
TextEditingController _collectionController = TextEditingController();
String appID, collectionName, databaseName, databaseType;
@override
initState() {
super.initState();
_getState();
}
_getState() async {
appID = await getAppID();
collectionName = await getCollectionName();
databaseName = await getDatabaseName();
databaseType = await getDatabaseType();
if (appID != null) {
_appIDController.text = appID;
}
if (databaseName != null) {
_dbController.text = databaseName;
}
if (collectionName != null) {
_collectionController.text = collectionName;
}
if (databaseType != null && databaseType.contains('Mobile')) {
_databaseType = DatabaseType.Mobile;
} else {
_databaseType = DatabaseType.Atlas;
}
}
_onAppIDChanged(String value) async {
print(value);
appID = value;
await saveAppID(appID);
}
_onDBChanged(String value) async{
print(value);
databaseName = value;
await saveDatabaseName(databaseName);
}
_onCollectionChanged(String value) async{
print(value);
collectionName = value;
await saveCollectionName(collectionName);
}
@override
Widget build(BuildContext context) {
return Card(
elevation: 4,
child: Padding(
padding: const EdgeInsets.all(20.0),
child: ListView(
children: <Widget>[
RadioListTile<DatabaseType>(
title: const Text('Atlas DB'),
value: DatabaseType.Atlas,
groupValue: _databaseType,
onChanged: (DatabaseType value) {
saveDatabaseType('Atlas');
setState(() {
_databaseType = value;
});
print('π π π databaseName selected: $_databaseType');
},
),
RadioListTile<DatabaseType>(
title: const Text('Mobile DB'),
value: DatabaseType.Mobile,
groupValue: _databaseType,
onChanged: (DatabaseType value) {
saveDatabaseType('Mobile');
setState(() {
_databaseType = value;
});
print('π π π databaseName selected: $_databaseType');
},
),
SizedBox(
height: 24,
),
TextField(
controller: _appIDController,
onChanged: _onAppIDChanged,
keyboardType: TextInputType.text,
decoration: InputDecoration(hintText: 'Enter AppID'),
),
SizedBox(
height: 12,
),
TextField(
controller: _dbController,
onChanged: _onDBChanged,
keyboardType: TextInputType.text,
decoration: InputDecoration(hintText: 'Enter Database Name'),
),
SizedBox(
height: 12,
),
TextField(
controller: _collectionController,
onChanged: _onCollectionChanged,
keyboardType: TextInputType.text,
decoration:
InputDecoration(hintText: 'Enter Collection Name'),
),
SizedBox(
height: 24,
),
RaisedButton(
elevation: 8,
color: Colors.blue[700],
child: Padding(
padding: const EdgeInsets.all(20),
child: Text('Done Saving Config', style: TextStyle(color: Colors.white),),
),
onPressed: () {
print('π π π save config pressed');
widget.listener.onConfigSaved();
},
),
],
),
),
);
}
}
abstract class ConfigListener {
onConfigSaved();
}
Future saveCollectionName(String token) async {
debugPrint("βοΈοΈ SharedPrefs saving collection ..........");
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString("CollectionName", token);
debugPrint("βοΈοΈ CollectionName saved in prefs: π π $token");
}
Future<String> getCollectionName() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
var token = prefs.getString("CollectionName");
debugPrint("βοΈοΈ SharedPrefs - CollectionName from prefs: 𧑠$token");
return token;
}
Future saveDatabaseName(String token) async {
debugPrint("βοΈοΈ SharedPrefs saving database ..........");
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString("DatabaseName", token);
debugPrint("βοΈοΈ DatabaseName saved in prefs: π π $token");
}
Future<String> getDatabaseName() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
var token = prefs.getString("DatabaseName");
debugPrint("βοΈοΈ SharedPrefs - DatabaseName from prefs:β€οΈ $token");
return token;
}
Future saveAppID(String token) async {
debugPrint("βοΈοΈ SharedPrefs saving appID ..........");
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString("appID", token);
debugPrint("βοΈοΈ AppID saved in prefs: β€οΈ 𧑠$token");
}
Future<String> getAppID() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
var token = prefs.getString("appID");
debugPrint("βοΈοΈ SharedPrefs - AppID from prefs: π $token");
return token;
}
Future saveDatabaseType(String token) async {
debugPrint("βοΈοΈ SharedPrefs saving databaseType ..........");
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString("databaseType", token);
debugPrint("βοΈοΈ databaseType saved in prefs: β€οΈ 𧑠$token");
}
Future<String> getDatabaseType() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
var token = prefs.getString("databaseType");
debugPrint("βοΈοΈ SharedPrefs - databaseType from prefs: π $token");
return token;
}
class LogDisplay extends StatelessWidget {
final int type;
final String message;
final DateTime date;
LogDisplay({@required this.type, @required this.message, @required this.date});
@override
Widget build(BuildContext context) {
return Card(
elevation: 2,
child: ListTile(
leading: Text(type == 1? 'π' : 'π'),
title: Text(message),
subtitle: Text(date.toIso8601String()),
),
);
}
}
class LogDisplayList extends StatelessWidget {
final List<LogDisplay> logDisplays;
LogDisplayList({@required this.logDisplays});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('MongoDB Logs'),
),
body: ListView.builder(
itemCount: logDisplays.length,
itemBuilder: (context, index) {
return logDisplays.elementAt(index);
}),
);
}
}