Fliin
On this page

Screens / commerce

Order history

Lists a customer's orders in two tabs, current and past, searchable by number or item, loaded page by page and refreshed by pulling.

16 of 16 variants pass
Order history, current state
Platform
Brightness
Text scale
Direction

Import

Order history is part of Fliin Pro. With a license key, sign in once with fliin login, then add it in a Flutter app where fliin init has run:

fliin login
fliin add orders

Also installs: alert, app-bar, badge, button, core, empty-state, list-row, order-row, page, result-card, search-field, segmented, skeleton, spinner, text, text-field

Examples

Current

The orders under way. The user can search them and switch to past orders; onOpen opens one. now is the clock the dates are written against.

Order history, current state
import 'package:your_app/ui/fliin/screens/orders/orders_controller.dart';
import 'package:your_app/ui/fliin/screens/orders/orders_data.dart';
import 'package:your_app/ui/fliin/screens/orders/orders_screen.dart';
import 'package:flutter/widgets.dart';

class OrdersCurrentExample extends StatelessWidget {
  const OrdersCurrentExample({super.key});

  @override
  Widget build(BuildContext context) {
    return OrdersScreen.standalone(
      service: SampleOrdersService(latency: const Duration(milliseconds: 600)),
      initial: OrdersShown(sampleOrdersOf(OrdersFilter.current), total: 2),
      filter: OrdersFilter.current,
      query: '',
      now: () => DateTime(2026, 10, 24, 10),
      onOpen: (_) {},
      onBrowse: () {},
      onBack: () {},
    );
  }
}

Past

Past orders, ten at a time: the next page loads as the list reaches its end.

Order history, past state
import 'package:your_app/ui/fliin/screens/orders/orders_controller.dart';
import 'package:your_app/ui/fliin/screens/orders/orders_data.dart';
import 'package:your_app/ui/fliin/screens/orders/orders_screen.dart';
import 'package:flutter/widgets.dart';

class OrdersPastExample extends StatelessWidget {
  const OrdersPastExample({super.key});

  @override
  Widget build(BuildContext context) {
    return OrdersScreen.standalone(
      service: SampleOrdersService(latency: const Duration(milliseconds: 600)),
      initial: OrdersShown(sampleOrdersOf(OrdersFilter.past).take(10).toList(), total: 21, more: const OrdersMoreAvailable('10')),
      filter: OrdersFilter.past,
      query: '',
      now: () => DateTime(2026, 10, 24, 10),
      onOpen: (_) {},
      onBrowse: () {},
      onBack: () {},
    );
  }
}

Refresh failed

When a refresh fails, the orders already shown stay and a notice says they may be out of date.

Order history, refresh-failed state
import 'package:your_app/ui/fliin/screens/orders/orders_controller.dart';
import 'package:your_app/ui/fliin/screens/orders/orders_data.dart';
import 'package:your_app/ui/fliin/screens/orders/orders_screen.dart';
import 'package:flutter/widgets.dart';

class OrdersRefreshFailedExample extends StatelessWidget {
  const OrdersRefreshFailedExample({super.key});

  @override
  Widget build(BuildContext context) {
    return OrdersScreen.standalone(
      service: SampleOrdersService(latency: const Duration(milliseconds: 600)),
      initial: OrdersShown(sampleOrdersOf(OrdersFilter.current), total: 2, notice: OrdersNotice.refreshOffline),
      filter: OrdersFilter.current,
      query: '',
      now: () => DateTime(2026, 10, 24, 10),
      onOpen: (_) {},
      onBrowse: () {},
      onBack: () {},
    );
  }
}

Empty

No order yet: the screen invites the user to browse with onBrowse.

Order history, empty state
import 'package:your_app/ui/fliin/screens/orders/orders_controller.dart';
import 'package:your_app/ui/fliin/screens/orders/orders_data.dart';
import 'package:your_app/ui/fliin/screens/orders/orders_screen.dart';
import 'package:flutter/widgets.dart';

class OrdersEmptyExample extends StatelessWidget {
  const OrdersEmptyExample({super.key});

  @override
  Widget build(BuildContext context) {
    return OrdersScreen.standalone(
      service: SampleOrdersService(latency: const Duration(milliseconds: 600)),
      initial: const OrdersEmpty(),
      filter: OrdersFilter.current,
      query: '',
      now: () => DateTime(2026, 10, 24, 10),
      onOpen: (_) {},
      onBrowse: () {},
      onBack: () {},
    );
  }
}

