Flutter 如何从构建两次的小部件中重定向延迟
在我的应用程序的启动屏幕上,我正在使用Flutter 如何从构建两次的小部件中重定向延迟,flutter,Flutter,在我的应用程序的启动屏幕上,我正在使用SystemChrome设置状态栏的颜色,并向主屏幕发出延迟重定向: import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; void main() { runApp(App()); } class App extends StatelessWidget { @override Widget build(BuildContext conte
SystemChrome
设置状态栏的颜色,并向主屏幕发出延迟重定向:
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
void main() {
runApp(App());
}
class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData.light(),
title: 'App',
routes: {'/': (context) => First(),
'/2': (context) => Second()},
);
}
}
class First extends StatelessWidget {
Future<void> _navigateToFollowUpRoute(BuildContext context) async {
Future.delayed(Duration(seconds: 2), () => Navigator.of(context).pushReplacementNamed('/2'));
}
@override
Widget build(BuildContext context) {
SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.light.copyWith(
statusBarColor: Colors.black,
));
print('building first');
_navigateToFollowUpRoute(context);
return Scaffold(
body: Center(child: Text("go")),
);
}
}
class Second extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(body: Center(child: Text("second")),);
}
}
导入“包装:颤振/材料.省道”;
导入“包:flifter/services.dart”;
void main(){
runApp(App());
}
类应用程序扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
主题:ThemeData.light(),
标题:“应用程序”,
路由:{'/':(上下文)=>First(),
“/2”:(上下文)=>Second()},
);
}
}
类优先扩展无状态小部件{
Future _NavigateToFollowUroute(构建上下文上下文)异步{
Future.delayed(持续时间(秒:2),()=>Navigator.of(context.pushreplacementname('/2'));
}
@凌驾
小部件构建(构建上下文){
SystemChrome.SetSystemTimeIOVerlayStyle(SystemUiOverlayStyle.light.copyWith(
statusBarColor:Colors.black,
));
打印(“建筑优先”);
_navigateToFollowUpRoute(上下文);
返回脚手架(
正文:居中(子项:文本(“go”),
);
}
}
第二类扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回脚手架(主体:中心(子项:文本(“第二”),);
}
}
调用setSystemTimeOverlayStyle()
似乎会导致小部件重建,这会触发延迟两次,从而导致重定向被调用两次。当然,这会导致违反上下文访问的异常(即使没有上下文访问,也会不必要地构建两次Second
小部件)
有没有一种非黑客方式(这里考虑一个有状态的小部件,“记住”最初发出的重定向并抑制第二个重定向)来解决这个问题
注意:我需要从函数内部进行重定向,以便动态分配次要路由(为了简单起见,示例中仅采用硬编码).当我第一次创建小部件时需要执行一次操作时,我通常会将其制作成一个有状态的小部件,并从
initState
方法执行一次性调用
另一个可能有用的方法是设置系统覆盖的AnnotatedRegion方法:
new AnnotatedRegion<SystemUiOverlayStyle>(
value: SystemUiOverlayStyle.light.copyWith(
statusBarColor: Colors.black,
),
child: ....,
);
newannotatedRegion(
值:SystemUIOverlyStyle.light.copyWith(
statusBarColor:Colors.black,
),
孩子:。。。。,
);
当我需要在小部件第一次创建时执行一次操作时,我通常会将其制作成一个有状态的小部件,并从initState
方法执行一次性调用
另一个可能有用的方法是设置系统覆盖的AnnotatedRegion方法:
new AnnotatedRegion<SystemUiOverlayStyle>(
value: SystemUiOverlayStyle.light.copyWith(
statusBarColor: Colors.black,
),
child: ....,
);
newannotatedRegion(
值:SystemUIOverlyStyle.light.copyWith(
statusBarColor:Colors.black,
),
孩子:。。。。,
);
在createElement()中使用SystemChrome API不会导致此问题。但是,我怀疑此解决方案,因为文档中指出“子类重写此方法是不常见的。”在createElement()中使用SystemChrome API
override不会导致此问题。但是,我怀疑此解决方案,因为文档中说“子类重写此方法是不常见的。”