调用无状态类构建实例与有状态类构建实例

时间:2018-08-27 06:10:54

标签: dart flutter

与无状态类相比,我注意到在调用有状态类时有所不同。

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Material App Title',
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
          appBar: AppBar(
            title: "Title"
          ),
          body: ListView(
          children: [
            Container(
              height: 300.0,
              child: ItemListState()._buildItemsList(),
            )
          ],
        )),
    );
  }
}

在上面的示例中,如果类是有状态的(ItemListState()),我需要调用ItemListState().buildItemsList()(该方法返回我构建的ListView。)

如果该类是无状态的,我可以调用ItemListState()(build方法返回相同的ListView)

为什么可以使用从无状态类的构建中返回的内容,而不使用有状态的类?我怀疑是因为该框架无法确定何时调用build或类似的东西。

尝试使用有状态类的构建函数返回我的listView The argument type 'ItemListState' can't be assigned to the parameter type 'Widget'

时出现错误

1 个答案:

答案 0 :(得分:2)

调用StatefulStateless小部件时没有区别,两个类都具有build方法,因此在两种情况下都必须使用有状态或无状态的构造函数,而不是构造函数State类中的一个。

  class MyApp extends StatelessWidget {
    @override
    Widget build(BuildContext context) {
      return new MaterialApp(
        title: 'Material App Title',
        theme: new ThemeData(
          primarySwatch: Colors.blue,
        ),
        home: Scaffold(
            appBar: AppBar(
              title: "Title"
            ),
            body: ListView(
            children: [
              Container(
                height: 300.0,
                child: ItemList(),
              )
            ],
          )),
      );
    }
  }

如果您使用的是Stateful

    class ItemList extends StatefulWidget {
      @override
      ItemListState createState() => ItemListState();
    }

    class ItemListState extends State<ItemList> {

      _buildItemsList(){
        return Container();
      }

      @override
      Widget build(BuildContext context) {
        return _buildItemsList();
      }
    }

如果您使用的是Stateless

  class ItemList extends StatelessWidget {
   _buildItemsList(){
      return Container();
    }

    @override
    Widget build(BuildContext context) {
      return _buildItemsList();
    }
  }