81 lines
2.5 KiB
Dart
81 lines
2.5 KiB
Dart
// Copyright (C) 2022 WYATT GROUP
|
|
// Please see the AUTHORS file for details.
|
|
//
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// any later version.
|
|
//
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
import 'package:flutter/widgets.dart';
|
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
|
|
|
/// A utility class that provides a way to create a [BlocProvider] or
|
|
/// [RepositoryProvider] with a [Bloc] or Repository that is already
|
|
/// available in the widget tree.
|
|
abstract class SmartProvider {
|
|
/// Creates a [BlocProvider] with a [Bloc] that is possibly already
|
|
/// available in the widget tree.
|
|
static BlocProvider<Bloc>
|
|
bloc<Bloc extends BlocBase<State>, State extends Object>(
|
|
BuildContext context, {
|
|
required Bloc Function(BuildContext) create,
|
|
required Bloc Function(BuildContext, Bloc) init,
|
|
Widget? child,
|
|
bool lazy = true,
|
|
bool enable = true,
|
|
}) {
|
|
if (enable) {
|
|
final bloc = context.read<Bloc?>();
|
|
if (bloc != null) {
|
|
final b = bloc;
|
|
return BlocProvider<Bloc>.value(
|
|
value: init(context, b),
|
|
child: child,
|
|
);
|
|
}
|
|
}
|
|
|
|
return BlocProvider<Bloc>(
|
|
lazy: lazy,
|
|
create: (_) => init(context, create(context)),
|
|
child: child,
|
|
);
|
|
}
|
|
|
|
/// Creates a [RepositoryProvider] with a Repository that is possibly
|
|
/// already available in the widget tree.
|
|
static RepositoryProvider<Repository> repo<Repository>(
|
|
BuildContext context, {
|
|
required Repository Function(BuildContext) create,
|
|
required Repository Function(BuildContext, Repository) init,
|
|
Widget? child,
|
|
bool lazy = true,
|
|
bool enable = true,
|
|
}) {
|
|
if (enable) {
|
|
final repo = context.read<Repository?>();
|
|
if (repo != null) {
|
|
final r = repo;
|
|
return RepositoryProvider<Repository>.value(
|
|
value: init(context, r),
|
|
child: child,
|
|
);
|
|
}
|
|
}
|
|
|
|
return RepositoryProvider<Repository>(
|
|
lazy: lazy,
|
|
create: (_) => init(context, create(context)),
|
|
child: child,
|
|
);
|
|
}
|
|
}
|