我有一个启动屏幕,可以从api获取数据。我希望在获取数据时该屏幕处于活动状态(它包含一个进度进度小部件),但是一旦获取数据,我就必须推送一条新的路径才能转到下一个屏幕。
我一直在与futurebuilder玩耍,但这似乎不是正确的小部件,因为在获取数据时我不想构建任何东西(至少在此屏幕中如此)。我只想将其保留为全局状态数据并继续前进。
在颤抖中完成此操作的最佳方法是什么?
这就是我现在拥有的:
class SplashScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Guid Template test"),
),
body: Container(
child: Center(
child: FutureBuilder(
future: getMenuConfiguration(),
builder: (builderContext, snapShot) {
//Here I would like to move to next screen, but this seems off because this is a builder method. Doesn't seem best option just a hack.
return Container();
},
)
),
));
}
Future<String> getMenuConfiguration() async
{
String url = "https://...";
http.Response response = await http.get(url);
if (response.statusCode == 200) {
var m = json.decode(response.body);
MenuModel.fromJson(m);
}
else {
throw Exception('Failed to load post');
}
}
}
答案 0 :(得分:1)
尝试一下
首先将您的课程设为 StateFulWidget
@override
void initState() {
onStart();
}
void onStart() async {
await getMenuConfiguration(); //load your data here
Navigator.push(); //push to next screen
}
答案 1 :(得分:1)
事实上,为简单起见,您只需要使用一个有状态的小部件[futurebuilder这是一个有状态的小部件]。
我有一个看起来像这样的加载屏幕
class LoadingScreen extends StatefulWidget {
@override
_LoadingScreenState createState() => _LoadingScreenState();
}
class _LoadingScreenState extends State<LoadingScreen> {
@override
void initState() {
super.initState();
Future.delayed(Duration.zero, () {
checkCredentials(context);
}
checkCredentials(context) async {
var test = await yourFunction();
Navigator.of(context).pushReplacementNamed('/Page.Tabs');
}
@override
Widget build(BuildContext context) {
return SizedBox();
}
}
我使用Future.delayed(Duration.zero,因为由于某些原因,如果checkCredentials是sync; _;哦,并且initState可以访问上下文:D
,它会崩溃