Zum Hauptinhalt springen
Echtzeit-Radar & Feeds
Alle RSS Feeds ➔
👥 Community & Social
Windows Tipps & SecurityGrafikkarte vor Überhitzung schützen: So geht’s(25.09.2026 um 08:00 Uhr)
••••••••••
Windows Tipps & SecurityGrafikkarte vor Überhitzung schützen: So geht’s(25.09.2026 um 08:00 Uhr)
••••••••••
Intelligence View
⚡ tsecurity.de Intelligence

Building an MS Project-Style Gantt Chart in Flutter Web — CustomPaint with Synchronized Scrolling

Building an MS Project-Style Gantt Chart in Flutter Web The Goal Visualize WBS (Work Breakdown Structure) progress with a synchronized task list on the left and a scrollable timeline on the right — like MS Project, but in F…

0
↗ Quelle (dev.to)
Reagiere als Erste:r — dein Feedback zählt!




Building an MS Project-Style Gantt Chart in Flutter Web






The Goal



Visualize WBS (Work Breakdown Structure) progress with a synchronized task list on the left and a scrollable timeline on the right — like MS Project, but in Flutter Web.






Architecture






Row(
children: [
// Left pane: task names and assignees (fixed width)
SizedBox(width: 300, child: TaskListPane()),
// Right pane: timeline bars (horizontally scrollable)
Expanded(child: TimelinePane()),
],
)






Two ScrollController instances linked together keep vertical scroll synchronized between panes.






Implementation






Synchronized Scrolling






class _GanttChartPageState extends State<GanttChartPage> {
final _leftVertical = ScrollController();
final _rightVertical = ScrollController();

@override
void initState() {
super.initState();
_leftVertical.addListener(() {
if (_rightVertical.offset != _leftVertical.offset) {
_rightVertical.jumpTo(_leftVertical.offset);
}
});
_rightVertical.addListener(() {
if (_leftVertical.offset != _rightVertical.offset) {
_leftVertical.jumpTo(_rightVertical.offset);
}
});
}
}









Drawing Gantt Bars with CustomPaint






class GanttBarPainter extends CustomPainter {
final List<WbsTask> tasks;
final DateTime startDate;
final double dayWidth;

@override
void paint(Canvas canvas, Size size) {
final paint = Paint();

for (int i = 0; i < tasks.length; i++) {
final task = tasks[i];
final y = i * 40.0 + 8;
final startX = task.startDate.difference(startDate).inDays * dayWidth;
final barWidth = task.duration.inDays * dayWidth;

// Background bar
paint.color = _progressColor(task.progressRate).withAlpha(80);
canvas.drawRRect(
RRect.fromRectAndRadius(
Rect.fromLTWH(startX, y, barWidth, 24),
const Radius.circular(4),
),
paint,
);

// Progress fill
paint.color = _progressColor(task.progressRate);
canvas.drawRRect(
RRect.fromRectAndRadius(
Rect.fromLTWH(startX, y, barWidth * task.progressRate / 100, 24),
const Radius.circular(4),
),
paint,
);
}
}

Color _progressColor(int progress) {
if (progress >= 100) return const Color(0xFF4CAF50); // done: green
if (progress >= 50) return const Color(0xFFFF9800); // in progress: orange
return const Color(0xFFFF5722); // behind: red
}

@override
bool shouldRepaint(GanttBarPainter old) =>
old.tasks != tasks || old.startDate != startDate;
}









WbsTask Model






class WbsTask {
final String id;
final String title;
final String? assignee;
final DateTime startDate;
final Duration duration;
final int progressRate; // 0-100
final List<String> dependencies;
}









Supabase Schema






CREATE TABLE wbs_tasks (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
title text NOT NULL,
start_date date NOT NULL,
end_date date NOT NULL,
progress_rate int DEFAULT 0 CHECK (progress_rate BETWEEN 0 AND 100),
dependencies uuid[],
user_id uuid REFERENCES auth.users(id)
);









Gotchas






shouldRepaint performance



Returning true always causes per-frame repaints. Check if data actually changed:




@override
bool shouldRepaint(GanttBarPainter old) =>
old.tasks != tasks || old.startDate != startDate;









Alignment between header and bars



The date header (month/day labels) and the actual bar positions must use the same startDate and dayWidth constant. Compute both in the parent widget and pass them down.






Conclusion



Flutter Web's CustomPaint handles complex visualizations that existing widgets can't. For Gantt charts with custom grid layouts, painting from scratch gives you full control — and the performance is fine for typical WBS sizes (< 200 tasks).






