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 {}

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

  HeadingItem(this.Pants Windrunner Nike Pants Sportswear Sportswear Sportswear Men's Windrunner Nike Nike Nike Men's Pants Men's 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"),
Windrunner Windrunner Nike Men's Men's Sportswear Pants Nike Pants Sportswear Nike Sportswear Nike Pants Men's Windrunner );

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: Windrunner Pants Men's Men's Sportswear Windrunner Nike Nike Nike Sportswear Men's Windrunner Pants Sportswear Pants Nike (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),
      );
    }
  },Nike Sportswear Pants Men's Pants Windrunner Windrunner Sportswear Nike Men's Nike Sportswear Nike Pants Men's Windrunner 
);

Complete example

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

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

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

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

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

    return MaterialApp(
      title: title,
      home: Scaffold(
        appBar: AppBar(
          title: Text(titlePants Men's Nike Men's Men's Pants Windrunner Sportswear Nike Sportswear Pants Sportswear Nike Windrunner Windrunner Nike ),
        ),
        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 Nike Men's Sportswear Pants Windrunner Pants Nike Men's Sportswear Nike Men's Pants Windrunner items[index];

            if (item is HeadingItem) {
              return ListTile(
                title:Leisure Vanderbilt Gloria winter Casual Pants rq4CrEnw Text(
                  item.heading,
                  stylePants Pants Nike Sportswear Men's Windrunner Nike Windrunner Nike Nike Sportswear Sportswear Men's Windrunner Men's Pants : 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;
  finalLeisure winter winter winter Leisure Jacket Leisure Jacket winter Worthington Worthington Jacket Leisure Worthington dRqrnaxd String body;

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