No match

A search with no result says what was searched and offers to clear it.

Order history, no-match state
import 'package:your_app/ui/fliin/screens/orders/orders_controller.dart';
import 'package:your_app/ui/fliin/screens/orders/orders_data.dart';
import 'package:your_app/ui/fliin/screens/orders/orders_screen.dart';
import 'package:flutter/widgets.dart';

class OrdersNoMatchExample extends StatelessWidget {
  const OrdersNoMatchExample({super.key});

  @override
  Widget build(BuildContext context) {
    return OrdersScreen.standalone(
      service: SampleOrdersService(latency: const Duration(milliseconds: 600)),
      initial: const OrdersNoMatch('teapot'),
      filter: OrdersFilter.past,
      query: 'teapot',
      now: () => DateTime(2026, 10, 24, 10),
      onOpen: (_) {},
      onBrowse: () {},
      onBack: () {},
    );
  }
}

Loading

While the orders load, placeholder rows keep the layout.

Order history, loading state
import 'package:your_app/ui/fliin/screens/orders/orders_controller.dart';
import 'package:your_app/ui/fliin/screens/orders/orders_data.dart';
import 'package:your_app/ui/fliin/screens/orders/orders_screen.dart';
import 'package:flutter/widgets.dart';

class OrdersLoadingExample extends StatelessWidget {
  const OrdersLoadingExample({super.key});

  @override
  Widget build(BuildContext context) {
    return OrdersScreen.standalone(
      service: SampleOrdersService(latency: const Duration(milliseconds: 600)),
      initial: const OrdersLoading(),
      filter: OrdersFilter.current,
      query: '',
      now: () => DateTime(2026, 10, 24, 10),
      onOpen: (_) {},
      onBrowse: () {},
      onBack: () {},
    );
  }
}

Error

When the orders cannot load, the screen says so and offers to try again.

Order history, error state
import 'package:your_app/ui/fliin/screens/orders/orders_controller.dart';
import 'package:your_app/ui/fliin/screens/orders/orders_data.dart';
import 'package:your_app/ui/fliin/screens/orders/orders_screen.dart';
import 'package:flutter/widgets.dart';

class OrdersErrorExample extends StatelessWidget {
  const OrdersErrorExample({super.key});

  @override
  Widget build(BuildContext context) {
    return OrdersScreen.standalone(
      service: SampleOrdersService(latency: const Duration(milliseconds: 600)),
      initial: const OrdersFailed(),
      filter: OrdersFilter.current,
      query: '',
      now: () => DateTime(2026, 10, 24, 10),
      onOpen: (_) {},
      onBrowse: () {},
      onBack: () {},
    );
  }
}

Offline

Without a connection, the screen asks to reconnect.

Order history, offline state
import 'package:your_app/ui/fliin/screens/orders/orders_controller.dart';
import 'package:your_app/ui/fliin/screens/orders/orders_data.dart';
import 'package:your_app/ui/fliin/screens/orders/orders_screen.dart';
import 'package:flutter/widgets.dart';

class OrdersOfflineExample extends StatelessWidget {
  const OrdersOfflineExample({super.key});

  @override
  Widget build(BuildContext context) {
    return OrdersScreen.standalone(
      service: SampleOrdersService(latency: const Duration(milliseconds: 600)),
      initial: const OrdersOffline(),
      filter: OrdersFilter.current,
      query: '',
      now: () => DateTime(2026, 10, 24, 10),
      onOpen: (_) {},
      onBrowse: () {},
      onBack: () {},
    );
  }
}

Routing

fliin add orders prints the route for the router it finds in your pubspec, a file next to the page that wires its navigation. Each of them:

go_router

// lib/orders_route.dart, next to orders_page.dart.
import 'package:go_router/go_router.dart';

import 'orders_page.dart';

/// Add ordersRoute to the routes of your GoRouter.
final ordersRoute = GoRoute(
  path: '/orders',
  builder: (context, state) => OrdersScreenPage(
    onOpen: (id) => context.push('/orders/${Uri.encodeComponent(id)}'),
    // The path of the catalog of your app.
    onBrowse: () => context.push('/catalog'),
    // Alone in the stack (deep link, go): your app's home.
    onBack: () => context.canPop() ? context.pop() : context.go('/'),
  ),
);

