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.
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 ordersAlso 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.
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.
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.
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.
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.
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.
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.
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.
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 StringStrings
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.
| Key | en | fr | ar |
|---|---|---|---|
ordersTitle | My orders | Mes commandes | طلباتي |
ordersBack | Back | Retour | رجوع |
ordersRefresh | Refresh the orders | Actualiser les commandes | تحديث الطلبات |
ordersLoading | Loading your orders | Chargement des commandes | جارٍ تحميل الطلبات |
ordersFilterLabel | Orders to show | Commandes à afficher | الطلبات المعروضة |
ordersCurrent | Current | En cours | الجارية |
ordersPast | Past | Passées | السابقة |
ordersSearch | Search orders | Rechercher une commande | البحث في الطلبات |
ordersSearchHint | Number or item | Numéro ou article | الرقم أو المنتج |
ordersClear | Clear search | Effacer la recherche | مسح البحث |
ordersNumber | Order {number} | Commande {number} | الطلب {number} |
ordersRowDetail | {date} · {items} · {total} | {date} · {items} · {total} | {date} · {items} · {total} |
ordersItemsOne | 1 item | 1 article | منتج واحد |
ordersItemsTwo | 2 items | 2 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} طلبات |
ordersResultsOne | 1 order | 1 commande | طلب واحد |
ordersResultsTwo | 2 orders | 2 commandes | طلبان |
ordersResultsOther | {count} orders | {count} commandes | {count} طلب |
ordersResultsMany | {count} orders | {count} commandes | {count} طلبًا |
ordersToday | Today | Aujourd’hui | اليوم |
ordersYesterday | Yesterday | Hier | أمس |
ordersDate | {month} {day} | {day} {month} | {day} {month} |
ordersDateYear | {month} {day}, {year} | {day} {month} {year} | {day} {month} {year} |
ordersMonths | January,February,March,April,May,June,July,August,September,October,November,December | janvier,février,mars,avril,mai,juin,juillet,août,septembre,octobre,novembre,décembre | يناير,فبراير,مارس,أبريل,مايو,يونيو,يوليو,أغسطس,سبتمبر,أكتوبر,نوفمبر,ديسمبر |
ordersStatusPreparing | Preparing | En préparation | قيد التجهيز |
ordersStatusShipped | Shipped | Expédiée | تم الشحن |
ordersStatusDelivered | Delivered | Livrée | تم التوصيل |
ordersStatusCancelled | Cancelled | Annulée | ملغى |
ordersStatusRefunded | Refunded | Remboursée | تم الاسترداد |
ordersEmptyCurrentTitle | No current orders | Aucune commande en cours | لا توجد طلبات جارية |
ordersEmptyPastTitle | No past orders yet | Aucune commande passée | لا توجد طلبات سابقة بعد |
ordersEmptyMessage | Your orders will show here once placed. | Vos commandes s’afficheront ici une fois passées. | ستظهر طلباتك هنا بعد تقديمها. |
ordersBrowse | Browse the catalog | Découvrir le catalogue | تصفّح المتجر |
ordersNoMatchTitle | No order matches “{query}” | Aucune commande ne correspond à « {query} » | لا يوجد طلب يطابق «{query}» |
ordersNoMatchMessage | Search by order number or by item name. | Cherchez par numéro de commande ou par nom d’article. | ابحث برقم الطلب أو باسم المنتج. |
ordersLoadingMore | Loading more orders | Chargement d’autres commandes | جارٍ تحميل المزيد من الطلبات |
ordersMoreFailed | More orders could not load. | La suite n’a pas pu se charger. | تعذّر تحميل المزيد. |
ordersMoreOffline | You are offline. Connect to see more orders. | Vous êtes hors ligne. Connectez-vous pour voir la suite. | أنت غير متصل. اتصل لعرض المزيد. |
ordersEnd | That is all your orders. | Vous avez vu toutes vos commandes. | هذه كل طلباتك. |
ordersRefreshFailed | Your orders could not refresh. | Les commandes n’ont pas pu se mettre à jour. | تعذّر تحديث الطلبات. |
ordersRefreshOffline | You are offline. The orders shown may be out of date. | Vous êtes hors ligne. Les commandes affichées ne sont peut-être pas à jour. | أنت غير متصل. قد لا تكون الطلبات المعروضة محدّثة. |
ordersErrorTitle | Your orders could not load | Impossible de charger les commandes | تعذّر تحميل الطلبات |
ordersErrorMessage | Try again in a moment. | Réessayez dans un instant. | أعد المحاولة بعد قليل. |
ordersOfflineTitle | You are offline | Vous êtes hors ligne | أنت غير متصل |
ordersOfflineMessage | Connect to see your orders. | Connectez-vous pour voir vos commandes. | اتصل لعرض طلباتك. |
ordersRetry | Try again | Ré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.
















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