我正在尝试Android架构组件中的分页库,但我怀疑将它集成到基于干净架构的项目中.
一般来说我有3个模块:
为了引入分页,我不得不将PagedList<T>类视为域类.(IMO不是一个可怕的想法,因为最终是一个列表,数据源是抽象的)
所以在域层我可以有一个像以下的repostiory:
interface ItemRepository {
fun getItems():PagedList<Item>
}
Run Code Online (Sandbox Code Playgroud)
然后在数据模块中创建如下的实现:
class ItemRepositoryImpl: ItemRepositoy(private val factory:ItemDataSourceFavtory) {
fun getItems():PagedList<Item> {
val pageConfigurations = PagedList.Config.Builder()
.setPageSize(10)
.setInitialLoadSizeHint(15)
.setPrefetchDistance(5)
.setEnablePlaceholders(false)
.build()
return RxPagedListBuilder(locationDataSourceFactory, pageConfigurations)
.setInitialLoadKey(1)
.buildObservable()
}
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.我的疑问是,当我们需要变换域模型为表示层(比方说我的项目需要意识到,如果被检查显示的图标检查),通常我会我的域模型映射到演示文稿一个.
我知道DataSourceFactoryhas map和mapByPage方法,但工厂驻留在数据层.我的Viewmodel使用来自模型层的数据,在这种情况下,这将是一个数据PagedList,据我所知,分页列表不支持映射.
那么在这种情况下适当的做法是什么呢?
android clean-architecture android-architecture-components android-jetpack android-paging
emit接受data类而emitSource接受LiveData<T>( T -> data)。考虑以下示例:-我有两种类型的调用:-
suspend fun getData(): Data // returns directly data
Run Code Online (Sandbox Code Playgroud)
而另一个;
suspend fun getData(): LiveData<Data> // returns live data instead
Run Code Online (Sandbox Code Playgroud)
对于第一种情况,我可以使用:-
liveData {
emit(LOADING)
emit(getData())
}
Run Code Online (Sandbox Code Playgroud)
我的问题:使用上述方法可以解决我的问题,为什么我们还需要emitSource(liveData)?
任何使用该
emitSource方法的好用例都会清楚地表明!
android android-livedata android-architecture-components android-jetpack kotlin-coroutines
如何滑入键盘?我试过:
val keyboardController: SoftwareKeyboardController? = LocalSoftwareKeyboardController.current
keyboardController?.show()
Run Code Online (Sandbox Code Playgroud)
但这不起作用。我缺少什么?也许一些清单标志?
android-windowmanager android-window android-jetpack android-jetpack-compose
我添加了一个新动作Navigation.xml:
<fragment
android:id="@+id/launcher_home"
android:name="com.example.android.codelabs.navigation.MainFragment"
android:label="@string/home"
tools:layout="@layout/main_fragment">
<action
android:id="@+id/go_to_step_one"
app:destination="@id/flow_step_one" />
</fragment>
Run Code Online (Sandbox Code Playgroud)
调用导航操作时,如果我使用,导航工作正常:
view.findViewById<Button>(R.id.navigate_action_bt)?.setOnClickListener(
Navigation.createNavigateOnClickListener(R.id.go_to_step_one, null)
)
Run Code Online (Sandbox Code Playgroud)
但是当用lambda调用它时,它不起作用:
view.findViewById<Button>(R.id.navigate_action_bt)?.setOnClickListener {
Navigation.createNavigateOnClickListener(R.id.go_to_step_one, null)
}
Run Code Online (Sandbox Code Playgroud) android kotlin android-architecture-components android-jetpack android-architecture-navigation
使用Android架构组件和MVVM模式,我有一些问题.
基于Web上的大多数示例,通常有简单的示例.
有一个房间实体
@Entity
public class User{
...
}
有一个DAO
@Dao
public interface UserDao{
...
}
有一个存储库
public class UserRepository{
}
视图模型
public class UsersListViewModel extends AndroidViewModel{
....
}
现在让我们来扩展这个和旁边user有user_access和user_actions举例来说,这么有3个表.
问题:
对于房间I中的每个表,创建实体.我应该Dao为每个实体(userDao,userAccessDao,userActionsDao)或一般AppDao类提供3个吗?
同样适用于Repository.每个Entitiy的整个应用程序或存储库的一个存储库(RepositoryUser,RepositoryUserAccess,RepositoryUserActions?
如果我的应用程序有一个主要活动和多个片段,我应该为每个片段创建一个ViewModel吗?
android mvvm android-architecture-components android-jetpack
这是我第一次尝试实现MVVM架构,而且我对进行API调用的正确方法感到有些困惑.
目前,我只是尝试从IGDB API进行简单查询,并输出日志中第一项的名称.
我的活动设置如下:
public class PopularGamesActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_popular_games);
PopularGamesViewModel popViewModel = ViewModelProviders.of(this).get(PopularGamesViewModel.class);
popViewModel.getGameList().observe(this, new Observer<List<Game>>() {
@Override
public void onChanged(@Nullable List<Game> gameList) {
String firstName = gameList.get(0).getName();
Timber.d(firstName);
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
我的视图模型设置如下:
public class PopularGamesViewModel extends AndroidViewModel {
private static final String igdbBaseUrl = "https://api-endpoint.igdb.com/";
private static final String FIELDS = "id,name,genres,cover,popularity";
private static final String ORDER = "popularity:desc";
private static final int LIMIT = 30;
private LiveData<List<Game>> mGameList; …Run Code Online (Sandbox Code Playgroud) Android jetpack 组件的导航图预览始终显示布局编辑器中屏幕的纵向视图。我们可以自定义它以在我们选择的模拟器上查看屏幕吗?
android android-jetpack android-architecture-navigation android-jetpack-navigation
我正在尝试创建一个电话验证屏幕,用户必须在自己的文本字段中输入 5 个数字,如下所示。

我有两个问题:
这是一些代码,以防有帮助,这是一些非常混乱的解决方案,因此如果有问题,请道歉:
@Composable
fun CodeTextFields(
modifier: Modifier = Modifier,
length: Int = 5,
onFilled: (code: String) -> Unit
) {
var code: List<Char> by remember {
mutableStateOf(listOf())
}
val focusRequesters: List<FocusRequester> = remember {
val temp = mutableListOf<FocusRequester>()
repeat(length) {
temp.add(FocusRequester())
}
temp
}
Row(modifier = modifier) {
(0 until length).forEach { index ->
OutlinedTextField(
modifier = Modifier
.weight(1f)
.padding(vertical = 2.dp)
.focusRequester(focusRequesters[index]),
textStyle = MaterialTheme.typography.h4.copy(textAlign = …Run Code Online (Sandbox Code Playgroud) 我有一个用于自定义视图的 BaseUi 类,我的活动从它扩展。
当我使用Root函数时,应用程序崩溃了。
BaseUi.kt
@ExperimentalAnimationApi
open class BaseUi : AppCompatActivity() {
@Composable
fun RtlView(content: @Composable () -> Unit) {
CompositionLocalProvider(
LocalLayoutDirection provides LayoutDirection.Rtl,
content = content
)
}
@Composable
fun LtrView(content: @Composable () -> Unit) {
CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Ltr) {
content()
}
}
@Composable
fun Root(
content: @Composable () -> Unit
) {
KasbTheme {
Box(
Modifier
.fillMaxSize()
.background(LightPageBackground)
.padding(Dimen.pagePadding)
){
content()
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
SplashActivity.kt
@ExperimentalAnimationApi
class SplashActivity : BaseActivity() {
val viewModel = SplashActivityViewModel() …Run Code Online (Sandbox Code Playgroud) 我正在使用 Jetpack Compose 并尝试在用户单击 .txt 文件中的登录按钮时使登录屏幕覆盖整个屏幕TopAppBar。
ModalBottomSheetLayout我使用和 a的组合,Scaffold所以我可以有 aTopAppBar和 a BottomAppBar。
目前,当显示登录屏幕时,它仅覆盖屏幕的一半。
val coroutineScope = rememberCoroutineScope()
val bottomState = rememberModalBottomSheetState(ModalBottomSheetValue.Hidden)
ModalBottomSheetLayout(
sheetState = bottomState,
sheetShape = MaterialTheme.shapes.large,
sheetContent = {
FullScreen()
}
) {
Scaffold(
topBar = {
TopAppBar(
...
content = {
NavHost(navController = navController,
startDestination = "journey") {
composable("journey") { JourneyScreen() }
...
bottomBar = {
BottomAppBar(
content = {
BottomNavigation() {
val navBackStackEntry by navController.currentBackStackEntryAsState()
...
Run Code Online (Sandbox Code Playgroud)
@Composable
fun FullScreen() …Run Code Online (Sandbox Code Playgroud) android-jetpack ×10
android ×9
android-architecture-components ×4
android-architecture-navigation ×2
kotlin ×2
mvvm ×2
retrofit ×1
textfield ×1