Understaing State & Updating UI

Who Owns the State? Callbacks & typedef Parent ↔ Child Communication code snippet import 'dart:math'; import 'package:flutter/material.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( theme: ThemeData(colorScheme: .fromSeed(seedColor: Colors.deepPurple)), home: const MyHomePage(), ); } } class MyHomePage extends StatefulWidget { const MyHomePage({super.key}); @override State<MyHomePage> createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { int _counter = 0; @override Widget build(BuildContext context) { return Scaffold( body: Column( crossAxisAlignment: .stretch, children: [ SectionView( onTap: (v) async { _counter = v; setState(() {}); return "Something went wrong"; }, ), Text( _counter.toString(), style: TextStyle(fontSize: 55), textAlign: .center, ), SectionView( increment: false, onTap: (n) async { _counter = n; await Future.delayed(Duration(seconds: 2)); setState(() {}); return ""; }, ), ], ), ); } } typedef OnSectionViewChange = Future<String> Function(int); class SectionView extends StatefulWidget { const SectionView({super.key, this.increment = true, required this.onTap}); final bool increment; final OnSectionViewChange onTap; @override State<SectionView> createState() => _SectionViewState(); } class _SectionViewState extends State<SectionView> { bool isLoading = false; String errMsg = ""; Future<void> onTap() async { isLoading = true; setState(() {}); Random random = Random(); final number = random.nextInt(4444); errMsg = await widget.onTap(widget.increment ? number : number * -1); isLoading = false; setState(() {}); } @override Widget build(BuildContext context) { return Expanded( child: Material( color: widget.increment ? Colors.blueAccent : Colors.redAccent, child: Center( child: Column( mainAxisSize: .min, children: [ Text(errMsg), InkWell( onTap: isLoading ? null : onTap, child: isLoading ? Center(child: CircularProgressIndicator()) : Icon( widget.increment ? Icons.add : Icons.remove, size: 55, ), ), ], ), ), ), ); } } Why AlertDialog/BottomSheet UI doesn’t update even with setState Widget state 03 ...

FutureBuilder & StreamBuilder

FutureBuilder Learn Async Data & avoid common mistakes. future codeSnippet import 'dart:math'; import 'package:flutter/material.dart'; void main() => runApp( const MaterialApp(debugShowCheckedModeBanner: false, home: MyHomePage()), ); class MyHomePage extends StatefulWidget { const MyHomePage({super.key}); @override State<MyHomePage> createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { //... Future<int> fetchData() async { await Future.delayed(Duration(seconds: 4)); final number = Random().nextInt(100); return number; } late Future<int> future = fetchData(); @override Widget build(BuildContext context) { return Scaffold( body: Center( child: FutureBuilder<int>( future: future, initialData: 100, builder: (context, AsyncSnapshot snapshot) { if (snapshot.hasError) { return Text(snapshot.error?.toString() ?? ""); } return Column( mainAxisSize: .min, children: [ if (snapshot.connectionState == ConnectionState.waiting) CircularProgressIndicator(), Text(snapshot.data.toString()), ], ); }, ), ), ); } } StreamBuilder Flutter’s Stream and StreamBuilder in detail. It also shows StreamController, StreamSubscription, stream error handling, single-subscription issue and event management with practical examples. ...

App-State with Provider

This video covers Provider in Flutter, including ChangeNotifier, ProxyProvider, FutureProvider, StreamProvider, DevTools, and common Provider mistakes. Code Clone the starter codebase Switch to the provider-start branch Continue from there Or just watch the video: Shared_preference Persistent theme with Shared_preference.