Flutter get_it вложенная инъекция с параметрами - PullRequest
0 голосов
/ 16 июня 2020

в последнее время я пытаюсь ввести 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

...