调用 Statelesswidget 中的方法以获取启动画面?

Posted

技术标签:

【中文标题】调用 Statelesswidget 中的方法以获取启动画面?【英文标题】:Calling a method in Statelesswidget for splash screen? 【发布时间】:2020-06-03 13:11:21 【问题描述】:

我正在构建一个用于学习的天气应用程序,并且在应用程序开始时我想获取用户位置。闪屏是无状态的小部件,不做任何事情。当位置可用时,我想推送到另一个屏幕。

我可以做到,但这是正确的做法吗(请查看下面的代码)? 让我知道任何其他解决方案。

在从 build 方法返回小部件之前,我调用了 getLocation 方法。这是理想的做法吗?因为这个屏幕状态不会更新。

class LaunchScreen extends StatelessWidget 
  static const String id = 'launch_screen';

  void getLocation(BuildContext context) async 
    LocationData location = await LocationService().getCurrentLocation();
    if (location != null) 
      // Go to home
      print(location.latitude);
      print(location.longitude);
     else 
      // Error fetching location
    
  

  @override
  Widget build(BuildContext context) 
    getLocation(context);
    return Scaffold(
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Expanded(
            child: Container(),
          ),
          Center(
            child: Image(
              image: AssetImage('images/launch_screen/app_logo.png'),
            ),
          ),
          SizedBox(
            height: 8,
          ),
          Center(
            child: Shimmer.fromColors(
              baseColor: Colors.white.withOpacity(0.6),
              highlightColor: Colors.white,
              child: Text(
                'Forecasts',
                style: GoogleFonts.montserratAlternates(
                    textStyle:
                        TextStyle(fontSize: 60, fontWeight: FontWeight.w300),
                    color: Colors.white.withOpacity(0.6)),
              ),
            ),
          ),
          Expanded(
            child: Container(),
          ),
          Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text(
                'Made with ❤️ ',
                style: TextStyle(
                    fontSize: 12,
                    fontWeight: FontWeight.w300,
                    color: Colors.white.withOpacity(0.5)),
              ),
              Text(
                'Parth Adroja',
                style: TextStyle(
                    fontSize: 12,
                    fontWeight: FontWeight.w500,
                    color: Colors.white.withOpacity(0.5)),
              ),
            ],
          ),
          SizedBox(
            height: 20,
          )
        ],
      ),
    );
  

【问题讨论】:

【参考方案1】:

您可以使用FutureBuilder 来执行此操作。

喜欢:

Widget build(BuildContext context) 
    return FutureBuilder(
      initialData: null,
      future: getLocation(),
      builder: (context, snap)
        if(snap.hasData)
          return FullDataWidget(snap.data);
        else
          return SplashScreen();
        
      ,
    );
  

【讨论】:

FutureBuilder 很高兴知道。 当我收到想要导航到不同屏幕而不是显示 FullDataWidget 的位置时怎么办? FullDataWidget 这是我使用的通用名称。您可以在“返回”之前调用任何方法,包括“Navigator.push”,但是当状态管理开始变得复杂时,最好使用 StateFullWidget。 我问的原因是因为构建器需要返回一个小部件对吗?现在在此之前我推送它然后返回任何小部件没有任何意义,或者如果我可以返回 SplashScreen。但这没有意义。 我认为在显示 Splash 或 FullDataWidget(或您的 Home)时最好使用顶部 Widget 来管理。如果使用 SplashScreen 转到另一个页面,则需要使用 Navigator.pushReplacement 从 NAvigator 的 Stack 中排除 Splash,开始非常复杂。

以上是关于调用 Statelesswidget 中的方法以获取启动画面?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 StatelessWidget 中更改 StatefulWidget 的状态?

如何在 StatelessWidget 的任何函数中获取上下文?

如何从 StatelessWidget 中的 StatefulWidget 访问变量?

调度第一个 bloc 事件或 cubit 方法,在 StatelessWidget 内的页面开始

Flutter生命周期

Flutter 页面生命周期