Как реализовать навигацию между android библиотечными модулями, фокусируясь на повторном использовании и разделении задач? - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь реализовать отдельный модуль навигации для навигации между android библиотечными модулями, уделяя особое внимание масштабируемости, возможности повторного использования и независимости от модулей. Моя архитектура приложения похожа на этот пример:

enter image description here

Мой текущий подход

1- Определить NavigatorInterface для каждой библиотеки

2- Реализуйте каждый NavigatorInterface в NavigationModule. (модуль навигации ofcourse будет знать обо всех остальных модулях библиотеки, но это не имеет значения, поскольку он не будет использоваться повторно)

Ниже приведен пример кода для моей вышеупомянутой архитектуры:

: auth

| - LoginActivity

| - RegistrationActivity

| - AuthNavigator

public class LoginActivity extends AppCompatActivity {
    private NavigatorCoordinator navigator; // how do I achieve this injection, without using Dagger etc.

    .....
    private void signup(){
        navigator.NavigateToSignup(this);
    }

    private void profile(){
        navigator.NavigateToProfile(this);
    }
    .....
}


public class SignupActivity extends AppCompatActivity {
    private NavigatorCoordinator navigator; // how do I achieve this injection, without using Dagger etc.

    .....
    private void login(){
        navigator.NavigateToLogin(this);
    }

    private void profile(){
        navigator.NavigateToProfile(this);
    }
    .....
}



public interface AuthNavigator {
    void NavigateToLogin(Context context);
    void NavigateToRegister(Context context);
}

: профиль

| - ProfileActivity

| - ProfileNavigator

public class ProfileActivity extends AppCompatActivity {
    private NavigatorCoordinator navigator; // how do I achieve this injection, without using Dagger etc.

    .....
    private void about(){
        navigator.NavigateToAbout(this);
    }
    .....
}


public interface ProfileNavigator {
    void NavigateToProfile(Context context);
}

: около

| - AboutActivity

| - AboutNavigator

public class AboutActivity extends AppCompatActivity {
    private NavigatorCoordinator navigator; // how do I achieve this injection, without using Dagger etc.

    .....
    private void profile(){
        navigator.NavigateToProfile(this);
    }
    .....
}


public interface AboutNavigator {
    void NavigateToAbout(Context context);
}

Вышеупомянутый подход - попытка устранить круговую зависимость внутри одного и того же модуля :auth, а также между двумя модулями :profile & :about. Ниже приведена реализация :navigation.

: навигация

| - Навигатор

public class Navigator implements AuthNavigator, ProfileNavigator, AboutNavigator {
    @Override
    public void NavigateToLogin(Context context) {
        context.startActivity(new Intent(context, LoginActivity.class));
    }

    @Override
    public void NavigateToSingup(Context context) {
        context.startActivity(new Intent(context, SignupActivity.class));
    }

    @Override
    public void NavigateToProfile(Context context) {
        context.startActivity(new Intent(context, ProfileActivity.class));
    }

    @Override
    public void NavigateToAbout(Context context) {
        context.startActivity(new Intent(context, AboutActivity.class));
    }
}

Вопросы:

1 - Мне кажется, мне нужно реализовать модуль NavigatorCoordinator in :navigation, но как мне это сделать? Любой пример для этой реализации?

2- Как мне внедрить зависимость NavigatorCoordinator в каждом классе деятельности, находящемся в разных modules, без использования Deggar или какой-либо другой инфраструктуры? Можем ли мы сделать это с помощью класса Application, если да, приведите пример реализации?

3- Как настроить действие Launcher из любой библиотеки, например: LoginActivity?

4- Как вызвать модуль :navigation из модуля :app таким образом, чтобы он запускал заданное действие c, например: ProfileActivity?

5- Это хороший межмодульный навигационный подход для достижения возможности повторного использования, масштабируемости и разделения проблем?

6- Существуют ли другие подобные и хорошие подходы? Есть примеры кода? Ссылка на статью?

PS: Пожалуйста, не говорите мне использовать компонент архитектуры навигации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...