我无法将多个消费者用于具有提供程序的单个小部件?假设我的小部件是 CurvedNavigationBar 并且我在该小部件中有 4 个项目。我还有 4 个不同的类,它们扩展了 ChangeNotifier 并负责 CurvedNavigationBar 中的每个项目。
如何在单个小部件中收听这 4 个更改通知程序?我查看了文档并找不到这样的示例..这甚至可能吗?我发现 Consumer 有一个 builder 方法,所以这意味着你只能构建一个小部件一次/并听一次它。
我是否应该拥有一个扩展 ChangeNotifier 的类,然后更新该小部件中的值并仅使用一个 Consumer 来侦听更新的值?
我正在使用 zappa 将后端部署到 AWS Lambda。它运行得很好,直到我决定使用 PostgreSQL。我在设置中添加了这样的内容:
\nDATABASES = {\n 'default': {\n 'ENGINE': 'django.db.backends.postgresql',\n 'NAME': config('DATABASE_NAME'),\n 'USER': config('DATABASE_USER'),\n 'PASSWORD': config('DATABASE_PASSWORD'),\n 'HOST': config('DATABASE_HOST'),\n 'PORT': '5432'\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n我正在使用 AWS RDS。我安装了 psycopg2-binary 和 psycopg2 (版本 2.8.6),但问题仍然存在。python版本是3.8。
\n完整的错误日志:
\n [1621168086542] [ERROR] ImproperlyConfigured: Error loading psycopg2 module: No module named 'psycopg2._psycopg'\nTraceback (most recent call last):\n\xc2\xa0\xc2\xa0File "/var/task/handler.py", line 609, in lambda_handler\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0return LambdaHandler.lambda_handler(event, context)\n\xc2\xa0\xc2\xa0File "/var/task/handler.py", line 240, in lambda_handler\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0handler = cls()\n\xc2\xa0\xc2\xa0File "/var/task/handler.py", line 146, in __init__\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0wsgi_app_function = get_django_wsgi(self.settings.DJANGO_SETTINGS)\n\xc2\xa0\xc2\xa0File "/var/task/zappa/ext/django_zappa.py", line 20, in get_django_wsgi\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0return get_wsgi_application()\n\xc2\xa0\xc2\xa0File "/var/task/django/core/wsgi.py", …Run Code Online (Sandbox Code Playgroud) 我们似乎遇到了 AndroidComposeRule 的问题,我们使用 waitUntil {} 函数进行了一个简单的测试:
\n@RunWith(AndroidJUnit4::class)\nclass IdenfyFaceReauthenticationFlowTests {\n\n @get:Rule\n val composeTestRule = createAndroidComposeRule<FaceReauthenticationActivity>()\n\n private lateinit var faceReauthenticationActivity: FaceReauthenticationActivity\n\n @Before\n fun setUp() {\n faceReauthenticationActivity = composeTestRule.activity\n faceReauthenticationActivity.idenfyMainViewModel.idenfyInternalSettings.isInitialViewClosed = false\n }\n\n @Test\n fun test1() {\n composeTestRule.waitUntil(8000) {\n composeTestRule.onAllNodesWithText(faceReauthenticationActivity.getString(R.string.idenfy_camera_onboarding_view_continue_button_title_v2)).fetchSemanticsNodes(false).isNotEmpty()\n }\n composeTestRule.onNodeWithText(faceReauthenticationActivity.getString(R.string.idenfy_camera_onboarding_view_continue_button_title_v2)).performClick()\n\n Thread.sleep(6000)\n\n //Face Reauthentication Results View V2\n IdenfyView().waitForView(ViewMatchers.withId(R.id.idenfy_button_face_reauthentication_results_continue)).perform(\n ViewActions.click())\n\n Thread.sleep(1000)\n\n val activityResult = composeTestRule.activityRule.scenario.result!!\n activityResult.resultData.setExtrasClassLoader(this::class.java.classLoader)\n val faceReauthenticationResult: FaceReauthenticationResult =\n activityResult.resultData.getParcelableExtra(IdenfyController.IDENFY_FACE_REAUTHENTICATION_RESULT)!!\n\n assert(faceReauthenticationResult.faceReauthenticationStatus == FaceReauthenticationStatus.SUCCESS)\n }\n\n @After\n fun tearDown() {\n composeTestRule.activityRule.scenario.close()\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n我们面临的问题是,有时测试会失败并出现以下错误:
\nandroidx.compose.ui.test.junit4.android.ComposeNotIdleException: Idling resource timed out: possibly due to …Run Code Online (Sandbox Code Playgroud) 我真的很难选择正确的方法将数据从broadcastReceiver传递到ViewModel,并从那里我将数据传递给我的存储库并更新LiveData.我使用FCM推送通知,并使用ActivityLifecycle的本地broadCastReceiver.我发现从BroadcastReceiver访问ViewModel是不好的做法,但不确定为什么?如果我管理broadcastReceiver的生命周期,它不应该导致任何问题...... 那么将接收到的数据从FCM传递到我的Repository的MediatorLiveData的最佳方法是什么?我使用MediatorLiveData,因为我添加了不同的LiveData源(API请求和FCM).将不胜感激的建议和实施broadCastReceiver的正确方法.我考虑过从BroadCastReceiver访问Repository,如下所示:
RepositoryMain.getSingletonInstance()setResponse(状态).
android mvvm viewmodel android-livedata android-architecture-components
我已经构建了 ant android 库,它可以在 cordova 项目中使用(我已经构建了自定义包装器并创建了 cordova 插件)。一切工作正常,除了我找不到覆盖 color.xml 和 strings xml files 的选项。在常规的 Android 应用程序中,用户可以通过在自己的color.xml 文件中声明颜色名称并分配特定颜色来覆盖我的库颜色...我如何在 cordova 插件中做到这一点?创建额外的方法并通过自定义方法提供颜色代码是没有意义的。
您好,这里是我们的Podspec,它具有default_subspec和可选的子规范(由于已经设置了默认值,因此不会使用)。该子规格具有更多功能,但需要额外的8MB大小...
`s.default_subspec = 'mainSDK'
s.subspec 'mainSDK' do |mainSDK|
mainSDK.vendored_frameworks = 'mainSDK.framework'
mainSDK.source_files = "mainSDK.framework/Headers/*.h"
end
s.subspec 'additionalSDK' do |additionalSDK|
additionalSDK.source_files = "additionalSDK.framework/Headers/*.h"
additionalSDK.vendored_frameworks =['additionalSDK.framework', 'mainSDK.framework']
end
Run Code Online (Sandbox Code Playgroud)
现在,在我们的mainSDK中,我们在#if canImport(additionalSDK)中包含了AdditionalSDK,然后在这些编译器标志之间提供了与AdditionalSDK 相关的代码,如下所示:
#if canImport(additionalSDK)
//adding optional delegate
class ViewController: UIViewController, OptionalDelagate
#else
//no need for delagete
class ViewController: UIViewController
#endif
Run Code Online (Sandbox Code Playgroud)
但是,客户端集成了我们mainSDK后,他认为,该框架是缺少模块:additionalSDK.framework
这怎么可能?我们已经在工作空间中将AdditionalSDK标记为可选。我们试图设置additionalSDK为-weak_framework在其他连接标志(构建设置),但这并没有帮助。
如果客户端集成了额外的 SDK,则所有框架都将正常运行,因为所有框架都已链接。
可选的依赖关系,没有的CocoaPods做工精良,它的CocoaPods的只是问题或我不知道如何配置它
`s.default_subspec = 'mainSDK'
s.subspec 'mainSDK' do |mainSDK|
mainSDK.vendored_frameworks = 'mainSDK.framework'
mainSDK.source_files = "mainSDK.framework/Headers/*.h" …Run Code Online (Sandbox Code Playgroud)我必须花费大量时间在业务逻辑中学习和实现Livedata(尤其是MediatorLivedata),因为它有助于添加来自各种来源的数据。它取得了成功,因为我可以将FCM,Network或RoomDatabase作为不同的源添加到MediatorLivedata中,并在ViewModel中进行观察。它实际上可以很好地扩展。但是,它仍然缺少强大的RxJava2实现,例如很好地链接请求,平面地图等。似乎RxJava主要用于业务逻辑,但是实际上,我看到很多公司将RxJava与带有附加功能/库的UI一起使用。实际上,这使LiveData与表示逻辑无关。所以我想知道LiveData在表示逻辑方面(在ViewModel中使用它)是否比RxJava更好/更干净。您对未来有何建议?
viewmodel rx-java2 android-livedata android-architecture-components android-jetpack
已经挣扎了几天...基本上,我已经构建了一个已编译的已发布框架,并将其与cocoaPods一起分发。问题在于,然后将此框架应用程序存档会出现以下错误:
ld: bitcode bundle could not be generated because '/.../testingPodsAcrossversions/Pods/Pod/Pod.framework/Pod' was built without full bitcode. All frameworks and dylibs for bitcode must be generated from Xcode Archive or Install build file '/.../testingPodsAcrossversions/Pods/Pod/Pod.framework/Pod' for architecture arm64
Run Code Online (Sandbox Code Playgroud)
我做了这些事情:
搜索“启用位码”设置,并将其设置为“调试”和“发布”模式。
搜索位码设置。在“调试”和“发布”模式下添加-fembed-bitcode,或者可以在“调试”和“ -fembed-bitcode”中添加-fembed-bitcode-marker。
在“用户定义”设置下添加BITCODE_GENERATION_MODE,然后为“调试”和“发布”模式添加位代码,或者您可以在“调试”和“发布”模式中添加位代码。
我只需要发布版本,所以我没有构建通用框架,只是发布版本...我真的想解决这个问题,因为这对我来说是一场噩梦。
我正在试验协程,但不确定是否将 coroutineScope 传递给普通的 Kotlin 用例。这种方法会造成内存泄漏吗?
假设我们正在 VM 中初始化我们的 UseCase 并尝试传递viewModelScope:
class UploadUseCase(private val imagesPreparingForUploadUseCase: ImagesPreparingForUploadUseCase){
fun execute(coroutineScope: CoroutineScope, bitmap: Bitmap) {
coroutineScope.launch {
val resizedBitmap = withContext(Dispatchers.IO) {
imagesPreparingForUploadUseCase.getResizedBitmap(bitmap, MAX_SIZE)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
是安全码吗?如果我在 VM 中声明这个确切的代码没有区别吗?如果不是,那意味着我可以将 coroutineScope 作为构造函数参数传递......现在我最初认为我应该通过以下方式创建我的 execute 方法:
fun CoroutineScope.execute(bitmap: Bitmap) {
launch {
val resizedBitmap = withContext(Dispatchers.IO) {
imagesPreparingForUploadUseCase.getResizedBitmap(bitmap, MAX_SIZE)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
据我所知,我们使用扩展函数以便方法使用父协程范围。这意味着,我不需要将 coroutineScope 作为参数传递,只需更改方法即可使用扩展函数。
但是,令我惊讶的是,VM 看不到此方法可用!为什么这个方法不能从VM调用?
这在 VM 中标记为红色:
private fun uploadPhoto(bitmap: Bitmap, isImageUploaded: Boolean) {
prepareDataForUploadingUseCase.execute(bitmap)
}
Run Code Online (Sandbox Code Playgroud)
这在 …
kotlin android-mvvm kotlin-coroutines kotlin-coroutines-flow
我们在处理 Android 网络请求时遇到问题,更准确地说是接收随机请求
\nSocketException:\njava.net.SocketException: socket is closed\n at com.android.org.conscrypt.ConscryptFileDescriptorSocket$SSLInputStream.read(ConscryptFileDescriptorSocket.java:551)\nRun Code Online (Sandbox Code Playgroud)\n请求似乎没有超时,异常抛出得很快,而且似乎只在发布模式下出现,我们猜测这可能与 ProGuard 有关。
\n我们\xe2\x80\x99使用Retrofit、Moshi和RxAndroid来处理我们的网络请求。有人遇到过这样的问题吗?
\n我们的依赖项及其版本:
\nimplementation \xe2\x80\x98io.reactivex.rxjava2:rxandroid:2.1.1\xe2\x80\x99\nimplementation \xe2\x80\x98io.reactivex.rxjava2:rxjava:2.2.9\xe2\x80\x99\nimplementation \xe2\x80\x98com.squareup.retrofit2:adapter-rxjava2:2.5.0\xe2\x80\x99\n//Moshi\ndef moshiVersion = \xe2\x80\x9c1.12.0\xe2\x80\x9d\nimplementation \xe2\x80\x9ccom.squareup.moshi:moshi:$moshiVersion\xe2\x80\x9d\nkapt \xe2\x80\x9ccom.squareup.moshi:moshi-kotlin-codegen:$moshiVersion\xe2\x80\x9d\nimplementation \xe2\x80\x9ccom.squareup.retrofit2:converter-moshi:2.9.0"\nimplementation \xe2\x80\x9ccom.squareup.moshi:moshi-kotlin:1.8.0\xe2\x80\x9d\n//Networking\nimplementation \xe2\x80\x98com.squareup.okhttp3:logging-interceptor:3.12.1\xe2\x80\x99\nimplementation \xe2\x80\x98com.squareup.retrofit2:retrofit:2.6.4\xe2\x80\x99\nimplementation \xe2\x80\x98com.squareup.retrofit2:converter-scalars:2.1.0\xe2\x80\x99\nRun Code Online (Sandbox Code Playgroud)\n我们所有的模型都带有 @Keep 注释:
\n@Keep\nclass ModelDTO(\n @field:Json(name = \xe2\x80\x9cfield1")\n var field1: String? = null,\n @field:Json(name = \xe2\x80\x9cfield2\xe2\x80\x9d)\n var field2: List<String>? = null\n)\nHttpClient + Retrofit:\nval client = OkHttpClient.Builder()\n .connectTimeout(300, TimeUnit.SECONDS)\n .writeTimeout(300, TimeUnit.SECONDS)\n .readTimeout(300, TimeUnit.SECONDS)\nclient.retryOnConnectionFailure(true)\n .addNetworkInterceptor { chain ->\n val request = chain.request().newBuilder().addHeader(\xe2\x80\x9cConnection\xe2\x80\x9d, \xe2\x80\x9cclose\xe2\x80\x9d).build()\n chain.proceed(request)\n }\nval …Run Code Online (Sandbox Code Playgroud) 我真的很高兴我将长期运行的任务切换到了协程,这些任务不断产生UI 线程的结果。与 Android 中的 AsyncTask 或常规线程相比,它提高了性能并将内存使用量减少了 3 倍,并且所有内存泄漏都消失了。
唯一的问题是,我不知道在某个时间发生异常后我应该如何重新启动长时间运行的操作......
在阅读了大量文章后,我觉得我根本不了解协程中的异常处理。让我知道如何实现所需的行为。
lateinit var initEngineJob: Job
override val coroutineContext: CoroutineContext
get() = initEngineJob + Dispatchers.Main
Run Code Online (Sandbox Code Playgroud)
fun initWorkEngineCoroutine()
{
launch {
while(true) {
val deferred = async(Dispatchers.Default) {
getResultsFromEngine()
}
val result = deferred.await()
if (result != null) {
//UI thread
draw!!.showResult(result)
}
}
}
}
fun getResultsFromEngine() :Result? {
result = // some results from native c++ engine, …Run Code Online (Sandbox Code Playgroud) 我正在重构我们的代码库。现在,我们有一个单一存储库,用于存储网络请求并管理与RxJava和Kotlin Coroutines链接的运营商。
但是,该存储库被注入到多个ViewModel中,并且变得难以维护。
我想抽象我们的代码库并集成一些用例。据我所知,在useCase中使用单个网络请求是普遍的观点,这就是为什么我不确定如何链接网络请求的原因。
我需要使用Observable.zip和RxJava主题链接多个网络请求。
以下流程是否正确?
Viewmodel调用useCase,后者从存储库创建网络请求,处理该网络请求,创建LiveData并将该LiveData转发到ViewModel,还从Repository更新主题,以便在所有网络请求完成后Repository可以发出一些数据?
然后,我们的存储库仍然与我们当前的方法类似,只需要较少的代码,并且仅负责多个网络请求链接。
我希望我足够清楚。我研究了多个MVVM示例,但是它们对于具有复杂网络逻辑的实际应用似乎并不实用。
android mvvm rx-java2 android-livedata android-architecture-components
android ×6
android-architecture-components ×3
ios ×2
kotlin ×2
mvvm ×2
rx-java2 ×2
swift ×2
viewmodel ×2
android-mvvm ×1
cocoa ×1
cocoapods ×1
cordova ×1
django ×1
flutter ×1
objective-c ×1
podspec ×1
postgresql ×1
proguard ×1
provider ×1
python ×1
python-zappa ×1
retrofit ×1
rx-java ×1
zappa ×1