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不会导致此问题。但是,我怀疑此解决方案,因为文档中说“子类重写此方法是不常见的。”