navigator

// lib/orders_route.dart, next to orders_page.dart.
import 'package:flutter/material.dart';

import 'order_route.dart';
import 'orders_page.dart';

/// Opens “Order history”: `Navigator.of(context).push(ordersRoute(catalogPage: …, parcelTrackingPage: …, returnPage: …, supportPage: …, cartPage: …))`.
/// [catalogPage] builds the catalog of your app.
/// [parcelTrackingPage] builds the parcel tracking in your app.
/// [returnPage] builds the return of an order in your app.
/// [supportPage] builds the help on an order in your app.
/// [cartPage] builds the cart: the page of Fliin's checkout screen with its callbacks, or yours (checkoutRoute cannot come from here, checkout leads to order).
Route<void> ordersRoute({
  required WidgetBuilder catalogPage,
  required Widget Function(String orderId) parcelTrackingPage,
  required Widget Function(String orderId) returnPage,
  required Widget Function(String orderId) supportPage,
  required WidgetBuilder cartPage,
}) => MaterialPageRoute<void>(
  builder: (context) => OrdersScreenPage(
    onOpen: (id) => Navigator.of(context).push(orderRoute(id, parcelTrackingPage: parcelTrackingPage, returnPage: returnPage, supportPage: supportPage, cartPage: cartPage)),
    onBrowse: () => Navigator.of(context).push(MaterialPageRoute<void>(builder: catalogPage)),
    onBack: () => Navigator.of(context).maybePop(),
  ),
);

State

The controller is a ChangeNotifier from widgets.dart, with no package. fliin add orders prints the page that holds it with the state management it finds, its imports written for your package; below they read your_app. Your backend implements the Service interface of the screen's _data.dart file:

none

// lib/orders_page.dart
// Your backend: implement OrdersService (orders_data.dart) and pass it instead of the sample service.
import 'package:your_app/ui/fliin/screens/orders/orders_data.dart';
import 'package:your_app/ui/fliin/screens/orders/orders_screen.dart';
import 'package:flutter/widgets.dart';

class OrdersScreenPage extends StatelessWidget {
  const OrdersScreenPage({
    super.key,
    required this.onOpen,
    required this.onBrowse,
    required this.onBack,
  });

  final ValueChanged<String> onOpen;
  final VoidCallback onBrowse;
  final VoidCallback onBack;

  @override
  Widget build(BuildContext context) => OrdersScreen.standalone(
    service: SampleOrdersService(),
    onOpen: onOpen,
    onBrowse: onBrowse,
    onBack: onBack,
  );
}

provider

// lib/orders_page.dart
// Your backend: implement OrdersService (orders_data.dart) and pass it instead of the sample service.
import 'package:your_app/ui/fliin/screens/orders/orders_controller.dart';
import 'package:your_app/ui/fliin/screens/orders/orders_data.dart';
import 'package:your_app/ui/fliin/screens/orders/orders_screen.dart';
import 'package:flutter/widgets.dart';
import 'package:provider/provider.dart';

class OrdersScreenPage extends StatelessWidget {
  const OrdersScreenPage({
    super.key,
    required this.onOpen,
    required this.onBrowse,
    required this.onBack,
  });

  final ValueChanged<String> onOpen;
  final VoidCallback onBrowse;
  final VoidCallback onBack;

  @override
  Widget build(BuildContext context) => ChangeNotifierProvider(
    create: (_) => OrdersController(service: SampleOrdersService())..load(),
    child: Builder(
      builder: (context) => OrdersScreen(
        controller: context.read<OrdersController>(),
        onOpen: onOpen,
        onBrowse: onBrowse,
        onBack: onBack,
      ),
    ),
  );
}

riverpod

// lib/orders_page.dart
// Your backend: implement OrdersService (orders_data.dart) and pass it instead of the sample service.
import 'package:your_app/ui/fliin/screens/orders/orders_controller.dart';
import 'package:your_app/ui/fliin/screens/orders/orders_data.dart';
import 'package:your_app/ui/fliin/screens/orders/orders_screen.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

final ordersControllerProvider = Provider.autoDispose<OrdersController>((ref) {
  final controller = OrdersController(service: SampleOrdersService())..load();
  ref.onDispose(controller.dispose);
  return controller;
});

