nrb 1.0.9
nrb: ^1.0.9 copied to clipboard
A Flutter package for building structured and customizable report layouts.
example/lib/main.dart
import 'dart:io' show Directory, File;
import 'package:flutter/foundation.dart' show kIsWeb;
import 'package:flutter/material.dart';
import 'package:nrb/nrb.dart';
void main() {
runApp(MyReportBuilderApp());
}
class MyReportBuilderApp extends StatefulWidget {
const MyReportBuilderApp({super.key});
@override
State<MyReportBuilderApp> createState() => _MyReportBuilderAppState();
}
class _MyReportBuilderAppState extends State<MyReportBuilderApp> {
final List<HeaderCell> headers = [
HeaderCell(text: "Secondary", span: 3, backgroundColor: Colors.green),
HeaderCell(text: "Primary", span: 3, backgroundColor: Colors.green),
];
final List<SubHeaderCell> subHeaders = [
SubHeaderCell(text: "Target", backgroundColor: Colors.green,),
SubHeaderCell(text: "Actual", backgroundColor: Colors.green,),
SubHeaderCell(text: "%", backgroundColor: Colors.green,),
SubHeaderCell(text: "Target", backgroundColor: Colors.green),
SubHeaderCell(text: "Actual", backgroundColor: Colors.green),
SubHeaderCell(text: "%", backgroundColor: Colors.green),
];
final leftColumns = [
TextCell(itemContent: "01-Nov-2025"),
TextCell(itemContent: "02-Nov-2025"),
TextCell(itemContent: "03-Nov-2025"),
TextCell(itemContent: "04-Nov-2025"),
TextCell(itemContent: "05-Nov-2025"),
TextCell(itemContent: "06-Nov-2025"),
TextCell(itemContent: "07-Nov-2025"),
TextCell(itemContent: "08-Nov-2025"),
TextCell(itemContent: "09-Nov-2025"),
TextCell(itemContent: "10-Nov-2025"),
TextCell(itemContent: "11-Nov-2025"),
TextCell(itemContent: "12-Nov-2025"),
TextCell(itemContent: "13-Nov-2025"),
TextCell(itemContent: "14-Nov-2025"),
TextCell(itemContent: "15-Nov-2025"),
TextCell(itemContent: "16-Nov-2025"),
TextCell(itemContent: "17-Nov-2025"),
TextCell(itemContent: "18-Nov-2025"),
TextCell(itemContent: "19-Nov-2025"),
TextCell(itemContent: "20-Nov-2025"),
TextCell(itemContent: "24-Nov-2025"),
TextCell(itemContent: "25-Nov-2025"),
TextCell(itemContent: "26-Nov-2025"),
TextCell(itemContent: "27-Nov-2025"),
TextCell(itemContent: "28-Nov-2025"),
TextCell(itemContent: "29-Nov-2025"),
TextCell(itemContent: "30-Nov-2025"),
];
final tableData = [
[
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextFieldCell(initialValue: "85.07%"),
],
[
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
],
[
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
],
[
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
],
[
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
],
[
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
],
[
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
],
[
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
],
[
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
],
[
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
],
[
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
],
[
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
],
[
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
],
[
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
],
[
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
],
[
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
],
[
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
],
[
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
],
[
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
],
[
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
],
[
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
],
[
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
],
[
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
],
[
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
],
[
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
],
[
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
],
[
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
TextCell(itemContent: "10,99,493", textAlignment: Alignment.centerRight),
TextCell(itemContent: "9,34,839", textAlignment: Alignment.centerRight),
TextCell(itemContent: "85.07%"),
],
];
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(primarySwatch: Colors.blue),
home: Scaffold(
appBar: AppBar(title: const Text('Report Builder')),
body: ReportMaker(
headers: headers,
subHeaders: subHeaders,
leftColumn: leftColumns,
tableData: tableData,
stickyHeaderLabel: "Tran",
stickyHeaderBackgroundColor: Colors.green,
enableDownload: true,
onDownloadCompleted: (bytes, fileName) async {
if (kIsWeb) {
// WebSaveHelper.saveFile(bytes, fileName);
} else {
// MOBILE/DESKTOP LOGIC (dart:io is safe here)
final directory = Directory('/storage/emulated/0/Download');
if (!await directory.exists()) {
await directory.create(recursive: true);
}
final file = File('${directory.path}/$fileName');
await file.writeAsBytes(bytes);
}
},
),
),
);
}
}