Ekspresi Boolean tidak boleh nol?
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
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
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?
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");
}
}
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;