class OrdersScreenPage extends ConsumerWidget {
  const OrdersScreenPage({
    super.key,
    required this.onOpen,
    required this.onBrowse,
    required this.onBack,
  });

  final ValueChanged<String> onOpen;
  final VoidCallback onBrowse;
  final VoidCallback onBack;

  @override
  Widget build(BuildContext context, WidgetRef ref) => OrdersScreen(
    controller: ref.watch(ordersControllerProvider),
    onOpen: onOpen,
    onBrowse: onBrowse,
    onBack: onBack,
  );
}

bloc

// lib/orders_page.dart
// Your backend: implement OrdersService (orders_data.dart) and pass it instead of the sample service.
import 'package:your_app/ui/fliin/screens/orders/orders_controller.dart';
import 'package:your_app/ui/fliin/screens/orders/orders_data.dart';
import 'package:your_app/ui/fliin/screens/orders/orders_screen.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

/// The screen's controller as a bloc, for your BlocListener and BlocBuilder:
/// one emission per controller notification. `version` tells them apart
/// when `state` does not change (mode, filters, text…, read them on
/// `controller`). The screen listens to the controller itself.
class OrdersCubit extends Cubit<({OrdersState state, int version})> {
  OrdersCubit(this.controller) : super((state: controller.state, version: 0)) {
    controller.addListener(_changed);
  }

  final OrdersController controller;

  void _changed() => emit((state: controller.state, version: state.version + 1));

  @override
  Future<void> close() {
    controller
      ..removeListener(_changed)
      ..dispose();
    return super.close();
  }
}

class OrdersScreenPage extends StatelessWidget {
  const OrdersScreenPage({
    super.key,
    required this.onOpen,
    required this.onBrowse,
    required this.onBack,
  });

  final ValueChanged<String> onOpen;
  final VoidCallback onBrowse;
  final VoidCallback onBack;

  @override
  Widget build(BuildContext context) => BlocProvider(
    create: (_) => OrdersCubit(OrdersController(service: SampleOrdersService())..load()),
    child: Builder(
      builder: (context) => OrdersScreen(
        controller: context.read<OrdersCubit>().controller,
        onOpen: onOpen,
        onBrowse: onBrowse,
        onBack: onBack,
      ),
    ),
  );
}

The snippets lead to order: install these screens too and paste their snippets.

API

