Ekspresi Boolean tidak boleh nol?

Aug 31 2020

Apakah ada yang tahu mengapa saya mendapat pernyataan Gagal: ekspresi boolean tidak boleh null. Jika saya telah masuk dan keluar dari aplikasi dan membuka aplikasi lagi, saya akan langsung berada di layar beranda.

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}

class MyApp extends StatefulWidget {

  // This widget is the root of your application.
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {

  bool userIsLoggedIn = false;

  @override
  void initState(){
    getLoggedInState();
    super.initState();
  }

  getLoggedInState()async{
    await HelperFunction.getUserLoggedInSharedPreference().then((value){
      setState(() {
        userIsLoggedIn = value;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: userIsLoggedIn ? HomeScreen() : CompanyLoadingBar(),
    );
  }
}

Jawaban

2 galloper Aug 31 2020 at 10:37

Jika 'nilai' Anda di sini bisa menjadi nol - Anda mendapatkan kesalahan. Agar aman, ubah baris di dalam setState menjadi:

userIsLoggedIn = value ?? false; 

itu akan mengatur bool menjadi false jika nilainya null

nvoigt Aug 31 2020 at 10:47

Masalah Anda adalah Anda tidak menunggu Masa Depan Anda untuk diselesaikan dengan nilai yang sebenarnya.

Garis ini:

userIsLoggedIn = value;

mungkin tidak tercapai saat metode build Anda dipanggil. Karena itu asyncdan Anda tidak melakukannya await.

Anda dapat menetapkan nilai default menjadi userIsLoggedIn, mungkin false, itu akan segera menyelesaikan masalah Anda. Tetapi itu tidak akan menyelesaikan masalah Anda yang sebenarnya, bahwa logika program Anda tidak sinkron.

Anda mungkin ingin membangun aplikasi Anda dengan setidaknya satu aplikasi FutureBuilder.

Lihat: Apa itu Masa Depan dan bagaimana cara menggunakannya?

Benjamin Aug 31 2020 at 10:33

Masalah Anda kemungkinan besar terletak pada fungsi ini di mana Anda menyetel userIsLoggedInke null. Pastikan getUserLoggedInSharedPreferencebenar-benar mengembalikan boolean dan bukan nol.

  void getLoggedInState() async {
    final result = await HelperFunction.getUserLoggedInSharedPreference();
    if (result != null) {
      setState(() {
        userIsLoggedIn = result;
      });
    } else {
      print("result is null");
    }
  }
BambinoUA Sep 11 2020 at 08:07

Anda mengalami kesalahan pendekatan global. Anda menggabungkan traditionaldan async/awaitmetode dalam kode ini:

getLoggedInState()async{
    await HelperFunction.getUserLoggedInSharedPreference().then((value){
      setState(() {
        userIsLoggedIn = value;
      });
    });
  }

Jika Anda menggunakan async/awaitAnda tidak harus menggunakan thenmetode.

Untuk menerapkan apa yang Anda inginkan, Anda harus menggunakan sesuatu seperti ini:

...
@override
Widget build(BuildContext context) {
  return MaterialApp(
    debugShowCheckedModeBanner: false,
    home: FutureBuilder<bool>(
      future: HelperFunction.getUserLoggedInSharedPreference(),
      builder: (context,snapshot) {
        if (snapshot.hasData) {
          // Future is ready. Take data from snapshot
          userIsLoggedIn = snapshot.data; // bool value is here
          return userIsLoggedIn ? HomeScreen() : CompanyLoadingBar();
        } else {
          // Show progress while future will be completed
          return CircularProgressIndicator();
        }
      }
    ),
  );
}
...

Dan juga periksa dari mana nilai dikembalikan HelperFunction.getUserLoggedInSharedPreference(). Sepertinya itu kembali nullkarena saya pikir Anda tidak memiliki nilai yang sudah disimpan. Jadi, Anda perlu menentukan nilai default:

final value = await SharedPreferences.getInstance().readBool(name) ?? false;