1

我正在 Flutter 中开发一个简单的聊天屏幕 UI。有一个用户定义的小部件 MessageBubble,它接受三个参数:sender (String)、text (String)、isMe (bool)。目前它正在被一一传递静态值,如下所示:

List<MessageBubble> messages = [
    MessageBubble(
      sender: "Me",
      text: "Hi!",
      isMe: true,
    ),
    MessageBubble(
      sender: "Not Me",
      text: "Hey, hi!",
      isMe: false,
    ),
];

我想做的是,我创建了一个像这样的 BubbleData 类:

class BubbleData {
    List <String> sender = ['Not Me', 'Not Me'];
    List <String> text = ['Hey Hi', "What's new?"];
    List <bool> isMe = [false, false];
}

现在手头的问题在于如何使用 ListView 构建器通过 MessageBubble 迭代这些列表项?

4

3 回答 3

2

也许更好的方法是定义你的 BubbleData 如下:

class BubbleData{
   String sender;
   String text;
   bool isMe;

   BubbleData({this.sender, this.text, this.isMe});
}

然后使用您的数据创建一个可以迭代的列表:

List<BubbleData> bubbles = [
   BubbleData(sender: 'Not Me', text: 'Hey Mi', isMe: false),
   BubbleData(sender: 'Not Me', text: 'What\'s new?', isMe: false)
];

下一步将映射并转换为 MessageBubble 的列表:

List<MessageBubble> messages = bubbles.map((bubble) =>
   MessageBubble(
      sender: bubble.sender, 
      text: bubble.text, 
      isMe: bubble.isMe
   )
).toList();
于 2020-05-10T15:19:54.940 回答
1

按照阿卡德的回答。您可以像这样在 listView 中使用它:

 class MyBubbleList extends StatelessWidget {

  final List<BubbleData> bubbles = [
   BubbleData(sender: 'Not Me', text: 'Hey Mi', isMe: false),
   BubbleData(sender: 'Not Me', text: 'What\'s new?', isMe: false)
];

  @override
  Widget build(BuildContext context) {

    //here the ListView part
    return ListView.builder(
      itemCount:bubbles.length,
      itemBuilder: (BuildContext context, int index) { 
             return Container(child:Text(bubbles[index].text));
      },);
  }
}

您可以在 Flutter 文档中查看更多信息。你会发现关于如何使用 ListView 的非常好的视频教程。 https://api.flutter.dev/flutter/widgets/ListView-class.html

希望能帮助到你

于 2020-05-12T08:10:59.477 回答
0

你可以这样迭代:

BubbleData data = BubbleData();  //instantiating

@override
Widget build(BuildContext context) {
  return Scaffold(
    body: ListView.builder(
      itemCount: data.sender.length,
      itemBuilder: (_, index) {
        return ListTile(
          title: Text(data.text[index]),         //iterating
          subtitle: Text(data.sender[index]),
        );
      },
    ),
  );
}
于 2020-05-10T15:44:25.593 回答