标签: android-jetpack

具有干净架构的Android分页库

我正在尝试Android架构组件中的分页库,但我怀疑将它集成到基于干净架构的项目中.

一般来说我有3个模块:

  • 主模块(App)
  • 数据模块(具有网络和数据库依赖关系的Android模块)
  • 域模块(Pure Kotlin模块)

为了引入分页,我不得不将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 mapmapByPage方法,但工厂驻留在数据层.我的Viewmodel使用来自模型层的数据,在这种情况下,这将是一个数据PagedList,据我所知,分页列表不支持映射.

那么在这种情况下适当的做法是什么呢?

android clean-architecture android-architecture-components android-jetpack android-paging

17
推荐指数
1
解决办法
1204
查看次数

发射和发射源与 LiveData 有什么区别?(如在实时用例中)

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

17
推荐指数
4
解决办法
5963
查看次数

如何使用 Jetpack Compose 显示键盘?

如何滑入键盘?我试过:

val keyboardController: SoftwareKeyboardController? = LocalSoftwareKeyboardController.current
  keyboardController?.show()
Run Code Online (Sandbox Code Playgroud)

但这不起作用。我缺少什么?也许一些清单标志?

android-windowmanager android-window android-jetpack android-jetpack-compose

17
推荐指数
3
解决办法
1万
查看次数

导航架构组件 - 使用lambda表达式的操作导航

我添加了一个新动作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

16
推荐指数
1
解决办法
2173
查看次数

每个实体的Android MVVM ViewModel和Repositories?

使用Android架构组件和MVVM模式,我有一些问题.

基于Web上的大多数示例,通常有简单的示例.

  1. 有一个房间实体 @Entity public class User{ ... }

  2. 有一个DAO @Dao public interface UserDao{ ... }

  3. 有一个存储库 public class UserRepository{ }

  4. 视图模型 public class UsersListViewModel extends AndroidViewModel{ .... }

现在让我们来扩展这个和旁边useruser_accessuser_actions举例来说,这么有3个表.

问题:

  1. 对于房间I中的每个表,创建实体.我应该Dao为每个实体(userDao,userAccessDao,userActionsDao)或一般AppDao类提供3个吗?

  2. 同样适用于Repository.每个Entitiy的整个应用程序或存储库的一个存储库(RepositoryUser,RepositoryUserAccess,RepositoryUserActions?

  3. 如果我的应用程序有一个主要活动和多个片段,我应该为每个片段创建一个ViewModel吗?

android mvvm android-architecture-components android-jetpack

16
推荐指数
1
解决办法
2687
查看次数

如何使用ViewModel和LiveData进行改进API调用

这是我第一次尝试实现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 mvvm retrofit android-livedata android-jetpack

16
推荐指数
1
解决办法
9378
查看次数

android - 横向导航图流预览

Android jetpack 组件的导航图预览始终显示布局编辑器中屏幕的纵向视图。我们可以自定义它以在我们选择的模拟器上查看屏幕吗?

android android-jetpack android-architecture-navigation android-jetpack-navigation

16
推荐指数
1
解决办法
768
查看次数

Jetpack 撰写单个数字文本字段

我正在尝试创建一个电话验证屏幕,用户必须在自己的文本字段中输入 5 个数字,如下所示。 验证文本字段

我有两个问题:

  1. 有没有办法将 TextField 限制为 1 个字符。我可以设置单行和最大行,但在视图系统中没有看到限制字符长度(如“Ms”)的方法。我可以通过忽略第一个字符之后的字符来轻松限制代码中的字符长度,但这仍然允许用户向左和向右“滚动”,即使只有 1 个字符。
  2. 有没有办法将宽度换行为 1 个字符?目前,我发现限制宽度的唯一方法是专门设置它,但是如果系统文本大小发生变化,它可能会中断。

这是一些代码,以防有帮助,这是一些非常混乱的解决方案,因此如果有问题,请道歉:

@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)

android textfield android-jetpack android-jetpack-compose

16
推荐指数
1
解决办法
7471
查看次数

(jetpack compose) androidx.compose.runtime.internal.ComposableLambdaImpl 无法转换为 kotlin.jvm.functions.Function0

我有一个用于自定义视图的 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)

android kotlin android-jetpack android-jetpack-compose

16
推荐指数
1
解决办法
3196
查看次数

如何在 Jetpack Compose 中使底部工作表覆盖整个屏幕

我正在使用 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 android-jetpack android-jetpack-compose

16
推荐指数
1
解决办法
1万
查看次数