Nike Nike Nike Men's Windrunner Pants Sportswear Pants Men's Windrunner Pants Sportswear Windrunner Men's Nike Sportswear 5qRR4tSw

We often need to create lists that display different types of content. For example, we might be working on a List that shows a heading followed by a few items related to the heading, followed by another heading, and so on.

How would we create such a structure with Flutter?

Directions

  1. Create a data source with different types of items
  2. Convert the data source into a List of Widgets

1. Create a data source with different types of item

Types of Items

In order to represent different types of items in a List, we’ll need to define a class for each type of item.

In this example, we’ll work on an app that shows a header followed by five messages. Therefore, we’ll create three classes: ListItem, HeadingItem, and MessageItem.

// The base class for the different types of items the List can contain
abstract class ListItem {}

Sportswear Pants Pants Windrunner Windrunner Nike Nike Nike Sportswear Nike Men's Sportswear Windrunner Men's Men's Pants // A ListItem that contains data to display a heading
class HeadingItem implements Men's Sportswear Windrunner Pants Nike Men's Windrunner Pants Men's Nike Nike Nike Pants Sportswear Sportswear Windrunner ListItem {
  final String heading;

  HeadingItem(this.Sportswear Pants Nike Men's Windrunner Nike Sportswear Pants Sportswear Windrunner Nike Pants Men's Men's Nike Windrunner heading);
}

// A ListItem that contains data to display a message
class MessageItem implements ListItem {
  final String sender;
  final String body;

  MessageItem(this.sender, this.body);
}

Create a List of Items

Most of the time, we’d fetch data from the internet or a local database and convert that data into a list of items.

For this example, we’ll generate a list of items to work with. The list will contain a header followed by five messages. Rinse, repeat.

final items = List<ListItem>.generate(
  1200,
  (i) => i % 6 == 0
      ? HeadingItem("Heading $i")
      : MessageItem("Sender $i", "Message body $i"),
Men's Men's Nike Pants Pants Windrunner Sportswear Nike Windrunner Pants Sportswear Sportswear Windrunner Men's Nike Nike );

2. Convert the data source into a List of Widgets

In order to handle converting each item into a Widget, we’ll employ the Jeans Khaki Lauren Ralph winter Polo Boutique Co by Shorts 7EBT4qw constructor.

In general, we’ll want to provide a builder function that checks for what type of item we’re dealing with, and returns the appropriate Widget for that type of item.

In this example, using the is keyword to check the type of item we’re dealing with can be handy. It’s fast, and will automatically cast each item to the appropriate type. However, there are different ways to approach this problem if you prefer another pattern!

ListView.builder(
  // Let the ListView know how many items it needs to build
  itemCount: items.length,
  // Provide a builder function. This is where the magic happens! We'll
  // convert each item into a Widget based on the type of item it is.
  itemBuilder: Nike Windrunner Windrunner Nike Sportswear Men's Pants Pants Men's Pants Sportswear Nike Men's Nike Sportswear Windrunner (context, index) {
    final item = items[index];

    if (item is HeadingItem) {
      return ListTile(
        title: Text(
          item.heading,
          style: Theme.of(context).textTheme.headline,
        ),
      );
    } else if (item is MessageItem) {
      return ListTile(
        title: Text(item.sender),
        subtitle: Text(item.body),
      );
    }
  },Men's Windrunner Nike Sportswear Sportswear Men's Pants Nike Pants Windrunner Nike Nike Pants Sportswear Windrunner Men's 
);

Complete example

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp(
    items: List<ListItem>.generate(
      1000,
      (i) Pants Nike Sportswear Windrunner Pants Windrunner Men's Nike Men's Sportswear Men's Windrunner Sportswear Nike Pants Nike =Men's Nike Nike Nike Sportswear Sportswear Windrunner Men's Men's Pants Sportswear Windrunner Pants Nike Windrunner Pants > i % 6 == 0
          ? HeadingItem("Heading $i")
          : MessageItem("Sender $i", "Message body $i"),
    ),
  ));
}

class MyApp extends StatelessWidget {
  final Men's Windrunner Pants Nike Windrunner Pants Sportswear Nike Sportswear Men's Nike Sportswear Nike Windrunner Men's Pants ListSportswear Nike Sportswear Men's Windrunner Men's Pants Sportswear Pants Nike Nike Nike Windrunner Windrunner Men's Pants <ListItem> items;

  MyApp({Key keyWindrunner Windrunner Men's Sportswear Windrunner Sportswear Sportswear Pants Nike Pants Nike Nike Men's Men's Nike Pants ,  this.items}) : super(key: key);

  
  Widget build(BuildContext context) {
    final title = 'Mixed List';

    return MaterialApp(
      title: title,
      home: Scaffold(
        appBar: AppBar(
          title: Text(titleMen's Nike Men's Pants Men's Nike Sportswear Windrunner Nike Nike Windrunner Pants Pants Windrunner Sportswear Sportswear ),
        ),
        body: ListView.builder(
          // Let the ListView know how many items it needs to build
          itemCount: items.length,
          // Provide a builder function. This is where the magic happens! We'll
          // convert each item into a Widget based on the type of item it is.
          itemBuilder: (context, index) {
            final item = Windrunner Nike Sportswear Men's Nike Sportswear Pants Nike Windrunner Pants Windrunner Men's Sportswear Men's Nike Pants items[index];

            if (item is HeadingItem) {
              return ListTile(
                title:winter Boutique Boutique winter Converse Jacket zwxXHEn6qX Text(
                  item.heading,
                  stylePants Nike Nike Sportswear Windrunner Pants Men's Men's Windrunner Pants Nike Sportswear Sportswear Nike Windrunner Men's : Theme.of(context).textTheme.headline,
                ),
              );
            } else if (item is MessageItem) {
              return ListTile(
                title: Text(item.sender),
                subtitle: Text(item.body),
              );
            }
          },
        ),
      ),
    );
  }
}

// The base class for the different types of items the List can contain
abstract class ListItem {}

// A ListItem that contains data to display a heading
class HeadingItem implements ListItem {
  final String heading;

  HeadingItem(this.heading);
}

// A ListItem that contains data to display a message
class MessageItem implements ListItem {
  final String sender;
  finalJacket Boutique winter Norm Jacket Boutique Norm Thompson winter Thompson x1B4Iq String body;

  MessageItem(this.sender, this.body);
}