57

我刚刚开始使用 Flutter,在运行代码时遇到了这个问题“引发了另一个异常:类型‘MyApp’不是‘StatelessWidget’类型的子类型”。有趣的是,我的代码中什至没有这个“StatelessWidget”。

   import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return _MyAppState();
  }
}

class _MyAppState extends State<MyApp> {
  List<String> _bars = ['Olivio bar'];
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
          appBar: AppBar(
            title: Text('Drinkzz'),
          ),
          body: Column(
            children: [
              Container(
                margin: EdgeInsets.all(10.0),
                child: RaisedButton(
                  onPressed: () {
                    _bars.add('Riviera Bar');
                  },
                  child: Text('Add new Bar!'),
                ),
              ),
              Column(
                children: _bars
                    .map((element) => Card(
                          child: Column(
                            children: <Widget>[
                              Image.asset('assets/olivio.jpg'),
                              Text(element)
                            ],
                          ),
                        ))
                    .toList(),
              )
            ],
          )),
    );
  }
}

我真的迷路了,希望能得到一些帮助!

谢谢,

4

6 回答 6

140

正如乔纳·威廉姆斯所说

如果MyApp从 a更改为StatelessWidgeta 则StatefulWidget需要热重启,因为它是在 main 中调用的

这已在实时编码会话中多次解释过,当您对函数等进行更改时initState(),您必须重新启动应用程序。类似的情况适用于您,当您更改 MyApp 小部件的状态相关属性时,您需要重新启动应用程序才能使这些更改生效。

基本上,当您热重载应用程序时,它会调用该build()函数, initState()仅在您重新启动应用程序时调用,以便应用程序重新启动所有内容,包括initState()您更改其功能的小部件。

于 2018-11-07T15:21:59.870 回答
12

您需要重新启动您的应用程序才能使更改生效。热重载此时不起作用

于 2019-12-17T08:45:43.270 回答
10

您需要使用 R (shift + r) 进行热重载,因为您在应用程序运行时将 MyApp 类从 StatelessWidget 更改为 StatefulWidget。

于 2020-02-06T07:15:56.067 回答
5

如果您需要更改 MyApp,那么在重新加载应用程序后您将无法获得结果。您必须重新启动您的应用程序,然后您可以检查您的编辑在应用程序上是否可用。

于 2020-04-07T12:29:21.123 回答
1

由于在代码开头使用了 StatelessWidget 并且后来更改为 StatefulWidget 您需要热重启。如果您不重新启动它,它将继续给出错误,因为最初它是在 main 中调用的

于 2021-11-26T13:32:52.387 回答
0

有一个简单的方法可以解决这个问题

在“MyApp”类之上创建一个类,并将其命名为您喜欢的任何名称,例如“RealApp”,但它是无状态的,并将“MyApp”有状态小部件放入其中,如下所示:

class RealApp extends StatelessWidget{
Widget build(Buildcontexr context){
@override
return MyApp();
}

关键是您不能在 runApp 函数中运行有状态小部件,但要解决此问题,请将有状态小部件放入无状态小部件中,您的问题就解决了。

于 2022-02-22T08:09:03.700 回答