【问题标题】:Not able to navigate to a new screen in flutter无法在颤动中导航到新屏幕
【发布时间】:2020-02-08 03:41:36
【问题描述】:

我试图在初始屏幕之后导航到新屏幕,当我尝试在 init 方法中导航到新屏幕时它显示错误,

E/flutter (5636): [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] 未处理的异常:使用不包含导航器的上下文请求导航器操作。

E/flutter (5636):用于从 Navigator 推送或弹出路由的上下文必须是作为 Navigator 小部件后代的小部件的上下文。

我的代码

import 'package:flutter/material.dart';
import 'package:igloled_app/home.dart';
import 'dart:async';

class SplashScreen extends StatefulWidget {
  @override
  _SplashScreenState createState() => _SplashScreenState();

}

class _SplashScreenState extends State<SplashScreen> {

  @override
  void initState() {
    super.initState();
      Future.delayed(Duration(seconds: 3),(){
        print('3 sec done');
        Navigator.push(context, MaterialPageRoute(builder: (context){
          return AppHeader();
        }));
      });


  }
  
  
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Stack(
          fit: StackFit.expand,
          children: <Widget>[
            Container(
              decoration: BoxDecoration(
                color: Colors.white70,
              ),
            ),
            Column(
              mainAxisAlignment: MainAxisAlignment.start,
              children: <Widget>[
                Expanded(flex: 2,
                    child: Container(
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: <Widget>[
                      Padding(
                        padding: const EdgeInsets.all(20.0),
                        child: Container(
                          margin: EdgeInsets.all(10.0),
                           child: Image.asset('images/splash_logo.png')
                        ),
                      )
                    ],
                  ),
                    ),
                ),
                Expanded(flex: 1,
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                    CircularProgressIndicator(valueColor: AlwaysStoppedAnimation<Color>(Colors.green),),
                    Padding(padding: EdgeInsets.only(top: 20.0),
                    ),
                    Text('Make Your Life Brighter',
                      style: TextStyle(
                        color: Colors.lightGreen,
                        fontStyle: FontStyle.italic,
                        fontSize: 20.0,
                      ),
                    ),
                  ],
                ),
                )
              ],
            ),
          ],
        ),
      ),
    );
  }
}



  }

谁能帮我解决这个问题。 提前谢谢你。

【问题讨论】:

  • 请张贴您使用initState的课程的完整代码
  • @CopsOnRoad 更新了我的问题。
  • 我刚刚运行了你的代码,看起来不错,我可以导航到第二个屏幕。
  • 你能把AppHeader班级的代码也贴出来吗?
  • @CopsOnRoad 感谢您的代码,我也需要将 MaterialApp 添加到我的第一个屏幕。

标签: flutter flutter-layout


【解决方案1】:

这是一个正确方法的示例代码。

void main() => runApp(MaterialApp(home: FirstScreen()));

class FirstScreen extends StatefulWidget {
  @override
  _FirstScreenState createState() => _FirstScreenState();
}

class _FirstScreenState extends State<FirstScreen> {
  @override
  void initState() {
    super.initState();
    Future.delayed(Duration(seconds: 3), () {
      print('3 sec done');
      Navigator.push(context, MaterialPageRoute(builder: (context) {
        return SecondScreen();
      }));
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(appBar: AppBar(title: Text("First screen")));
  }
}

class SecondScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(appBar: AppBar(title: Text("Second screen")));
  }
}

【讨论】:

    【解决方案2】:

    您的MaterialApp 不在您的上下文中!!

    MaterialApp 移动到runApp 方法的小修正。

    但请注意,所有不会使用 setState 到另一个类或 runApp 方法的地下小部件,以使您的代码具有最佳功能。

    【讨论】:

      猜你喜欢
      • 2021-03-06
      • 1970-01-01
      • 2021-07-13
      • 2020-10-10
      • 1970-01-01
      • 2018-10-05
      • 2020-05-31
      • 2021-03-28
      • 2019-06-07
      相关资源
      最近更新 更多