Skip to content

Storyteller Lists#

Storyteller ships multiple Flutter widgets that mirror the native list experiences. Each widget wraps a platform view, so the iOS and Android SDKs render the UI while Flutter manages sizing, layout, and callbacks.

Stories layouts#

Widget Description Common parameters
StorytellerStoriesGridView Scrollable, multi-column grid of stories. isScrollable, categories, cellType, uiStyle, displayLimit, visibleTiles, theme, context, controller
StorytellerStoriesRowView Horizontal row of story tiles. categories, cellType, uiStyle, displayLimit, visibleTiles, height, theme, context, controller

Example usage:

const StorytellerStoriesGridView(
  isScrollable: true,
  categories: ['example'],
  cellType: 'square', // or 'round'
  onTileTapped: handleOnTileTapped,
  onDataLoadStarted: handleLoadStart,
);

Both widgets expose optional callbacks:

  • onDataLoadStarted()
  • onDataLoadComplete(bool success, Object? error, int dataCount)
  • onTileTapped(String id)
  • onPlayerDismissed()

Clips layouts#

Widget Description Common parameters
StorytellerClipsGridView Grid of clips sourced from a collection. isScrollable, collectionId, cellType, uiStyle, displayLimit, visibleTiles, theme, context, controller
StorytellerClipsRowView Horizontal reel of clips. collectionId, cellType, uiStyle, displayLimit, visibleTiles, height, theme, context, controller

Example usage:

const StorytellerClipsRowView(
  collectionId: 'collection',
  cellType: 'square',
  height: 220,
  context: {'placement': 'custom_placement'},
);

Controlling list refresh#

Pass a StorytellerListViewController into any stories or clips list widget when you need to trigger native reloads on demand (for example, after a user signs in or changes preferences).

class CategoryStories extends StatefulWidget {
  const CategoryStories({super.key});

  @override
  State<CategoryStories> createState() => _CategoryStoriesState();
}

class _CategoryStoriesState extends State<CategoryStories> {
  final _controller = StorytellerListViewController();

  @override
  Widget build(BuildContext context) {
    return StorytellerStoriesRowView(
      categories: const ['recommended'],
      controller: _controller,
    );
  }

  Future<void> refreshStories() async {
    await _controller.reloadData();
  }
}

If you call reloadData before the platform view has been created, the controller queues the request and executes it automatically after the widget is ready.