Blocks / commerce
Order row
Shows an order in a list with the photo of its first item, its number, date, item count and total, and its status written in words, read as one node.
Import
Order row 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 order-rowExamples
Preparing
An order in a list of orders: number, date, items and total, and its status as a badge. statusColor says how it is going: warning while it is prepared.
import 'package:your_app/ui/fliin/components/badge/fl_badge.dart';
import 'package:your_app/ui/fliin/components/list_row/fl_list_row.dart';
import 'package:your_app/ui/fliin/components/order_row/fl_order_row.dart';
import 'package:your_app/ui/fliin/components/result_card/fl_result_card.dart';
import 'package:flutter/widgets.dart';
class OrderRowPreparingExample extends StatelessWidget {
const OrderRowPreparingExample({super.key});
@override
Widget build(BuildContext context) {
return FlListGroup(
children: [
FlOrderRow(
title: 'Order FL-2026-10511',
subtitle: 'Today · 1 item · €24.90',
status: 'Preparing',
statusColor: FlBadgeColor.warning,
media: const FlResultImage(image: FlSampleImage(FlSampleArt.bottle)),
itemCount: 1,
itemCountLabel: '1',
onPressed: () {},
),
],
);
}
}Shipped
A shipped order, in accent. itemCount puts the number of items on the picture when there are several.
import 'package:your_app/ui/fliin/components/badge/fl_badge.dart';
import 'package:your_app/ui/fliin/components/list_row/fl_list_row.dart';
import 'package:your_app/ui/fliin/components/order_row/fl_order_row.dart';
import 'package:your_app/ui/fliin/components/result_card/fl_result_card.dart';
import 'package:flutter/widgets.dart';
class OrderRowShippedExample extends StatelessWidget {
const OrderRowShippedExample({super.key});
@override
Widget build(BuildContext context) {
return FlListGroup(
children: [
FlOrderRow(
title: 'Order FL-2026-10482',
subtitle: 'October 22 · 4 items · €137.90',
status: 'Shipped',
statusColor: FlBadgeColor.accent,
media: const FlResultImage(image: FlSampleImage(FlSampleArt.bag)),
itemCount: 4,
itemCountLabel: '4',
onPressed: () {},
),
],
);
}
}Delivered
A delivered order, in success.
import 'package:your_app/ui/fliin/components/badge/fl_badge.dart';
import 'package:your_app/ui/fliin/components/list_row/fl_list_row.dart';
import 'package:your_app/ui/fliin/components/order_row/fl_order_row.dart';
import 'package:your_app/ui/fliin/components/result_card/fl_result_card.dart';
import 'package:flutter/widgets.dart';
class OrderRowDeliveredExample extends StatelessWidget {
const OrderRowDeliveredExample({super.key});
@override
Widget build(BuildContext context) {
return FlListGroup(
children: [
FlOrderRow(
title: 'Order FL-2026-10307',
subtitle: 'October 3 · 2 items · €89.00',
status: 'Delivered',
statusColor: FlBadgeColor.success,
media: const FlResultImage(image: FlSampleImage(FlSampleArt.lamp)),
itemCount: 2,
itemCountLabel: '2',
onPressed: () {},
),
],
);
}
}Cancelled
A cancelled order, in neutral: it is over, nothing to watch.
import 'package:your_app/ui/fliin/components/badge/fl_badge.dart';
import 'package:your_app/ui/fliin/components/list_row/fl_list_row.dart';
import 'package:your_app/ui/fliin/components/order_row/fl_order_row.dart';
import 'package:your_app/ui/fliin/components/result_card/fl_result_card.dart';
import 'package:flutter/widgets.dart';
class OrderRowCancelledExample extends StatelessWidget {
const OrderRowCancelledExample({super.key});
@override
Widget build(BuildContext context) {
return FlListGroup(
children: [
FlOrderRow(
title: 'Order FL-2026-10215',
subtitle: 'September 28 · 1 item · €39.00',
status: 'Cancelled',
statusColor: FlBadgeColor.neutral,
media: const FlResultImage(image: FlSampleImage(FlSampleArt.mug)),
itemCount: 1,
itemCountLabel: '1',
onPressed: () {},
),
],
);
}
}Refunded
A refunded order, in neutral as well.
import 'package:your_app/ui/fliin/components/badge/fl_badge.dart';
import 'package:your_app/ui/fliin/components/list_row/fl_list_row.dart';
import 'package:your_app/ui/fliin/components/order_row/fl_order_row.dart';
import 'package:your_app/ui/fliin/components/result_card/fl_result_card.dart';
import 'package:flutter/widgets.dart';
class OrderRowRefundedExample extends StatelessWidget {
const OrderRowRefundedExample({super.key});
@override
Widget build(BuildContext context) {
return FlListGroup(
children: [
FlOrderRow(
title: 'Order FL-2026-10102',
subtitle: 'September 12 · 1 item · €59.00',
status: 'Refunded',
statusColor: FlBadgeColor.neutral,
media: const FlResultImage(image: FlSampleImage(FlSampleArt.throwBlanket)),
itemCount: 1,
itemCountLabel: '1',
onPressed: () {},
),
],
);
}
}Icons
statusIcon puts an icon before the status word, in its chip: pick one per status, the word still says it.
import 'package:your_app/ui/fliin/components/badge/fl_badge.dart';
import 'package:your_app/ui/fliin/components/list_row/fl_list_row.dart';
import 'package:your_app/ui/fliin/components/order_row/fl_order_row.dart';
import 'package:your_app/ui/fliin/components/result_card/fl_result_card.dart';
import 'package:your_app/ui/fliin/core/fliin.dart';
import 'package:your_app/ui/fliin/icons/fl_icons.dart';
import 'package:flutter/widgets.dart';
class OrderRowIconsExample extends StatelessWidget {
const OrderRowIconsExample({super.key});
@override
Widget build(BuildContext context) {
return FlListGroup(
children: [
FlOrderRow(
title: 'Order 10511',
subtitle: 'October 26 · €24.90',
status: 'Preparing',
statusColor: FlBadgeColor.warning,
statusIcon: FlIcon(FlIcons.clock),
media: const FlResultImage(image: FlSampleImage(FlSampleArt.bottle)),
onPressed: () {},
),
FlOrderRow(
title: 'Order 10482',
subtitle: 'October 22 · €137.90',
status: 'Shipped',
statusColor: FlBadgeColor.accent,
statusIcon: FlIcon(FlIcons.paperPlane),
media: const FlResultImage(image: FlSampleImage(FlSampleArt.bag)),
itemCount: 4,
onPressed: () {},
),
FlOrderRow(
title: 'Order 10307',
subtitle: 'October 3 · €89.00',
status: 'Delivered',
statusColor: FlBadgeColor.success,
statusIcon: FlIcon(FlIcons.check),
media: const FlResultImage(image: FlSampleImage(FlSampleArt.lamp)),
onPressed: () {},
),
],
);
}
}Usage
The code the reference images render:
final example = ColoredBox(
color: FlScope.of(context).colors.surface,
child: SingleChildScrollView(
padding: EdgeInsetsDirectional.all(FlScope.of(context).space.lg),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
FlListGroup(
children: [
FlOrderRow(
title: (variant.dir == TextDirection.rtl
? "الطلب \u2068FL-2026-10511\u2069"
: "Order FL-2026-10511"),
subtitle: (variant.dir == TextDirection.rtl
? "٢٦ أكتوبر · منتج واحد · \u206624٫90 €\u2069"
: "October 26 · 1 item · €24.90"),
status: (variant.dir == TextDirection.rtl
? "قيد التجهيز"
: "Preparing"),
statusColor: FlBadgeColor.warning,
media: const FlResultImage(
image: FlSampleImage(FlSampleArt.bottle),
),
onPressed: () {},
),
FlOrderRow(
title: (variant.dir == TextDirection.rtl
? "الطلب \u2068FL-2026-10482\u2069"
: "Order FL-2026-10482"),
subtitle: (variant.dir == TextDirection.rtl
? "٢٢ أكتوبر · ٤ منتجات · \u2066137٫90 €\u2069"
: "October 22 · 4 items · €137.90"),
status: (variant.dir == TextDirection.rtl
? "تم الشحن"
: "Shipped"),
statusColor: FlBadgeColor.accent,
media: const FlResultImage(image: FlSampleImage(FlSampleArt.bag)),
itemCount: 4,
itemCountLabel: (variant.dir == TextDirection.rtl ? "٤" : "4"),
onPressed: () {},
),
FlOrderRow(
title: (variant.dir == TextDirection.rtl
? "الطلب \u2068FL-2026-10307\u2069"
: "Order FL-2026-10307"),
subtitle: (variant.dir == TextDirection.rtl
? "٣ أكتوبر · منتجان · \u206689٫00 €\u2069"
: "October 3 · 2 items · €89.00"),
status: (variant.dir == TextDirection.rtl
? "تم التوصيل"
: "Delivered"),
statusColor: FlBadgeColor.success,
media: const FlResultImage(
image: FlSampleImage(FlSampleArt.lamp),
),
itemCount: 2,
itemCountLabel: (variant.dir == TextDirection.rtl ? "٢" : "2"),
onPressed: () {},
),
FlOrderRow(
title: (variant.dir == TextDirection.rtl
? "الطلب \u2068FL-2026-10215\u2069"
: "Order FL-2026-10215"),
subtitle: (variant.dir == TextDirection.rtl
? "٢٨ سبتمبر · منتج واحد · \u206639٫00 €\u2069"
: "September 28 · 1 item · €39.00"),
status: (variant.dir == TextDirection.rtl ? "ملغى" : "Cancelled"),
statusColor: FlBadgeColor.neutral,
media: const FlResultImage(image: FlSampleImage(FlSampleArt.mug)),
onPressed: () {},
),
FlOrderRow(
title: (variant.dir == TextDirection.rtl
? "الطلب \u2068FL-2026-10102\u2069"
: "Order FL-2026-10102"),
subtitle: (variant.dir == TextDirection.rtl
? "١٢ سبتمبر · منتج واحد · \u206659٫00 €\u2069"
: "September 12 · 1 item · €59.00"),
status: (variant.dir == TextDirection.rtl
? "تم الاسترداد"
: "Refunded"),
statusColor: FlBadgeColor.neutral,
media: const FlResultImage(
image: FlSampleImage(FlSampleArt.throwBlanket),
),
onPressed: () {},
),
],
),
],
),
),
);API
FlOrderRow: class extends StatelessWidget
FlOrderRow.new: const new({super.key, required String title, required String subtitle, required String status, FlBadgeColor statusColor, Widget? media, int itemCount, String? itemCountLabel, VoidCallback? onPressed, Widget? statusIcon})
FlOrderRow.title: get String
FlOrderRow.subtitle: get String
FlOrderRow.status: get String
FlOrderRow.statusColor: get FlBadgeColor
FlOrderRow.media: get Widget?
FlOrderRow.itemCount: get int
FlOrderRow.itemCountLabel: get String?
FlOrderRow.onPressed: get VoidCallback?
FlOrderRow.statusIcon: get Widget?
FlOrderRow.build: Widget(BuildContext context)Reference renders
The 16 images published with version 0.2.2, rendered by the shared harness on macOS with Flutter 3.47.7. fliin verify order-row compares your copy to them.
















Use it to
- show a customer's past purchases with their number
- show the status of a purchase in plain words
- present the day, total and item count of a purchase
- open the details of a tapped purchase
- show the photo of the first item of a purchase
- Not for
- a cart item with its quantity: use a cart line (cart-line)
- a payment or a bank transfer: use a transaction row (transaction-row)
- States