我有一个启动屏幕,该屏幕从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');
}
}
}
尝试此
首先让您的班级 Statefulwidget
@override
void initState() {
onStart();
}
void onStart() async {
await getMenuConfiguration(); //load your data here
Navigator.push(); //push to next screen
}
的确,要保持简单,您只需使用一个状态的小部件[FutureBuilder]这是一个状态fulwidget]。
我有一个看起来像这样的加载屏幕
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(lisation.zero(,因为出于某种原因,如果checkcredentials是同步的; _;,oh,oh,并且Initstate可以访问上下文:d