OrdersScreen: class extends StatefulWidget
OrdersScreen.new: const new({super.key, required OrdersController controller, required ValueChanged<String> onOpen, VoidCallback? onBrowse, VoidCallback? onBack, DateTime Function()? now, OrdersDateFormat? formatDate, bool showSearch})
OrdersScreen.standalone: const new({super.key, required OrdersService service, required ValueChanged<String> onOpen, OrdersState? initial, OrdersFilter filter, String query, VoidCallback? onBrowse, VoidCallback? onBack, DateTime Function()? now, OrdersDateFormat? formatDate, bool showSearch})
OrdersScreen.controller: get OrdersController?
OrdersScreen.service: get OrdersService?
OrdersScreen.initial: get OrdersState?
OrdersScreen.filter: get OrdersFilter
OrdersScreen.query: get String
OrdersScreen.onOpen: get ValueChanged<String>
OrdersScreen.onBrowse: get VoidCallback?
OrdersScreen.onBack: get VoidCallback?
OrdersScreen.now: get DateTime Function()?
OrdersScreen.formatDate: get OrdersDateFormat?
OrdersScreen.showSearch: get bool
OrdersScreen.createState: State<OrdersScreen>()
OrdersState: sealed class permits {OrdersEmpty, OrdersFailed, OrdersLoading, OrdersNoMatch, OrdersOffline, OrdersShown}
OrdersState.new: const new()
OrdersLoading: final class extends OrdersState
OrdersLoading.new: const new()
OrdersFailed: final class extends OrdersState
OrdersFailed.new: const new()
OrdersOffline: final class extends OrdersState
OrdersOffline.new: const new()
OrdersEmpty: final class extends OrdersState
OrdersEmpty.new: const new()
OrdersNoMatch: final class extends OrdersState
OrdersNoMatch.new: const new(String query)
OrdersNoMatch.query: get String
OrdersMore: sealed class permits {OrdersMoreAvailable, OrdersMoreEnd, OrdersMoreFailed, OrdersMoreLoading}
OrdersMore.new: const new()
OrdersMoreAvailable: final class extends OrdersMore
OrdersMoreAvailable.new: const new(String after)
OrdersMoreAvailable.after: get String
OrdersMoreLoading: final class extends OrdersMore
OrdersMoreLoading.new: const new(String after)
OrdersMoreLoading.after: get String
OrdersMoreFailed: final class extends OrdersMore
OrdersMoreFailed.new: const new(String after, {required bool offline})
OrdersMoreFailed.after: get String
OrdersMoreFailed.offline: get bool
OrdersMoreEnd: final class extends OrdersMore
OrdersMoreEnd.new: const new()
OrdersNotice: enum {refreshFailed, refreshOffline}
OrdersNotice.refreshFailed: static final OrdersNotice
OrdersNotice.refreshOffline: static final OrdersNotice
OrdersShown: final class extends OrdersState
OrdersShown.new: new(List<OrdersEntry> entries, {required int total, OrdersMore more, bool refreshing, OrdersNotice? notice})
OrdersShown.entries: get List<OrdersEntry>
OrdersShown.total: get int
OrdersShown.more: get OrdersMore
OrdersShown.refreshing: get bool
OrdersShown.notice: get OrdersNotice?
OrdersController: class extends ChangeNotifier
OrdersController.new: new({required OrdersService service, OrdersFilter filter, String query, OrdersState initial, Duration debounce})
OrdersController.service: get OrdersService
OrdersController.debounce: get Duration
OrdersController.state: get OrdersState
OrdersController.filter: get OrdersFilter
OrdersController.query: get String
OrdersController.shownQuery: get String
OrdersController.load: Future<void>()
OrdersController.setFilter: void(OrdersFilter filter)
OrdersController.setQuery: void(String query)
OrdersController.submit: void()
OrdersController.refresh: Future<void>()
OrdersController.loadMore: Future<bool>()
OrdersController.dispose: void()
OrdersFilter: enum {current, past}
OrdersFilter.current: static final OrdersFilter
OrdersFilter.past: static final OrdersFilter
OrdersStatus: enum {preparing, shipped, delivered, cancelled, refunded}
OrdersStatus.preparing: static final OrdersStatus
OrdersStatus.shipped: static final OrdersStatus
OrdersStatus.delivered: static final OrdersStatus
OrdersStatus.cancelled: static final OrdersStatus
OrdersStatus.refunded: static final OrdersStatus
OrdersStatus.filter: get OrdersFilter
OrdersEntry: final class
OrdersEntry.new: const new({required String id, required String number, required DateTime placedAt, required int itemCount, required String total, required OrdersStatus status, ImageProvider? image})
OrdersEntry.id: get String
OrdersEntry.number: get String
OrdersEntry.placedAt: get DateTime
OrdersEntry.itemCount: get int
OrdersEntry.total: get String
OrdersEntry.status: get OrdersStatus
OrdersEntry.image: get ImageProvider?
OrdersPage: final class
OrdersPage.new: const new({required List<OrdersEntry> entries, required int total, String? next})
OrdersPage.entries: get List<OrdersEntry>
OrdersPage.total: get int
OrdersPage.next: get String?
OrdersNoNetwork: final class implements Exception
OrdersNoNetwork.new: const new()
OrdersService: abstract interface class
OrdersService.new: new()
OrdersService.orders: abstract Future<OrdersPage>(OrdersFilter filter, {String query, String? after})
SampleOrder: typedef = ({OrdersEntry entry, List<String> articles})
sampleOrders: get List<SampleOrder>
SampleOrdersService: final class implements OrdersService
SampleOrdersService.new: new({List<SampleOrder>? history, int pageSize, Duration latency})
SampleOrdersService.history: get List<SampleOrder>
SampleOrdersService.pageSize: get int
SampleOrdersService.latency: get Duration
SampleOrdersService.requests: get List<(OrdersFilter, String, String?)>
SampleOrdersService.orders: Future<OrdersPage>(OrdersFilter filter, {String query, String? after})
sampleOrdersOf: List<OrdersEntry>(OrdersFilter filter)
OrdersDateFormat: typedef = String Function(DateTime date, Locale locale)
ordersL10n: const Map<String, Map<String, String>>
OrdersStrings: final class
OrdersStrings.new: const new(String language, {required DateTime now, OrdersDateFormat? format})
OrdersStrings.of: factory new(BuildContext context, {required DateTime now, OrdersDateFormat? format})
OrdersStrings.language: get String
OrdersStrings.now: get DateTime
OrdersStrings.format: get OrdersDateFormat?
OrdersStrings.digits: String(int n)
OrdersStrings.date: String(DateTime date)
OrdersStrings.title: get String
OrdersStrings.back: get String
OrdersStrings.refresh: get String
OrdersStrings.loading: get String
OrdersStrings.filterLabel: get String
OrdersStrings.filter: String(OrdersFilter filter)
OrdersStrings.search: get String
OrdersStrings.searchHint: get String
OrdersStrings.clear: get String
OrdersStrings.number: String(String number)
OrdersStrings.detail: String(OrdersEntry entry)
OrdersStrings.results: String(int count)
OrdersStrings.status: String(OrdersStatus status)
OrdersStrings.emptyTitle: String(OrdersFilter filter)
OrdersStrings.emptyMessage: get String
OrdersStrings.browse: get String
OrdersStrings.noMatchTitle: String(String query)
OrdersStrings.noMatchMessage: get String
OrdersStrings.loadingMore: get String
OrdersStrings.moreFailed: get String
OrdersStrings.moreOffline: get String
OrdersStrings.end: get String
OrdersStrings.refreshFailed: get String
OrdersStrings.refreshOffline: get String
OrdersStrings.errorTitle: get String
OrdersStrings.errorMessage: get String
OrdersStrings.offlineTitle: get String
OrdersStrings.offlineMessage: get String
OrdersStrings.retry: get String

