In my flutter app when I turn off my internet it crashes with some exception. It does not work even after internet is turned on

412 Views Asked by At

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. Exception

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};
}
1

There are 1 best solutions below

0
Georgina On

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).