runApp引发有状态小部件异常

时间:2019-02-03 15:42:02

标签: dart flutter

我是新手,我正在学习在应用程序中添加启动画面,然后转到新页面。我在项目中添加了一个依赖闪屏:因为我是新手,所以我不怎么实现启动画面,当我搜索时,我得到了向项目添加依赖项的解决方案。

当我尝试运行我的应用程序时,出现以下错误。

 I/flutter (28504): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY 
 ╞═══════════════════════════════════════════════════════════
 I/flutter (28504): The following assertion was thrown building 
 SplashScreen(state: _SplashScreenState#6edd2):
 I/flutter (28504): MediaQuery.of() called with a context that does not 
 contain a MediaQuery.
 I/flutter (28504): No MediaQuery ancestor could be found starting from the 
 context that was passed to MediaQuery.of().
 I/flutter (28504): This can happen because you do not have a WidgetsApp or 
 MaterialApp widget (those widgets introduce
 I/flutter (28504): a MediaQuery), or it can happen if the context you use 
 comes from a widget above those widgets.
 I/flutter (28504): The context used was:
 I/flutter (28504):   Scaffold(dirty, state: ScaffoldState#a8879(lifecycle 
 state: initialized, tickers: tracking 1
 I/flutter (28504):   ticker))

这是我的pubspec.yaml

name: bmi_calculator
description: A flutter application for knowing you BMI.

version: 1.0.0+1

environment:
   sdk: ">=2.1.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter
  splashscreen:
  cupertino_icons: ^0.1.2

dev_dependencies:
  flutter_test:
    sdk: flutter

flutter:
    uses-material-design: true

我的main.dart

 import 'package:flutter/material.dart';
 import 'package:splashscreen/splashscreen.dart';
 import 'package:bmi_calculator/BmiPage.dart';

 main(){
     runApp(BmiCalculator());
 }
 class BmiCalculator extends StatefulWidget{
    @override
    State<StatefulWidget> createState() {
       return BmiCalculatorstate();
    }
 }
 class BmiCalculatorstate extends State<BmiCalculator>{
     @override
     Widget build(BuildContext context) {
         return new SplashScreen(
            seconds: 10,
            navigateAfterSeconds: new BmiPage(),
            title: Text("Welcome to BMI CALCULATOR",
               style: new TextStyle(
                  fontWeight: FontWeight.bold,
                  fontSize: 10.0,
                  color: Colors.white
               ),
            ),
           backgroundColor: Colors.red,
       );
    }
 }

这是我的BmiPage.dart

 import 'package:flutter/material.dart';

 class BmiPage extends StatefulWidget{
    @override
    State<StatefulWidget> createState() {
       return BmiPageState();
    }
 }
 class BmiPageState extends State<BmiPage>{
     @override
     Widget build(BuildContext context) {
         return MaterialApp(
           home: Scaffold(
             appBar: new AppBar(
                title: Text(
                  'BMI CALCULATOR',
                   style: new TextStyle(
                   color: Colors.white
             ),
         ),
         backgroundColor: Colors.red,
      ),
    ),
  );
 }
}

为什么会出现此错误,我该如何解决?

谢谢。

1 个答案:

答案 0 :(得分:0)

您的错误实际上是由于您没有有效的上下文而导致的,因为已知的框架问题可能会在以后的更新中修复,在该更新中您实际上需要在runApp()方法中使用无状态小组件,然后,以无状态的BMICaculator()方法返回您的build

runApp(MyApp());

class MyApp extends StatelessWidget {

void build(BuildContext context)=> MaterialApp(home: BMICalculator());

} 

此外,您实际上不需要插件即可向应用程序添加启动屏幕。 “启动画面”有两种类型:

  1. 通常在按下应用程序图标时,您会短暂看到直到实际加载引擎和第一个屏幕为止的内容;

  2. 一个自定义启动屏幕,您可以在其中从API提取一些数据或执行在第一个屏幕之前实际需要的一些操作。该插件更适合这种情况。

我建议您阅读this article,该指南逐步介绍了如何向应用程序添加启动画面(案例1)