[Flutter] 列表数据的使用和 widget 封装

2020-08-05  本文已影响0人  BudSwift

1. 使用列表

列表的原理是利用 Column 展示一个数组中的数据,其过程是:

data.map((item) => SomeWidget(item)).toList();

注意 1:map 是 List 实现的映射方法,可以一个数组映射为另一个类型的数组
注意 2:为方便起见可以在 map 函数内部使用箭头函数

示例代码:

class ListState extends State<CardHome> {
  int level = 2;
  List<String> list = [
    "OC",
    "Swift",
    "Flutter",
  ];
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      appBar: AppBar(
        title: Text("Flutter 笔记"),
        centerTitle: true,
        backgroundColor: Colors.grey[850],
      ),
      body: Padding(
        padding: EdgeInsets.fromLTRB(30, 40, 30, 0),
        child: Column(
          children: list.map ((item) => Text(item)).toList(),
          // children: list.map ((item) {return Text(item);}).toList(),
        ),
    ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          setState(() {
            level += 1;
            list.add("$level");
          });
        },
        backgroundColor: Colors.grey[400],
        child: Icon(Icons.add),
      ),
    );
  }
}

2. 自定义数据结构

一般模型对象会有多个属性,可以使用一个 class 进行承载:

class Message {
    String text;
    String author;
    Message({this.text, this.author});
}

那么可以在列表中进行 list 的使用

Column(
    children: list.map( (item) => Text("${item.author}: ${item.text})
                  .toList();
),

可以将 Message 这个类用单独的一个文件 message.dart 放到 lib 中,并在 main.dart 进行 import 后使用

import 'message.dart';

3. 封装 widget

一个 widget 代码比较多时可以将代码抽出来封装一个新的 widget,对于依赖外部数据的还需要引入属性,举例:

// message_card.dart
class MessageCard extends StatelessWidget {
    Message data;
    Message(this.data);

    @override
   Widget build(buildContext context) {
        return Column(
                children: <Widget>[Text(data.author), Text(data.text)],
            ),
    }
}

同样地,可以新建一个 message_card.dart 文件到 lib 中。

这样就可以在列表中直接使用 MessageCard

```Dart
Column(
    children: list.map( (item) => MessageCard(item))
                  .toList();
),
上一篇下一篇

猜你喜欢

热点阅读