在我的应用程序的启动屏幕上,我正在使用.home-articles
设置状态栏的颜色,并发出延迟的重定向到主屏幕:
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")),);
}
}
似乎会导致小部件重建,这将触发两次延迟,这将导致两次重定向。当然,这会导致有关上下文访问冲突的异常(即使没有此异常,也将不必要地两次构建setSystemUIOverlayStyle()
小部件。
有没有一种解决方法(解决这里的一个有状态的小部件,“记住”最初发布的重定向并抑制第二个重定向)来解决这个问题?
注意::我需要在函数中进行重定向,以便动态分配辅助路由(为简单起见,在示例中仅进行了硬编码)。
答案 0 :(得分:2)
第一次创建窗口小部件时,如果我需要做一次操作,通常会使其成为有状态的窗口小部件,并通过initState
方法进行一次调用。
AnnotatedRegion设置系统叠加层的方式可能有用:
new AnnotatedRegion<SystemUiOverlayStyle>(
value: SystemUiOverlayStyle.light.copyWith(
statusBarColor: Colors.black,
),
child: ....,
);