Flutter String Problem in equality comparison

0

Problem

This is my code in Flutter. As you can see, on line 33 the value of type is 'ngo' as is printed on line 34 using print statement. But, in the if block, the correct block does not get executed. I can't understand what's the issue. Please help.

main.dart

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/services.dart';
import 'package:xyz/homescreen.dart';
import 'package:xyz/ngo_details.dart';
import 'package:cloud_firestore/cloud_firestore.dart';

Future main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await SystemChrome.setPreferredOrientations([
    DeviceOrientation.portraitUp,
  ]);
  await SystemChrome.setEnabledSystemUIOverlays([]);
  var _homeWidget = await checkUserLogin();
  //Timer(Duration(seconds: 3), () {runApp(MyApp(rootWidget: _homeWidget));});
  runApp(MyApp(rootWidget: _homeWidget));
}

Future<Widget> checkUserLogin() async {
  final firestoreInstance = Firestore.instance;
  final curUser = await FirebaseAuth.instance.currentUser();
    if (curUser != null) {
      firestoreInstance
            .collection('users')
            .document(curUser.uid)
            .get()
            .then((value) {
          if (!value.exists) {
            FirebaseAuth.instance.signOut();
            return HomeScreen();
          } else {
            String type = value.data['type'];
            print(type);
            if (type == 'ngo') {
              return NGODetailsScreen(user: curUser);
            }
            else if (type =='user') {
              return NGODetailsScreen(user: curUser);
            }
          }
          print('no cases selected');
          return Container(color: Colors.yellow,);
        });
    } else {
      return HomeScreen();
    }
    print('return outer');
    return Container(color: Colors.red,);
  }

class MyApp extends StatelessWidget {
  final firestoreInstance = Firestore.instance;
  final rootWidget;
  MyApp({this.rootWidget});
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Charity for Everyone',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: rootWidget,
    );
  }
}

Output :

Expected results: NGODetailsScreen should be called after outputting 'ngo' on line 34

Actual results: Container with red background is executed even when line 34 outputs 'ngo'

Logs
PS D:\flutter\xyz> flutter run
Launching lib\main.dart on Redmi Note 4 in debug mode...
Running Gradle task 'assembleDebug'...                                  
Running Gradle task 'assembleDebug'... Done                        16.1s
√ Built build\app\outputs\apk\debug\app-debug.apk.
I/flutter (18833): return outer
W/DynamiteModule(18833): Local module descriptor class for providerinstaller not found.
I/DynamiteModule(18833): Considering local module providerinstaller:0 and remote module providerinstaller:0
W/ProviderInstaller(18833): Failed to load providerinstaller module: No acceptable module found. Local version is 0 and remote version is 0.
W/ResourceType(18833): No package identifier when getting name for resource number 0x00000000
V/NativeCrypto(18833): Registering com/google/android/gms/org/conscrypt/NativeCrypto's 286 native methods...
D/NetworkSecurityConfig(18833): No Network Security Config specified, using platform default
I/ProviderInstaller(18833): Installed default security provider GmsCore_OpenSSL
W/art     (18833): Before Android 4.1, method double java.util.concurrent.ThreadLocalRandom.internalNextDouble(double, double) would have incorrectly overridden the package-private method 
in java.util.Random
W/art     (18833): Before Android 4.1, method int java.util.concurrent.ThreadLocalRandom.internalNextInt(int, int) would have incorrectly overridden the package-private method in java.util.Random
W/art     (18833): Before Android 4.1, method long java.util.concurrent.ThreadLocalRandom.internalNextLong(long, long) would have incorrectly overridden the package-private method in java.util.Random
Syncing files to device Redmi Note 4...                          1,216ms

Flutter run key commands.
r Hot reload.
R Hot restart.
h Repeat this help message.
d Detach (terminate "flutter run" but leave application running).
c Clear the screen
q Quit (terminate the application on the device).
An Observatory debugger and profiler on Redmi Note 4 is available at: http://127.0.0.1:65500/s-e-dD_DnYk=/
I/flutter (18833): ngo

Application finished.
D:\flutter\xyz>flutter analyze
Analyzing xyz...
No issues found! (ran in 22.5s)

flutter
dart

1 Answer

0

Thanks @jamesdlin for pointing out the solution.

Basically I changed

firestoreInstance
            .collection('users')
            .document(curUser.uid)
            .get()
            .then((value)

to

var value = await firestoreInstance
            .collection('users')
            .document(curUser.uid)
            .get();

and it worked.

answered on Stack Overflow Jun 12, 2020 by Jayant Jeet Tomar

User contributions licensed under CC BY-SA 3.0