Strings

Every label in English, French and Arabic. The screen follows the closest Localizations; the same table is in the manifest, ready for your ARB files.

Keyenfrar
ordersTitleMy ordersMes commandesطلباتي
ordersBackBackRetourرجوع
ordersRefreshRefresh the ordersActualiser les commandesتحديث الطلبات
ordersLoadingLoading your ordersChargement des commandesجارٍ تحميل الطلبات
ordersFilterLabelOrders to showCommandes à afficherالطلبات المعروضة
ordersCurrentCurrentEn coursالجارية
ordersPastPastPasséesالسابقة
ordersSearchSearch ordersRechercher une commandeالبحث في الطلبات
ordersSearchHintNumber or itemNuméro ou articleالرقم أو المنتج
ordersClearClear searchEffacer la rechercheمسح البحث
ordersNumberOrder {number}Commande {number}الطلب ⁨{number}⁩
ordersRowDetail{date} · {items} · {total}{date} · {items} · {total}{date} · {items} · ⁦{total}⁩
ordersItemsOne1 item1 articleمنتج واحد
ordersItemsTwo2 items2 articlesمنتجان
ordersItems{count} items{count} articles{count} منتجات
ordersItemsOther{count} items{count} articles{count} منتج
ordersItemsMany{count} items{count} articles{count} منتجًا
ordersResults{count} orders{count} commandes{count} طلبات
ordersResultsOne1 order1 commandeطلب واحد
ordersResultsTwo2 orders2 commandesطلبان
ordersResultsOther{count} orders{count} commandes{count} طلب
ordersResultsMany{count} orders{count} commandes{count} طلبًا
ordersTodayTodayAujourd’huiاليوم
ordersYesterdayYesterdayHierأمس
ordersDate{month} {day}{day} {month}{day} {month}
ordersDateYear{month} {day}, {year}{day} {month} {year}{day} {month} {year}
ordersMonthsJanuary,February,March,April,May,June,July,August,September,October,November,Decemberjanvier,février,mars,avril,mai,juin,juillet,août,septembre,octobre,novembre,décembreيناير,فبراير,مارس,أبريل,مايو,يونيو,يوليو,أغسطس,سبتمبر,أكتوبر,نوفمبر,ديسمبر
ordersStatusPreparingPreparingEn préparationقيد التجهيز
ordersStatusShippedShippedExpédiéeتم الشحن
ordersStatusDeliveredDeliveredLivréeتم التوصيل
ordersStatusCancelledCancelledAnnuléeملغى
ordersStatusRefundedRefundedRembourséeتم الاسترداد
ordersEmptyCurrentTitleNo current ordersAucune commande en coursلا توجد طلبات جارية
ordersEmptyPastTitleNo past orders yetAucune commande passéeلا توجد طلبات سابقة بعد
ordersEmptyMessageYour orders will show here once placed.Vos commandes s’afficheront ici une fois passées.ستظهر طلباتك هنا بعد تقديمها.
ordersBrowseBrowse the catalogDécouvrir le catalogueتصفّح المتجر
ordersNoMatchTitleNo order matches “{query}”Aucune commande ne correspond à « {query} »لا يوجد طلب يطابق «⁨{query}⁩»
ordersNoMatchMessageSearch by order number or by item name.Cherchez par numéro de commande ou par nom d’article.ابحث برقم الطلب أو باسم المنتج.
ordersLoadingMoreLoading more ordersChargement d’autres commandesجارٍ تحميل المزيد من الطلبات
ordersMoreFailedMore orders could not load.La suite n’a pas pu se charger.تعذّر تحميل المزيد.
ordersMoreOfflineYou are offline. Connect to see more orders.Vous êtes hors ligne. Connectez-vous pour voir la suite.أنت غير متصل. اتصل لعرض المزيد.
ordersEndThat is all your orders.Vous avez vu toutes vos commandes.هذه كل طلباتك.
ordersRefreshFailedYour orders could not refresh.Les commandes n’ont pas pu se mettre à jour.تعذّر تحديث الطلبات.
ordersRefreshOfflineYou are offline. The orders shown may be out of date.Vous êtes hors ligne. Les commandes affichées ne sont peut-être pas à jour.أنت غير متصل. قد لا تكون الطلبات المعروضة محدّثة.
ordersErrorTitleYour orders could not loadImpossible de charger les commandesتعذّر تحميل الطلبات
ordersErrorMessageTry again in a moment.Réessayez dans un instant.أعد المحاولة بعد قليل.
ordersOfflineTitleYou are offlineVous êtes hors ligneأنت غير متصل
ordersOfflineMessageConnect to see your orders.Connectez-vous pour voir vos commandes.اتصل لعرض طلباتك.
ordersRetryTry againRéessayerأعد المحاولة

