如何从两次构建的小部件中重定向延迟

时间:2019-02-20 21:29:58

标签: flutter

在我的应用程序的启动屏幕上,我正在使用.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()小部件。

有没有一种解决方法(解决这里的一个有状态的小部件,“记住”最初发布的重定向并抑制第二个重定向)来解决这个问题?

注意::我需要在函数中进行重定向,以便动态分配辅助路由(为简单起见,在示例中仅进行了硬编码)。

1 个答案:

答案 0 :(得分:2)

第一次创建窗口小部件时,如果我需要做一次操作,通常会使其成为有状态的窗口小部件,并通过initState方法进行一次调用。

AnnotatedRegion设置系统叠加层的方式可能有用:

new AnnotatedRegion<SystemUiOverlayStyle>(
  value: SystemUiOverlayStyle.light.copyWith(
    statusBarColor: Colors.black,
  ),
  child: ....,
);