bolter 3.7.2 copy "bolter: ^3.7.2" to clipboard
bolter: ^3.7.2 copied to clipboard

Most simple and stable ui update instrument

example/lib/main.dart

import 'dart:async';
import 'package:bolter/bolter.dart';
import 'package:flutter/material.dart';
import 'package:equatable/equatable.dart';

void main() {
  runApp(const MyApp());
}

class InterestingBugWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Material(
      child: PresenterProvider(
        presenter: () => InterestingBug(),
        child: Builder(builder: (ctx) {
          final presenter = ctx.presenter<InterestingBug>();
          return BolterBuilder<List<Bundle>?>(
            getter: () => presenter.list,
            builder: (_, value) {
              print(value);
              if (value == null) {
                return const Center(child: CircularProgressIndicator());
              }
              if (value.isEmpty) {
                return Container(
                  color: Colors.green,
                );
              }
              return BolterBuilder<List<int>>(getter: () {
                try {
                  return value.first.items;
                } catch (_) {
                  return [];
                }
              }, builder: (_, value) {
                return Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: value.map((e) {
                    return GestureDetector(
                      onTap: () => presenter.remove(e),
                      child: Container(
                        child: Text(e.toString()),
                        padding: EdgeInsets.all(16),
                        color: Colors.amberAccent,
                      ),
                    );
                  }).toList(),
                );
              });
            },
          );
        }),
      ),
    );
  }
}

class InterestingBug extends Presenter<InterestingBug> {
  List<Bundle>? list = null;

  @override
  void init() {
    Future.delayed(Duration(seconds: 2), () {
      perform(
        action: () => list = [
          Bundle(
            1,
            [1, 2, 3],
          )
        ],
      );
    });
    super.init();
  }

  Bundle bundle(int index) => list![index];

  void remove(int val) {
    perform(
      action: () {
        list!.first.items.remove(val);
        if (list!.first.items.isEmpty) list!.removeAt(0);
      },
    );
  }
}

class Bundle extends Equatable {
  final int id;
  final List<int> items;

  Bundle(this.id, this.items);

  @override
  List<Object?> get props => [id];
}

class MyPresenter extends Presenter<MyPresenter> {
  MyPresenter() {
    print('presenter created');
  }

  void incSync() {
    perform(
      action: () => i++,
      methodSignature: incSync,
    );
  }

  void incAsync() {
    perform(
      action: () async {
        await Future.delayed(const Duration(milliseconds: 1000));
        i++;
      },
      methodSignature: incAsync,
    );
  }

  var i = 0;

  @override
  void init() {
    super.init();
    print('init');
  }

  @override
  FutureOr<void> onLayout() {
    print('onLayout');
  }

  @override
  void dispose() {
    print('dispose');
    super.dispose();
  }
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: InterestingBugWidget(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  late final presenter = context.presenter<MyPresenter>();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            BolterBuilder<bool>(
              getter: () => presenter.processing(presenter.incAsync),
              builder: (_, val) => Text(val.toString()),
            ),
            BolterBuilder<int>(
                getter: () => presenter.i,
                builder: (context, val) {
                  return Text(
                    '$val',
                    style: Theme.of(context).textTheme.headlineMedium,
                  );
                }),
          ],
        ),
      ),
      floatingActionButton: BolterBuilder<bool>(
          getter: () => presenter.processing(presenter.incAsync),
          builder: (context, value) {
            return FloatingActionButton(
              onPressed: value ? null : presenter.incAsync,
              child: const Icon(Icons.add),
            );
          }),
    );
  }
}
7
likes
0
pub points
35%
popularity

Publisher

verified publisherrenesanse.net

Most simple and stable ui update instrument

Repository (GitHub)
View/report issues

License

unknown (LICENSE)

Dependencies

equatable, flutter

More

Packages that depend on bolter