Xtr*_*evX 3 layout widget dart flutter
下面的代码可能看起来有点复杂,但基本上下面的函数使用 switch case 根据导航栏的索引号返回正确的小部件。我面临的问题是,当脚手架的主体必须根据导航栏的索引号获取正确的页面时,它告诉我不能使用 Widget 的类型来Future <Widget>
代替 Widget 的类型作为我的脚手架的身体。我预计会发生这种情况,但是我不知道如何添加等待关键字,以便该类型是有效的小部件。感谢您的帮助。附言。请参阅注释,它告诉我要在下面的代码中调用该函数的位置。
Future<Widget> getCorrespondingPage(int index) async {
bool isFromGoogleSignIn;
String displayName = await InformationFinder().getUserName(_auth);
String provider = await ProviderFinder().getProvider(_auth);
String profilePicture = await InformationFinder().getProfilePicture(_auth);
if (provider == 'Google') {
setState(() {
isFromGoogleSignIn = true;
});
} else {
setState(() {
isFromGoogleSignIn = false;
});
}
switch (index) {
case 0:
return SideBarLayoutStateful(
app: SmartVetScreen(),
isFromGoogleSignIn: isFromGoogleSignIn,
profilePicture: profilePicture,
displayName: displayName,
);
break;
case 1:
return SideBarLayoutStateful(
app: SmartReminderScreen(),
isFromGoogleSignIn: isFromGoogleSignIn,
profilePicture: profilePicture,
displayName: displayName,
);
default:
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我完成的有状态小部件:
class _NavigationBarScreenState extends State<NavigationBarScreen> {
int currentIndex = 0;
//THIS IS WHERE THE ABOVE FUNCTION WAS CREATED
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
bottomNavigationBar: BottomNavigationBar(
currentIndex: currentIndex,
type: BottomNavigationBarType.shifting,
iconSize: 27.0,
elevation: 10.0,
selectedFontSize: 18.0,
unselectedFontSize: 15.0,
items: [
BottomNavigationBarItem(
icon: Icon(FontAwesomeIcons.stethoscope),
title: Text('Smart Vet'),
backgroundColor: Colors.green.shade200,
),
BottomNavigationBarItem(
icon: Icon(FontAwesomeIcons.bell),
title: Text('Smart Remind'),
backgroundColor: Colors.purple.shade100,
),
],
onTap: (index) {
setState(() {
currentIndex = index;
});
},
),
//THIS IS WHERE I NEED TO GET BACK THE WIDGET FROM THE getCorrespondingPage() method
body: ,
),
);
}
}
Run Code Online (Sandbox Code Playgroud)
小智 6
还需等待期货。在您的情况下,您在渲染过程中使用未来,并且由于未来位于小部件树的中间,因此当您等待未来时该过程已经开始,因此您必须等待未来使用一些特殊方法的部件树。你可以用FutureBuilder它。
将数据获取和小部件渲染分开,并使用FutureBuilder等待Future.
Future<Map<String, String>> getData() async {
String displayName = await InformationFinder().getUserName(_auth);
String provider = await ProviderFinder().getProvider(_auth);
String profilePicture = await InformationFinder().getProfilePicture(_auth);
return {
'displayName': displayName,
'provider': provider,
'profilePicture': profilePicture
};
}
Widget getCorrespondingPage(int index) {
return FutureBuilder<Map<String, String>>(
future: getData,
builder: (context, snapshot) {
if (snapshot.hasData) {
final displayName = snapshot.data['displayName'];
final provider = snapshot.data['provider'];
final profilePicture = snapshot.data['profilePicture'];
bool isFromGoogleSignIn = provider == 'google';
switch (index) {
case 0:
return SideBarLayoutStateful(
app: SmartVetScreen(),
isFromGoogleSignIn: isFromGoogleSignIn,
profilePicture: profilePicture,
displayName: displayName,
);
break;
case 1:
return SideBarLayoutStateful(
app: SmartReminderScreen(),
isFromGoogleSignIn: isFromGoogleSignIn,
profilePicture: profilePicture,
displayName: displayName,
);
default:
return null;
}
}
},
);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3721 次 |
| 最近记录: |