Existe uma maneira de passar argumentos adicionais para meu AndroidViewModel
construtor personalizado, exceto o contexto do aplicativo. Exemplo:
public class MyViewModel extends AndroidViewModel {
private final LiveData<List<MyObject>> myObjectList;
private AppDatabase appDatabase;
public MyViewModel(Application application, String param) {
super(application);
appDatabase = AppDatabase.getDatabase(this.getApplication());
myObjectList = appDatabase.myOjectModel().getMyObjectByParam(param);
}
}
E quando quero usar minha ViewModel
classe personalizada , uso este código em meu fragmento:
MyViewModel myViewModel = ViewModelProvider.of(this).get(MyViewModel.class)
Portanto, não sei como passar argumentos adicionais String param
para o meu costume ViewModel
. Só posso passar o contexto do aplicativo, mas não argumentos adicionais. Eu realmente apreciaria qualquer ajuda. Obrigado.
Edit: Eu adicionei algum código. Espero que esteja melhor agora.
android
mvvm
viewmodel
android-components
Mario rudman
fonte
fonte
Respostas:
Você precisa ter uma classe de fábrica para seu ViewModel.
E ao instanciar o modelo de visualização, você faz assim:
Para kotlin, você pode usar a propriedade delegada:
Há também outra nova opção - implementar
HasDefaultViewModelProviderFactory
e substituirgetDefaultViewModelProviderFactory()
com a instanciação de sua fábrica e então você ligariaViewModelProvider(this)
ouby viewModels()
sem a fábrica.fonte
ViewModel
classe precisa de seu ViewModelFactory?ViewModel
poderia / terá um DI diferente. Como você saberia qual instância retorna nocreate()
método?ViewModel
criação impede o métodoget()
. Com base na documentação: "Retorna um ViewModel existente ou cria um novo no escopo (geralmente, um fragmento ou uma atividade), associado a este ViewModelProvider." consulte: developer.android.com/reference/android/arch/lifecycle/…return modelClass.cast(new MyViewModel(mApplication, mParam))
para se livrar do avisoImplementar com injeção de dependência
Isso é mais avançado e melhor para código de produção.
Dagger2 , AssistedInject da Square, oferece uma implementação pronta para produção para ViewModels que pode injetar componentes necessários, como um repositório que lida com solicitações de rede e banco de dados. Também permite a injeção manual de argumentos / parâmetros na atividade / fragmento. Aqui está um esboço conciso das etapas para implementar com o código Gists com base na postagem detalhada de Gabor Varadi, Dagger Tips .
Punho de Adaga é a solução da próxima geração, em alfa a partir de 12/07/20, oferecendo o mesmo caso de uso com uma configuração mais simples assim que a biblioteca estiver no status de lançamento.
Implementar com Lifecycle 2.2.0 em Kotlin
Passando argumentos / parâmetros
Habilitando SavedState com Argumentos / Parâmetros
fonte
Para uma fábrica compartilhada entre vários modelos de visualização diferentes, eu estenderia a resposta de mlyko assim:
E instanciar modelos de visualização:
Com diferentes modelos de visualização com diferentes construtores.
fonte
Com base em @ vilpe89, a solução Kotlin acima para casos AndroidViewModel
}
Então, um fragmento pode iniciar o viewModel como
E então a classe ViewModel real
Ou em algum método adequado ...
fonte
Eu fiz uma classe em que o objeto já criado é passado.
E depois
fonte
Eu escrevi uma biblioteca que deve tornar isso mais simples e mais limpo, sem multibindings ou clichês de fábrica necessários, enquanto trabalhava perfeitamente com argumentos ViewModel que podem ser fornecidos como dependências por Dagger: https://github.com/radutopor/ViewModelFactory
Na vista:
fonte
(KOTLIN) Minha solução usa um pouco de reflexão.
Digamos que você não queira criar a mesma classe de fábrica de aparência toda vez que criar uma nova classe ViewModel que precisa de alguns argumentos. Você pode fazer isso por meio do Reflection.
Por exemplo, você teria duas atividades diferentes:
E ViewModels para essas atividades:
Então, a parte mágica, a implementação da classe Factory:
fonte
Por que não fazer assim:
e use-o assim em duas etapas:
fonte
myViewModel.initialize(param)
noonCreate
da atividade, por exemplo, ele pode ser chamado várias vezes na mesmaMyViewModel
instância como o usuário gira o dispositivo.Call Viewmodel in Activity
Para obter mais referências: Exemplo de Android MVVM Kotlin
fonte