Flutter 列表视图

创建一个 Home Widget 来表示 App Widget 的 MaterialApp Widget 的 home 内容:

即拆分如下:

class App extends StatelessWidget {
    @override
    Widget build(BuildContext context) {
        return MaterialApp(
          home: Home(),
          theme: ThemeData(
            primaryColor: Colors.orange
          ),
        );
    }
}

class Home extends StatelessWidget {
  @override
    Widget build(BuildContext context) {
      return Scaffold(
            appBar: AppBar(
              title: Text('Muzico'),
              elevation: 0.0,
            ),
            body: Hello(),
          );
    }
}

现在我们不需要管 App 类了,将在 Home 类里面处理接下来的内容。

创建 ListView

下面我们通过 ListView.builder 来创建 ListView。

ListView.builder 有两个属性必须要有值才能创建成功的。

itemCount,代表有多少个item对象。
itemCount的构造体为 {int itemBuilder},这表示,我们返回 int 类型的值就可以了。 

itemBuilder,构建item 的内容。
itemBuilder的构造体为 {(BuildContext, int) → Widget itemBuilder},这表示,我们要返回Widget 类型,并且通过类似 iOS 的block 处理的。

结合之前的 Post.dart 数据内容,写下以下代码:

ListView.builder(
    itemCount: posts.length,
    itemBuilder: (BuildContext context, int index) {
        return Text(posts[index].title);
    },
),

代替 Hello(),完整代码为:

class Home extends StatelessWidget {
  @override
    Widget build(BuildContext context) {
      return Scaffold(
            appBar: AppBar(
              title: Text('Muzico'),
              elevation: 0.0,
            ),
            body: ListView.builder(
              itemCount: posts.length,
              itemBuilder: (BuildContext context, int index) {
                return Text(posts[index].title);
              },
            ),
          );
    }
}

4AB10870-8C5D-4738-8BD7-EDEDDA22CCBA

简单的列表就这样实现了。

除了上面实现定义Item的写法外,还有如下的写法:

class Home extends StatelessWidget {
  Widget _listItemBuilder(BuildContext context, int index) {
    return Text(posts[index].title);
  }
  @override
    Widget build(BuildContext context) {
      return Scaffold(
            appBar: AppBar(
              title: Text('Muzico'),
              elevation: 0.0,
            ),
            body: ListView.builder(
              itemCount: posts.length,
              itemBuilder: _listItemBuilder,
            ),
          );
    }
}

效果一致,不过这种写法更加方便切割管理、替换。