Building in public: https://my-web-app-b67f4.web.app/






Flutter #CustomPaint #buildinpublic #WBS

1. Sofort-Triage & Abwehrmaßnahmen

SOC Incident Playbook: Vulnerability Remediation & Verification
Syntax validiert (0 Fehler)
title: Detect Exploitation - Building an MS Project-Style Gantt Chart in Flutter Web — CustomPaint with Synchronized Scrolling
id: ad5531fe-27a0-4650-ac03-0839c578f097
status: experimental
description: Automatisch generierte SIEM-Erkennungsregel basierend auf CTI Intelligence
references:
  - https://tsecurity.de/
author: iShareStuff CTI Automated Detection Engine
date: 2026-09-26
logsource:
  category: network_connection
  product: any
detection:
  selection:
      CommandLine|contains:
        - 'exploit'
  condition: selection
falsepositives:
  - Legitime administrative Zugriffe oder Penetrationstests
level: high
tags:
  - attack.initial_access
Syntax validiert (0 Fehler)
rule CTI_Threat_Indicator {
    meta:
        author = "iShareStuff CTI Automated Detection Engine"
        date = "2026-09-26"
        description = "YARA Signature for "
    strings:
        $str = "Building an MS Project-Style G" ascii wide
    condition:
        any of them
}
Syntax validiert (0 Fehler)
index=security sourcetype IN ("cisco:asa", "pan:traffic", "zeek_conn", "suricata", "WinEventLog:Security")
("Building an MS Project-Style Gantt Chart")
| stats count earliest(_time) as first_seen latest(_time) as last_seen by src_ip, dest_ip, dest_host, signature
| eval first_seen=strftime(first_seen, "%Y-%m-%d %H:%M:%S"), last_seen=strftime(last_seen, "%Y-%m-%d %H:%M:%S")
| sort - count
Syntax validiert (0 Fehler)
message: "*Building an MS Project-Style Gantt Chart*"
Syntax validiert (0 Fehler)
CommonSecurityLog
| where Message has "Building an MS Project-Style Gantt Chart"
| summarize EventCount = count(), FirstSeen = min(TimeGenerated), LastSeen = max(TimeGenerated) by SourceIP, DestinationIP, DestinationPort, Activity
| extend DetectionRule = "iShareStuff-CTI-Compiled"
| sort by EventCount desc

2. Cyber Threat Intelligence & Forensik

🎯
MITRE ATT&CK Matrix Navigator 14 Taktiken
Reconnaissance
-
Resource Development
-
Initial Access
Execution
Persistence
-
Privilege Escalation
Defense Evasion
Credential Access
-
Discovery
-
Lateral Movement
-
Collection
-
Command and Control
Exfiltration
-
Impact
tsecurity.de Cognitive Threat RAG
Fokus-Vektor:

Kognitive Analyse für identifizierte Bedrohung: Erhöhte Bedrohungslage im Bereich Building an MS Project-Style Gantt Chart.... Basierend auf 368k Vektor-Korrelationen werden sofortige Isolationsmaßnahmen für betroffene Endpunkte empfohlen.

🛡️ Angriffsfläche & Exposure

Netzwerk/Remote-Zugriff ohne Vorauthentifizierung möglich.

⚡ Empfohlene Sofortmaßnahmen
  • 1. Perimeter-Inspektion: Relevante Portfreigaben und exponierte Endpunkte unverzüglich scannen.
  • 2. Patch-Applikation: Hersteller-Hotfix einspielen oder betroffene Daemons in isolierte DMZ-Segmente überführen.
  • 3. Telemetrie & EDR-Alerts: Prozessaufrufe und Child-Processes auf anomale Shell-Spawns überwachen.
🔗 Semantisch verwandte Zero-Days MariaDB 11.7 VEC
Ähnliche Beiträge
🔍 Verwandte News

Auch interessante Nachrichten Building an MS Project-Style Gantt Chart in Flutter Web — CustomPaint with Synchronized Scrolling

Thematisch verwandte Begriffe: Building, ProjectStyle, Gantt, Chart · 6 Treffer

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Zum Aktualisieren ziehen
ZERO-DAY CVE-2026-88003 | InvoicePlane is a self-hosted open source application for managing invoi…
Advisory →
tsecurity.de Icon
Offline-Lesen, Eilmeldungen & 0ms Ladezeit

Installiere tsecurity.de direkt auf deinen Home-Bildschirm für das ultimative Vollbild-Magazinerlebnis ohne Browser-Leisten.

Nächster Beitrag