bolter_flutter 7.0.4 bolter_flutter: ^7.0.4 copied to clipboard
based on bolter library extensions for manage widgets updates
import 'dart:async';
import 'dart:math';
import 'package:bolter_flutter/bolter_flutter.dart';
import 'package:flutter/material.dart';
enum Example {
simpleCounter("simpleCounter"),
presenterCounter("presenterCounter"),
performance("performance");
final String value;
const Example(this.value);
static Example fromStr(String val) {
return values.firstWhere((element) => element.value == val);
}
}
void main(List<String> args) {
kProfileBolterPerformanceLogging = true;
late final Widget child;
const t = String.fromEnvironment("type");
if (t.isEmpty) {
child = VerySimpleExample();
} else {
final type = Example.fromStr(t);
switch (type) {
case Example.simpleCounter:
child = VerySimpleExample();
break;
case Example.presenterCounter:
child = PresenterProvider(
presenter: CounterPresenter(),
child: const CounterScreen(),
);
break;
case Example.performance:
child = PresenterProvider(
presenter: ExamplePerformancePresenter(),
child: const ExamplePerformance(),
);
break;
}
}
runApp(
MaterialApp(
debugShowCheckedModeBanner: false,
home: child,
),
);
}
class CounterPresenter extends Presenter<CounterPresenter> {
int _count = 0;
int get count => _count;
void increment() {
perform(action: () => _count++);
}
}
class CounterScreen extends StatelessWidget {
const CounterScreen({super.key});
@override
Widget build(BuildContext context) {
final presenter = context.presenter<CounterPresenter>();
return Scaffold(
appBar: AppBar(title: const Text('Counter')),
body: Center(
child: BolterBuilder(
getter: () => presenter.count,
builder: (context, count) => Text('Count: $count'),
),
),
floatingActionButton: FloatingActionButton(
onPressed: presenter.increment,
child: const Icon(Icons.add),
),
);
}
}
const size = 10000000;
class ExamplePerformancePresenter
extends Presenter<ExamplePerformancePresenter> {
final updates = List.generate(size, (index) => index, growable: false);
late final rnd = Random();
void refresh() {
final v = rnd.nextInt(10);
perform(
action: () {
// final t = DateTime.now();
for (var index = 0; index < updates.length; index++) {
updates[index] = v;
}
// print(DateTime.now().difference(t).inMilliseconds);
},
);
}
}
class ExamplePerformance extends StatefulWidget {
const ExamplePerformance({Key? key}) : super(key: key);
@override
State<ExamplePerformance> createState() => _ExamplePerformanceState();
}
class _ExamplePerformanceState extends State<ExamplePerformance> {
late final presenter = context.presenter<ExamplePerformancePresenter>();
@override
void initState() {
Timer.periodic(const Duration(milliseconds: 200), (timer) {
presenter.refresh();
});
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Bolter Flutter Example'),
),
body: GridView.builder(
itemCount: size,
addRepaintBoundaries: false,
addAutomaticKeepAlives: false,
addSemanticIndexes: false,
gridDelegate:
const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 20),
itemBuilder: (_, index) {
return BolterBuilder(
getter: () => presenter.updates[index],
builder: (_, val) => ColoredBox(
color: Colors.cyan,
child: Text(
val.toString(),
style: const TextStyle(color: Colors.white),
),
),
);
},
),
);
}
}
//ignore: must_be_immutable
class VerySimpleExample extends StatelessWidget {
VerySimpleExample({super.key});
var value = 0;
@override
Widget build(BuildContext context) {
return Scaffold(
floatingActionButton: FloatingActionButton(
onPressed: () {
defaultBolter.runAndUpdate(action: () {
value++;
});
},
),
body: Center(
child: BolterBuilder(
getter: () => value,
builder: (ctx, value) => Text(value.toString()),
),
),
);
}
}