gpt4 book ai didi

flutter - 实现authstatechanges后调用两次的类

转载 作者:行者123 更新时间:2023-12-03 03:49:32 25 4
gpt4 key购买 nike

在尝试实现用于管理用户 session 的authStateChanges.listen()之后,该类被调用了两次,并导致两个内容相同的警报对话框,我不知道发生了什么,为什么要调用两次。
main()函数:

Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
runApp(MaterialApp(home: EntryPoint(), debugShowCheckedModeBanner: false));
}
[编辑] EntryPoint类:
class EntryPoint extends StatefulWidget {
_EntryPointState createState() => _EntryPointState();
}

class _EntryPointState extends State<EntryPoint> {
// Set default `_initialized` and `_error` state to false
bool _initialized = false;
bool _error = false;
FirebaseApp firebaseApp;

// Define an async function to initialize FlutterFire
void initializeFlutterFire() async {
try {
// Wait for Firebase to initialize and set `_initialized` state to true
firebaseApp = await Firebase.initializeApp();
setState(() {
_initialized = true;
});
} catch (e) {
// Set `_error` state to true if Firebase initialization fails
setState(() {
_error = true;
});
}
FirebaseAuth.instance.authStateChanges().listen((User user) {
if (user == null) {
Navigator.push(context,
MaterialPageRoute(builder: (BuildContext context) => LoginPage()));
} else {
Navigator.push(context,
MaterialPageRoute(builder: (BuildContext context) => MyApp()));
print('ok');
}
});
}

@override
void initState() {
this.initializeFlutterFire();
super.initState();
}

@override
Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);

return _getLandingPage();
}
}
它在调试控制台中两次记录“确定”
Restarted application in 1,630ms.
D/ConnectivityManager(27325): unregisterNetworkCallback; CallingUid : 10392, CallingPid : 27325
D/ConnectivityManager(27325): unregisterNetworkCallback; CallingUid : 10392, CallingPid : 27325
W/example.confAp(27325): Accessing hidden method Ldalvik/system/CloseGuard;->close()V (light greylist, linking)
I/flutter (27325): ok
I/flutter (27325): ok
I/flutter (27325): IT IS CONNECTED BOYS
D/ConnectivityManager(27325): requestNetwork; CallingUid : 10392, CallingPid : 27325
W/DynamiteModule(27325): Local module descriptor class for providerinstaller not found.
I/flutter (27325): IT IS CONNECTED BOYS
I/DynamiteModule(27325): Considering local module providerinstaller:0 and remote module providerinstaller:0
W/ProviderInstaller(27325): Failed to load providerinstaller module: No acceptable module found. Local version is 0 and remote version is 0.
D/ConnectivityManager(27325): requestNetwork; CallingUid : 10392, CallingPid : 27325
编辑:添加了StreamBuilder
Widget _getLandingPage() {
return StreamBuilder<User>(
stream: FirebaseAuth.instance.authStateChanges(),
builder: (BuildContext context, snapshot) {
if (snapshot.hasData) {
return MyApp();
} else {
return LoginPage();
}
},
);
}

最佳答案

也许是在SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);方法中调用build的问题。尝试将其删除。
第二个问题似乎与initState中的调用方法有关。尝试使用StreamBuilder从Firebase监听Authentication changes。对StreamBuilder应用相同的逻辑。

关于flutter - 实现authstatechanges后调用两次的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64112725/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com