If possible Try to solve using providers and connectivity plus packages.
I have an app named BadOne. I have connected this app to the MongoDb. I am not doing any operation yet I am just but I am able to connect it properly but when I turn off the internet the App stops working with an exception as given below.

Debug Console
E/flutter (26165): [ERROR:flutter/lib/ui/ui_dart_state.cc(198)] Unhandled Exception: MongoDB ConnectionException: Socket error: 2.718281828459045
main.dart
import 'package:badone/MyApp.dart';
import 'package:badone/mongodb_connection/mongoDbFunctions.dart';
import 'package:flutter/material.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await MongoDatabase.connect();
runApp(MyApp());
}
MyApp.dart
import 'package:badone/router/auto_route.gr.dart';
import 'package:flutter/material.dart';
class MyApp extends StatelessWidget {
MyApp({Key? key}) : super(key: key);
final _appRouter = AppRouter();
@override
Widget build(BuildContext context) {
return MaterialApp.router(
debugShowCheckedModeBanner: false,
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
routerDelegate: _appRouter.delegate(),
routeInformationParser: _appRouter.defaultRouteParser(),
);
}
}
constant.dart
const MONGO_CONN_URL =
"mongodb+srv://abhishek_Tiwari2:[email protected]/admin2";
const USER_COLLECTION = "table";
const REVIEW_COLLECTION = "reviewCollection";
mongoDbFunctions.dart
import 'dart:developer';
import 'package:flutter/rendering.dart';
import 'package:mongo_dart/mongo_dart.dart';
import 'package:badone/mongodb_connection/mongoDbModel.dart';
import 'package:badone/mongodb_connection/constant.dart';
class MongoDatabase {
static var db, userCollection, reviewCollection;
static connect() async {
db = await Db.create(MONGO_CONN_URL);
await db.open();
inspect(db);
userCollection = db.collection(USER_COLLECTION);
reviewCollection = db.collection(REVIEW_COLLECTION);
}
static Future<List<Map<String, dynamic>>> getData() async {
Future<List<Map<String, dynamic>>> arrData = userCollection.find().toList();
return arrData;
}
static delete(MongoDbModel data) async {
try {
print("${data.id}");
await userCollection.deleteOne({"id": data.id});
print('deleted done');
} catch (e) {
print(e.toString());
}
}
static Future<void> insert(MongoDbModel data, ModelForData data2) async {
try {
userCollection.insertOne(data.toJson());
reviewCollection.insertOne(data2.toJson());
} catch (e) {
print(e.toString());
}
}
static Future<void> Update(String x, MongoDbModel data) async {
print(x);
userCollection.updateOne(
where.eq('id', x), modify.set('name', data.brandCompanyName));
userCollection.updateOne(
where.eq('id', x), modify.set('subject', data.productName));
userCollection.updateOne(
where.eq('id', x), modify.set('Grade', data.review));
}
}
mongoDbModel.dart
// To parse this JSON data, do
//
// final MongoDbModel = MongoDbModelFromJson(jsonString);
import 'dart:convert';
import 'package:mongo_dart/mongo_dart.dart';
MongoDbModel mongoDbModelFromJson(String str) =>
MongoDbModel.fromJson(json.decode(str));
String mongoDbModeltoJson(MongoDbModel data) => json.encode(data.toJson());
class MongoDbModel {
MongoDbModel({
required this.id,
required this.productName,
required this.brandCompanyName,
required this.review,
required this.rating,
//required this.gradeData,
});
String id;
String productName;
String brandCompanyName;
String review;
int rating;
//String gradeData;
factory MongoDbModel.fromJson(Map<String, dynamic> json) => MongoDbModel(
id: json["id"].toString(),
productName: json["name"],
brandCompanyName: json["subject"],
review: json["grade"],
rating: json["rating"]
// gradeData: json["GradeData"]
);
Map<String, dynamic> toJson() => {
"id": id,
"name": productName,
"subject": brandCompanyName,
"grade": review,
"rating": rating,
// "GradeData": gradeData
};
}
class ModelForData {
ModelForData({
required this.review,
required this.id,
});
String review;
String id;
factory ModelForData.fromJson(Map<String, dynamic> json) =>
ModelForData(review: json["review"], id: json["id"].toString());
Map<String, dynamic> toJson() => {"review": review, "id": id};
}
You should not make a direct connection to your MongoDB database from your flutter app. That is one too many connections from multiple users (assuming you have 1k+ downloads from app store).
I would recommend making your own Rest API or using mongoDB Data API (Rest API). If you do this, it will solve your issue stated above and reduce your database costs.
To further reduce server requests, you can cache results from the data api request using dio_http_cache and Realm (for complex cases).