Full Context
Features
- Inject variables with Factories;
- Provide variables in
FullContextwidget; - Manipulate variables in
contextdirectly.
Getting started
import 'package:flutter/material.dart';
import 'package:full_context/full_context.dart';
class FCExample extends StatelessWidget {
const FCExample({super.key});
@override
Widget build(BuildContext context) => FullContext(
listenables: [String],
loadingBuilder: (context) =>
const Center(child: CircularProgressIndicator()),
factories: [
() async {
final duration = const Duration(seconds: 2);
await Future.delayed(duration);
return 1;
},
(int number) => number.toString(),
],
builder: (context) => InkWell(
onTap: () => context.emit<int>(context.get<int>() + 1),
child: Text(context.get<String>()),
),
);
}
Usage
required builder
Provide a context:
import 'package:flutter/widgets.dart';
import 'package:full_context/full_context.dart';
class FCBuilderExample extends StatelessWidget {
const FCBuilderExample({super.key});
@override
Widget build(BuildContext context) {
return FullContext(builder: (context) => Text('Hello world!'));
}
}
factories and context.get():
Provide variables in context and use:
import 'package:flutter/widgets.dart';
import 'package:full_context/full_context.dart';
class FCFactoriesExample extends StatelessWidget {
const FCFactoriesExample({super.key});
@override
Widget build(BuildContext context) {
return FullContext(
factories: [() => 'Hello world!'],
builder: (context) => Text(context.get<String>()),
);
}
}
listenables and context.emit()
Manipulate variables and listen for changes:
import 'package:flutter/material.dart';
import 'package:full_context/full_context.dart';
class FCListenablesExample extends StatelessWidget {
const FCListenablesExample({super.key});
@override
Widget build(BuildContext context) {
return FullContext(
listenables: [String],
factories: [() => 'Hello world!'],
builder: (context) => InkWell(
onTap: () => context.emit<String>('Hello again!'),
child: Text(context.get<String>()),
),
);
}
}
- If you do not use
listenables,context.emit()will not be listenable and changes fromcontext.get()will not be shown.
async with loadingBuilder and errorBuilder
context.get() and context.emit() are only avaliable after the Future is completed:
import 'package:flutter/material.dart';
import 'package:full_context/full_context.dart';
class FCAsyncExample extends StatelessWidget {
const FCAsyncExample({super.key});
@override
Widget build(BuildContext context) {
return FullContext(
listenables: [String],
factories: [
() async {
final duration = const Duration(seconds: 2);
await Future.delayed(duration);
return 'Hello world!';
},
],
loadingBuilder: (context) => const CircularProgressIndicator(),
errorBuilder: (context, error) => Text('Error: $error'),
builder: (context) => InkWell(
onTap: () => context.emit<String>('Hello again!'),
child: Text(context.get<String>()),
),
);
}
}
- If you do not use
loadingBuilderorerrorBuilder,SizedBox.shrink()will be used respectively.
Additional info
Inject Example
import 'package:flutter/material.dart';
import 'package:full_context/full_context.dart';
class Entity {
Entity({required this.id, required this.name});
final int id;
final String name;
String get display => '$name $idÂș';
}
class Dal {
final List<Entity> _entities = [Entity(id: 1, name: 'Hello world!')];
Future<List<Entity>> getAll() async {
final duration = const Duration(milliseconds: 500);
await Future.delayed(duration);
return _entities;
}
void add(Entity entity) => _entities.add(entity);
}
class Repository {
Repository(this.dal);
final Dal dal;
Future<List<Entity>> getAll() async {
final duration = const Duration(milliseconds: 500);
await Future.delayed(duration);
return dal.getAll();
}
void add(Entity entity) => dal.add(entity);
}
class Service {
Service(this.repository);
final Repository repository;
Future<List<Entity>> getAll() async {
final duration = const Duration(milliseconds: 500);
await Future.delayed(duration);
return repository.getAll();
}
void add(Entity entity) => repository.add(entity);
}
class Controller {
Controller(this.service);
final Service service;
Future<List<Entity>> getAll() async {
final duration = const Duration(milliseconds: 500);
await Future.delayed(duration);
return service.getAll();
}
Future<void> add(BuildContext context) async {
context.emit<bool>(false);
final model = context.get<List<Entity>>();
final entity = Entity(id: model.length + 1, name: 'Hello world!');
service.add(entity);
final newModel = await service.getAll();
if (!context.mounted) return;
context.emit<List<Entity>>(newModel);
context.emit<bool>(true);
}
}
class FCInjectExample extends StatelessWidget {
const FCInjectExample({super.key});
@override
Widget build(BuildContext context) => FullContext(
listenables: [bool, List<Entity>],
factories: [
Dal.new,
() => true,
Service.new,
Controller.new,
Repository.new,
(Controller controller) => controller.getAll(),
],
loadingBuilder: (context) {
return const Center(child: CircularProgressIndicator());
},
builder: (context) {
final enabled = context.get<bool>();
final model = context.get<List<Entity>>();
final controller = context.get<Controller>();
return InkWell(
onTap: enabled ? () => controller.add(context) : null,
child: ListView.builder(
shrinkWrap: true,
itemCount: model.length,
itemBuilder: (context, index) {
final entity = model[index];
return ListTile(title: Text(entity.display));
},
),
);
},
);
}
Creator Info
Hello, my name is Lucas and I am the creator of this package. I am Brazilian and I intend to continuously improve this package.