上下文:
我正在用azure广告构建一个简单的登录应用程序,该应用程序可以很好地登录并获取令牌,然后很好地重定向到下一页,但是在重定向之前会引发错误
错误:
在构建器Builder(dirty, 依赖项:[MediaQuery]):类型'Future'不是以下类型的子类型 输入“小部件”
相关的引起错误的小部件是:Builder 文件:/// D:/Projects/flutter/aims_mobile/lib/screens/authentication/signin.dart:101:17 引发异常时,这是堆栈: #0 _SignInState.build。 (package:aims_mobile / screens / authentication / signin.dart:133:25) #1 Builder.build(package:flutter / src / widgets / basic.dart:7185:48) #2 StatelessElement.build(package:flutter / src / widgets / framework.dart:4749:28) #3 ComponentElement.performRebuild(package:flutter / src / widgets / framework.dart:4675:15) #4 Element.rebuild(package:flutter / src / widgets / framework.dart:4369:5)
代码
class _SignInState extends State<SignIn> {
static const String SCOPE ='';
static const String TENANT_ID = 'organizations';
static String authority = "";
MsalMobile msal;
bool isSignedIn = false;
@override
void initState() {
super.initState();
MsalMobile.create('assets/auth_config.json', authority).then((client) {
setState(() {
msal = client;
});
refreshSignedInStatus();
});
}
/// Updates the signed in state
refreshSignedInStatus() {
msal.getSignedIn().then((loggedIn) {
print('refreshing');
setState(() {
isSignedIn = loggedIn;
});
});
}
/// Signs a user in
handleSignIn() async {
await msal.signIn(null, [SCOPE]).then((result) {
refreshSignedInStatus();
}).catchError((exception) {
if (exception is MsalMobileException) {
logMsalMobileError(exception);
} else {
final ex = exception as Exception;
print('exception occurred');
print(ex.toString());
}
});
}
logMsalMobileError(MsalMobileException exception) {
print('${exception.errorCode}: ${exception.message}');
if (exception.innerException != null) {
print(
'inner exception = ${exception.innerException.errorCode}: ${exception.innerException.message}');
}
}
/// Signs a user out.
handleSignOut() async {
try {
print('signing out');
await msal.signOut();
print('signout done');
refreshSignedInStatus();
} on MsalMobileException catch (exception) {
logMsalMobileError(exception);
}
}
/// Gets the current and prior accounts.
handleGetAccount() async {
await msal.getAccount().then((result) {
if (result.currentAccount != null) {
print('current account id: ${result.currentAccount.id}');
print('current account id: ${result.currentAccount.username}');
} else {
print('no account found');
}
}).catchError((exception) {
if (exception is MsalMobileException) {
logMsalMobileError(exception);
} else {
print('exception occurred');
}
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: new Scaffold(
body: Builder(
builder: (context) => Stack(
fit: StackFit.expand,
children: <Widget>[
Container(
width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.height,
child: Image.asset('assets/landing.webp',
fit: BoxFit.fill,
color: Color.fromRGBO(255, 255, 255, 0.6),
colorBlendMode: BlendMode.modulate),
),
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
SizedBox(height: 10.0),
Container(
width: 130.0,
child: Align(
alignment: Alignment.center,
child: RaisedButton(
shape: RoundedRectangleBorder(
borderRadius: new BorderRadius.circular(30.0)),
color: Color(0xffffffff),
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
isSignedIn
? Future.delayed(Duration.zero, () {
Navigator.of(context).pushReplacement(
MaterialPageRoute(
builder: (context) => NavScreen()));
})
: RaisedButton(
child: Text("Sign In"),
onPressed: handleSignIn,
),
],
),
)),
)
],
),
],
),
),
));
}
}
我不知道如何解决这个问题
答案 0 :(得分:1)
您传递的是函数Future
而不是Widget
,这会导致此错误。
isSignedIn
? Future.delayed(Duration.zero, () { // <---- This is not a widget
Navigator.of(context).pushReplacement(
MaterialPageRoute(
builder: (context) => NavScreen()));
})
: RaisedButton(
child: Text("Sign In"),
onPressed: handleSignIn,
),
您可以使用Visibility
小部件来隐藏/显示“登录”按钮,而使用bool isSignedIn
,可以处理导航代码。
Visibility(
visible: !isSignedIn,
child: RaisedButton(
child: Text("Sign In"),
onPressed: handleSignIn,
),
),
您应该在initState
的{{1}}方法内处理导航,如下所示:
StatefulWidget