Flutter 颤振中的异步函数不返回null
我正在尝试检查用户的登录名。但是,即使返回null,checklogin()在if条件下也不等于nullFlutter 颤振中的异步函数不返回null,flutter,dart,Flutter,Dart,我正在尝试检查用户的登录名。但是,即使返回null,checklogin()在if条件下也不等于null class HomeScreen extends StatelessWidget { @override Widget build(BuildContext context) { if(checkLogin() == null) { return Login(); } else { return
class HomeScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
if(checkLogin() == null) {
return Login();
} else {
return Dashboard();
}
}
Future<String> checkLogin() async {
var prefs = await SharedPreferences.getInstance();
var key = 'Token';
var value = prefs.getString(key);
print(value);
return value;
}
}
类主屏幕扩展小部件{
@凌驾
小部件构建(构建上下文){
if(checkLogin()==null){
返回登录名();
}否则{
返回仪表板();
}
}
Future checkLogin()异步{
var prefs=await SharedPreferences.getInstance();
var key='Token';
var value=prefs.getString(键);
印刷品(价值);
返回值;
}
}
我刚刚使用了一个future builder,它管理通过AsyncSnapshot从future返回的数据
class HomeScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: checkLogin(),
builder: (BuildContext context, AsyncSnapshot snapshot){
if (snapshot.hasData){
var value = snapshot.data;
if(value == null){
return Login();
}else{
return Dashboard();
}
}else return Dashboard();
}
);
}
Future<String> checkLogin() async {
var prefs = await SharedPreferences.getInstance();
var key = 'Token';
var value = prefs.getString(key);
print(value);
return value;
}
}
类主屏幕扩展小部件{
@凌驾
小部件构建(构建上下文){
回归未来建设者(
future:checkLogin(),
生成器:(BuildContext上下文,异步快照){
if(snapshot.hasData){
var值=snapshot.data;
如果(值==null){
返回登录名();
}否则{
返回仪表板();
}
}else返回仪表板();
}
);
}
Future checkLogin()异步{
var prefs=await SharedPreferences.getInstance();
var key='Token';
var value=prefs.getString(键);
印刷品(价值);
返回值;
}
}
我刚刚使用了一个future builder,它管理通过AsyncSnapshot从future返回的数据
class HomeScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: checkLogin(),
builder: (BuildContext context, AsyncSnapshot snapshot){
if (snapshot.hasData){
var value = snapshot.data;
if(value == null){
return Login();
}else{
return Dashboard();
}
}else return Dashboard();
}
);
}
Future<String> checkLogin() async {
var prefs = await SharedPreferences.getInstance();
var key = 'Token';
var value = prefs.getString(key);
print(value);
return value;
}
}
类主屏幕扩展小部件{
@凌驾
小部件构建(构建上下文){
回归未来建设者(
future:checkLogin(),
生成器:(BuildContext上下文,异步快照){
if(snapshot.hasData){
var值=snapshot.data;
如果(值==null){
返回登录名();
}否则{
返回仪表板();
}
}else返回仪表板();
}
);
}
Future checkLogin()异步{
var prefs=await SharedPreferences.getInstance();
var key='Token';
var value=prefs.getString(键);
印刷品(价值);
返回值;
}
}
问题是,checkLogin
函数是异步的,并返回您将等待的未来,您将直接在构建中等待
因此,这里有一个更好、正确的实现。
``
类主页扩展StatefulWidget{
@凌驾
_HomePageState createState()=>\u HomePageState();
}
类_HomePageState扩展状态{
bool-isLogin=false;
@凌驾
void initState(){
checkLogin();
super.initState();
}
checkLogin()异步{
var prefs=await SharedPreferences.getInstance();
var key='Token';
var值=prefs.getString(键)??错误;
setState((){isLogin=value;});
}
@凌驾
小部件构建(构建上下文){
返回isLogin?Login():Dashboard();
}
}
``问题是,
checkLogin
函数是异步的,并返回将来,您需要等待,并直接在构建中等待
因此,这里有一个更好、正确的实现。
``
类主页扩展StatefulWidget{
@凌驾
_HomePageState createState()=>\u HomePageState();
}
类_HomePageState扩展状态{
bool-isLogin=false;
@凌驾
void initState(){
checkLogin();
super.initState();
}
checkLogin()异步{
var prefs=await SharedPreferences.getInstance();
var key='Token';
var值=prefs.getString(键)??错误;
setState((){isLogin=value;});
}
@凌驾
小部件构建(构建上下文){
返回isLogin?Login():Dashboard();
}
}
``查看我的更新,它可能有语法错误,我刚刚写在这里,它给出了一个错误,构建函数返回null。我注意到它刚刚从构建中直接返回,在这种情况下,您必须使用FutureBuilder。我现在就要写代码了。还有其他方法不能从构建中返回吗?你可以使用IndexedStack,它只显示一个页面,包含多个页面作为堆栈,如果你改变索引,你就改变页面。然后,直到您的数据加载显示任何您想要的内容,例如居中加载屏幕,然后当数据加载完成时,您更改状态,堆栈索引将返回到您想要的页面,现在这个问题是构建需要显示一些内容,直到它等待将来返回。查看我的更新,它可能有语法错误,我只是写在这里,它给出了一个错误,构建函数返回null。我注意到它刚刚从构建中直接返回,在这种情况下,您将不得不使用FutureBuilder。我现在就要写代码了。还有其他方法不能从构建中返回吗?你可以使用IndexedStack,它只显示一个页面,包含多个页面作为堆栈,如果你改变索引,你就改变页面。然后,直到您的数据加载显示任何您想要的内容,如居中加载屏幕,然后当数据加载完成时,您更改状态,堆栈的索引将返回到您想要的页面,现在这个问题是构建需要显示一些内容,直到它等待将来返回。更新了答案。现在检查。更新答案。现在检查一下。