Reference renders

The 16 images published with version 0.2.4, rendered by the shared harness on macOS with Flutter 3.47.7. Each shows every state side by side, at the size of an iPhone (390 × 844) or of an Android phone (412 × 915). fliin verify orders compares your copy to them.

iOS · Light
Order history, iOS, Light, text 1.0×, Left to right
Text 1.0× · Left to right
Order history, iOS, Light, text 1.0×, Right to left
Text 1.0× · Right to left
Order history, iOS, Light, text 2.0×, Left to right
Text 2.0× · Left to right
Order history, iOS, Light, text 2.0×, Right to left
Text 2.0× · Right to left
iOS · Dark
Order history, iOS, Dark, text 1.0×, Left to right
Text 1.0× · Left to right
Order history, iOS, Dark, text 1.0×, Right to left
Text 1.0× · Right to left
Order history, iOS, Dark, text 2.0×, Left to right
Text 2.0× · Left to right
Order history, iOS, Dark, text 2.0×, Right to left
Text 2.0× · Right to left
Android · Light
Order history, Android, Light, text 1.0×, Left to right
Text 1.0× · Left to right
Order history, Android, Light, text 1.0×, Right to left
Text 1.0× · Right to left
Order history, Android, Light, text 2.0×, Left to right
Text 2.0× · Left to right
Order history, Android, Light, text 2.0×, Right to left
Text 2.0× · Right to left
Android · Dark
Order history, Android, Dark, text 1.0×, Left to right
Text 1.0× · Left to right
Order history, Android, Dark, text 1.0×, Right to left
Text 1.0× · Right to left
Order history, Android, Dark, text 2.0×, Left to right
Text 2.0× · Left to right
Order history, Android, Dark, text 2.0×, Right to left
Text 2.0× · Right to left

Use it to

  • show a customer's current and past orders
  • pick a purchase by its number or the name of an item
  • show the status of each purchase before opening it
  • offer the catalog to a customer who has bought nothing yet
  • make older orders load while scrolling the list
Not for
  • the details and tracking of a purchase: use order tracking (order)
  • a search in the catalog: use the search screen (search)
States
  • Current
  • Past
  • Refresh failed
  • Empty
  • No match
  • Loading
  • Error
  • Offline

Arrows to move, Enter to open, Escape to close.