в последнее время я пытаюсь ввести get_it в свой проект Flutter. Вместе с get_it я использую шаблон Provider и Fluro.
Я хочу создать такое дерево зависимостей:
main_page.dart
class MainPage extends StatefulWidget {
@override
State<StatefulWidget> createState() => MainPageState();
}
class MainPageState extends State<MainPage> {
MainViewModel viewModel = inject<MainViewModel>();
@override
Widget build(BuildContext context) => ChangeNotifierProvider(
create: (context) => viewModel,
child: Consumer<MainViewModel >(builder: _buildContent()),
);
}
home_view_model.dart
class MainViewModel extends ChangeNotifier {
final navigator = inject<Navigator>();
}
navigator.dart
class Navigator {
final AppRouter router;
HomeNavigator(AppRouter router);
setup() {
router.define(NavigationPaths.home, handler: Handlers.homePageHandler);
}
@override
Future<void> navigateToHome(BuildContext context) => router.navigate(
NavigationPaths.home,
replace: true,
clearStack: true,
);
}
app_router.dart
class AppRouter extends Router {
final BuildContext context;
AppRouter(this.context);
Future<T> navigate<T>(
String path, {
bool replace = false,
bool clearStack = false,
TransitionType transition = TransitionType.native,
Duration transitionDuration = const Duration(milliseconds: 250),
RouteTransitionsBuilder transitionBuilder,
}) async =>
await super.navigateTo(
context,
path,
replace: replace,
clearStack: clearStack,
transition: transition,
transitionDuration: transitionDuration,
transitionBuilder: transitionBuilder,
);
}
navigation_paths.dart
abstract class NavigationPaths {
static const String home = '/home';
}
handlers.dart
class Handlers {
static Handler get mainPageHandler => Handler(
handlerFunc: (context, parameters) => MainPage(),
);
Handlers._();
}
И здесь я не 'Не знаю, как правильно зарегистрировать MainPage
и классы, от которых зависит передача BuildContext
из Handler
в AppRouter
, который находится внутри Navigator
, то есть внутри ViewModel
, который находится внутри MainPage
.
Это можно как-то сделать с помощью инъекции, или мне нужно сделать это как одну такую регистрацию:
locator.registerFactoryParam<MainPage, BuildContext, dynamic>((param1, param2) => MainPage(
model: MainViewModel(
navigator: Navigator(
router: AppRouter(context: param1),
),
),
));
Возможно, у вас есть другая идея, как справиться с этим вложением DI