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.
constStorytellerStoriesGridView(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(StorytellerTileType tileType)
onPlayerDismissed()
StorytellerTileType is either StorytellerStoryTile or StorytellerClipTile. Both expose id, categories, and categoryDetails when the native SDK provides category metadata. Clip tiles also expose collectionId.
adConfiguration is fixed when the platform view is created and supported on
Android only. iOS ignores the entire value because its native Clips list
configuration exposes no presentation ad controls. Android 11.6.3 defaults
pre-roll on; omit the nullable value to preserve that native default. For
provider order, null preserves native order, an empty list disables standard
providers for that list presentation, and a populated list restricts and orders
them.
The Showcase feed swaps between rows, grids, and singleton layouts from a single StorytellerItemWidget that wires the callbacks above and hides sections with empty data.
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).
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.
{"slug": "storyteller-list-views", "page_title": "List Components", "page_url": "StorytellerListViews/", "canonical_url": "/flutter/StorytellerListViews/", "markdown": "# Storyteller List Components\n\nStoryteller 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.\n\n## Stories layouts\n\n| Widget | Description | Common parameters |\n| --- | --- | --- |\n| `StorytellerStoriesGridView` | Scrollable, multi-column grid of stories. | `isScrollable`, `categories`, `cellType`, `uiStyle`, `displayLimit`, `visibleTiles`, `theme`, `context`, `controller` |\n| `StorytellerStoriesRowView` | Horizontal row of story tiles. | `categories`, `cellType`, `uiStyle`, `displayLimit`, `visibleTiles`, `height`, `theme`, `context`, `controller` |\n\nExample usage:\n\n```dart\nconst StorytellerStoriesGridView(\n isScrollable: true,\n categories: ['example'],\n cellType: 'square', // or 'round'\n onTileTapped: handleOnTileTapped,\n onDataLoadStarted: handleLoadStart,\n);\n```\n\nBoth widgets expose optional callbacks:\n\n- `onDataLoadStarted()`\n- `onDataLoadComplete(bool success, Object? error, int dataCount)`\n- `onTileTapped(StorytellerTileType tileType)`\n- `onPlayerDismissed()`\n\n`StorytellerTileType` is either `StorytellerStoryTile` or `StorytellerClipTile`. Both expose `id`, `categories`, and `categoryDetails` when the native SDK provides category metadata. Clip tiles also expose `collectionId`.\n\n## Clips layouts\n\n| Widget | Description | Common parameters |\n| --- | --- | --- |\n| `StorytellerClipsGridView` | Grid of clips sourced from a collection. | `isScrollable`, `collectionId`, `cellType`, `uiStyle`, `displayLimit`, `visibleTiles`, `theme`, `context`, `adConfiguration`, `controller` |\n| `StorytellerClipsRowView` | Horizontal reel of clips. | `collectionId`, `cellType`, `uiStyle`, `displayLimit`, `visibleTiles`, `height`, `theme`, `context`, `adConfiguration`, `controller` |\n\nExample usage:\n\n```dart\nconst StorytellerClipsRowView(\n collectionId: 'collection',\n cellType: 'square',\n height: 220,\n context: {'placement': 'custom_placement'},\n adConfiguration: StorytellerClipsAdConfiguration(\n preRollEnabled: true,\n bottomBannerEnabled: true,\n betweenClipsAdProviderOrder: [StorytellerAdProvider.gam],\n ),\n);\n```\n\n`adConfiguration` is fixed when the platform view is created and supported on\nAndroid only. iOS ignores the entire value because its native Clips list\nconfiguration exposes no presentation ad controls. Android 11.6.3 defaults\npre-roll on; omit the nullable value to preserve that native default. For\nprovider order, `null` preserves native order, an empty list disables standard\nproviders for that list presentation, and a populated list restricts and orders\nthem.\n\nThe Showcase feed swaps between rows, grids, and singleton layouts from a single [`StorytellerItemWidget`](https://github.com/getstoryteller/storyteller-showcase-flutter/blob/main/lib/screens/home/widgets/storyteller_item_widget.dart#L8) that wires the callbacks above and hides sections with empty data.\n\n## Controlling list refresh\n\nPass 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).\n\n```dart\nclass CategoryStories extends StatefulWidget {\n const CategoryStories({super.key});\n\n @override\n State<CategoryStories> createState() => _CategoryStoriesState();\n}\n\nclass _CategoryStoriesState extends State<CategoryStories> {\n final _controller = StorytellerListViewController();\n\n @override\n Widget build(BuildContext context) {\n return StorytellerStoriesRowView(\n categories: const ['recommended'],\n controller: _controller,\n );\n }\n\n Future<void> refreshStories() async {\n await _controller.reloadData();\n }\n}\n```\n\nIf you call `reloadData` before the platform view has been created, the controller queues the request and executes it automatically after the widget is ready.\n", "copy_markdown_include_header": false, "base_path": "", "ai_dir": "ai", "missing_payload_behavior": "empty"}