我有ChatMessage像下面的代码这样的类:
class ChatMessage(val uid: String, val text: String, val fromId: String, val toId: String, val timestamp: Long) {}
Run Code Online (Sandbox Code Playgroud)
它有timestamp作为它的财产
我有一个像这样的空列表,稍后我将用数据填充此 messageList:
val messageList = ArrayList<ChatMessage>()
Run Code Online (Sandbox Code Playgroud)
我想messageList根据时间戳重新排列它,因此最低的时间戳将位于该数组的索引 0 中。
在 Kotlin 中如何做到这一点?如果这是微不足道的,我很抱歉,我是编程和 Kotlin 的新手。
我是 iOS 开发新手。如果使用故事板,我可以像这样在视图控制器中放置一个图像视图
我需要以编程方式制作类似的东西。
所以我有来自名为 的库的自定义视图RevealingSplashView,但我需要将图像视图添加到该自定义 UI 视图。我只知道添加图像视图,也许是这样的
let imageName = "yourImage.png"
let image = UIImage(named: imageName)
let imageView = UIImageView(image: image!)
imageView.frame = CGRect(x: 0, y: 0, width: 100, height: 200)
revealingSplashView.addSubview(imageView)
Run Code Online (Sandbox Code Playgroud)
但我不知道如何将图像视图的约束设置为
A。与中心 x 对齐到超级视图
b. 与超级视图成比例的宽度 0.8
C。高度限制 = 25
d. 将底部对齐到安全区域 = 32
怎么做 ?
这是我在添加图像视图之前使用的代码
let screenSize = UIScreen.main.bounds
let iconWidth = (screenSize.width) * 0.8
let iconHeight = iconWidth * 1 // ratio 1:1
revealingSplashView = RevealingSplashView(iconImage: UIImage(named: "Loading Page Asset")!,iconInitialSize: CGSize(width: iconWidth, …Run Code Online (Sandbox Code Playgroud) 我是 MVVM 新手。因此,我的片段/活动向服务器发出了 2 个请求,第一个请求的结果将用作第二个请求的输入参数。
因此,首先在我的片段中,当单击按钮时,我会发出请求以检查用户是否被禁止,如果没有,则该用户可以创建帖子。
所以首先我检查用户是否被禁止或没有在我的片段中使用此代码
class CreateEventFragment : Fragment() {
lateinit var model: CreateEventViewModel
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
model = ViewModelProvider(this).get(CreateEventViewModel::class.java)
button.setOnClickListener {
model.checkIfUserIsBanned()
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是视图模型
class CreateEventViewModel(application: Application) : AndroidViewModel(application) {
val mUserIsBanned :MutableLiveData<Boolean> = UserClient.mUserIsBanned
fun checkIfUserIsBanned(userID: String) {
UserRepository.checkIfUserIsBanned(id)
}
}
Run Code Online (Sandbox Code Playgroud)
这是客户端(为了简单起见,我跳过了存储库)
object UserClient {
val mUserIsBanned = MutableLiveData<Boolean>()
fun checkIfUserIsBanned(userID: String) {
// perform networking, after getting the value then
if (user.isBanned) {
mUserIsBanned.postValue(true) …Run Code Online (Sandbox Code Playgroud) android kotlin android-livedata android-viewmodel android-architecture-components
我想让新用户在决定使用 Gmail、Facebook 或电子邮件和密码登录之前可以看到我的应用程序中的一些内容。所以首先我需要让他们在使用此代码安装应用程序时匿名登录
auth.signInAnonymously()
Run Code Online (Sandbox Code Playgroud)
然后,在他们尝试之后,他们决定使用 Google 帐户登录,然后我将具有特定 UID(假设 UID 是 q1q2q3)的用户转换为使用此代码使用 Google 作为身份验证提供程序。
auth.currentUser!!.linkWithCredential(credential)
Run Code Online (Sandbox Code Playgroud)
然后假设他们卸载并重新安装该应用程序。因此他们将再次匿名登录,并且作为匿名用户将获得不同的 UID(假设新的 UID 是 aXXXX12345b ),即使他们再次使用 Google 登录,他们也会以 q1q2q3 身份登录
所以现在我有一个多余的匿名用户(aXXXX12345b)。像这样有多余的匿名身份验证用户可以吗?我的意思是,我担心我会遇到 firebase 身份验证的限制。我应该怎么办 ?对于这样的情况有更好的方法吗?我不知道这是否是一种常见做法
我正在尝试使用 Firebase 模拟器运行下面的 Firestore 触发器代码,firebase emulators:start
如您所见,在 firestore 触发器内,我有一段代码用于删除存储在 Firebase Storage 中的图像
我的代码:
exports.onDelete = functions
.firestore.document(path)
.onDelete((snapshot, context) => {
try {
const deletedUser = new User(snapshot.data());
const promise1 = db.doc(`devices/${deletedUser.uid}`).delete();
// deleting the image in Storage
const defaultBucket = storage.bucket();
const profilePictureFile = defaultBucket.file(`profilePicture/${deletedUser.uid}`);
const promise2 = profilePictureFile.delete();
const promises: Promise<any>[] = [promise1, promise2];
return Promise.all(promises);
} catch (error) {
console.log(error);
return Promise.reject(error);
}
});
Run Code Online (Sandbox Code Playgroud)
因为 Firebase 模拟器目前没有用于存储的模拟器,所以我预计会出现错误。
但我有这样的警告
正如您在最底部看到的,有一条警告说
您的函数被终止,因为它引发了未处理的错误。
这是一个严重的错误吗?我的意思是,我想我已经在代码中提供了 try catch 块,但为什么它仍然被视为未处理的错误?怎么解决这个问题?
抱歉,我是 Node …
node.js google-cloud-storage firebase google-cloud-functions firebase-storage
如果我长按底部导航栏项目的某个项目,那么它将显示一个弹出窗口/吐司及其项目的标题(上图中的收件箱弹出窗口)。我想禁用该行为,该怎么做?
这是我当前的底部导航栏
BottomNavigationBar(
onTap: _selectPage,
elevation: 2,
backgroundColor: const Color.fromRGBO(245, 245, 245, 1),
unselectedItemColor: Colors.grey,
selectedItemColor: Theme.of(context).primaryColor,
currentIndex: _selectedPageIndex,
showSelectedLabels: false,
showUnselectedLabels: false,
type: BottomNavigationBarType.fixed,
items: [
BottomNavigationBarItem(
icon: Icon(Icons.home_outlined),
label: "Home",
),
BottomNavigationBarItem(
icon: Icon(Icons.search),
label: "Search",
),
BottomNavigationBarItem(
icon: Icon(Icons.add_circle_outline),
label: "create",
),
BottomNavigationBarItem(
icon: Icon(Icons.notifications_none),
label: "Inbox",
),
BottomNavigationBarItem(
icon: Icon(Icons.person_outline),
label: "Profile",
),
],
),
Run Code Online (Sandbox Code Playgroud) 我可以使用下面的代码在我的 Flutter 应用程序上显示 Google 地图
final marker = Marker(
markerId: MarkerId("someID"),
position: LatLng(0.0, 0.0),
infoWindow: InfoWindow(title: "Venue Name"),
);
GoogleMap(
onTap: (newCoordinate) => onMapTapped(newCoordinate, controller),
mapType: MapType.normal,
onMapCreated: onGoogleMapCreated,
initialCameraPosition: CameraPosition(
target: LatLng(0.0, 0,0),
zoom: 15.0,
),
markers: {marker},
),
Run Code Online (Sandbox Code Playgroud)
要显示信息窗口,我需要先点击红色标记。我想要的是......
每当地图加载到屏幕上时,该信息窗口就会立即打开,而无需我点击红色标记。这样我就可以显示“场地名称”。怎么做?
所以我未来有这样的提供者
final additionalCostsProvider = FutureProvider.autoDispose.family<List<ExtraCost>, List<String>>((ref, cartCodes) {
final cartAPI = ref.watch(cartAPIProvider);
return cartAPI.getAdditionalCosts(cartCodes: cartCodes);
});
Run Code Online (Sandbox Code Playgroud)
如您所见,我将购物车代码 ( List<String>) 作为参数传递给我的FutureProvider
然后我像这样使用它
@override
Widget build(context, ref) {
final List<String> cartCodes = carts.map((cart) => cart.code).toList();
final additionalCostsProviderAsynValue = ref.watch(additionalCostsProvider(cartCodes));
return Scaffold(
body: additionalCostsProviderAsynValue.when(
loading: () => CircularProgressIndicator(),
error: (error, stackTrace) {
return ErrorDisplay(
onButtonClicked: () => ref.refresh(additionalCostsProvider(cartCodes)),
);
},
data: (results) {
return Container();
},
),
);
}
Run Code Online (Sandbox Code Playgroud)
然后它会一遍又一遍地向服务器发出我的应用程序请求。
我相信问题出在.family修改器上。因为如果像下面的代码那样更改FutureProvider而不使用.family,则不会出现问题。
final additionalCostsProvider = FutureProvider.autoDispose<List<ExtraCost>>((ref) …Run Code Online (Sandbox Code Playgroud) 我想将 firestore 文档中的一个字段设置为空,就像lastEventApproval上图中的字段一样。
我尝试使用下面的代码创建一个文档
let data = ["lastEventApproval" : nil , other data here .....]
batch.setData(userDictionary, forDocument: ref)
Run Code Online (Sandbox Code Playgroud)
所以我想在成功创建文档时,有一个名为lastEventApprovalnull 的字段,如上图所示
但结果是......
lastEventApproval如果我使用该代码,则不存在。像这样

在Android中,我可以使用这段代码制作类似的东西
val data = hashMapOf("lastEventApproval" to null)
batch.set(ref,data)
Run Code Online (Sandbox Code Playgroud)
但我不知道为什么它在 iOS swift 中不起作用,也许我需要指定 nil 以外的其他值?
那么如何在 swift 中使 firestore 文档中的字段为空?
我试图在 stackoverflow 中找到类似的问题,但没有人能解决我的问题。
我正在尝试使用 Typescript 和 Mocha 测试我的 firebase 安全规则,但我什至无法运行我的测试
这是我的项目目录
我使用以下代码安装我的开发依赖项:
npm install chai mocha ts-node @types/chai @types/mocha --save-dev
Run Code Online (Sandbox Code Playgroud)
这是我的开发依赖项
"devDependencies": {
"@firebase/rules-unit-testing": "^1.2.5",
"@types/chai": "^4.2.15",
"@types/mocha": "^8.2.2",
"@types/uuid": "^8.3.0",
"@typescript-eslint/eslint-plugin": "^3.9.1",
"@typescript-eslint/parser": "^3.8.0",
"chai": "^4.3.4",
"eslint": "^7.6.0",
"eslint-config-google": "^0.14.0",
"eslint-plugin-import": "^2.22.0",
"mocha": "^8.3.2",
"ts-node": "^9.1.1",
"typescript": "^3.9.9"
},
Run Code Online (Sandbox Code Playgroud)
这是我的脚本 npm
"scripts": {
"test": "mocha --exit"
},
Run Code Online (Sandbox Code Playgroud)
但是当运行时npm run test,从functions目录我有错误
错误:未找到测试文件:“测试”
我尝试过使用
mocha --require ts-node/register --watch-extensions ts 'test/**/*.ts'
Run Code Online (Sandbox Code Playgroud)
我仍然有同样的错误。我应该怎么办?
firebase ×4
android ×3
flutter ×3
kotlin ×3
ios ×2
swift ×2
android-architecture-components ×1
anonymous ×1
autolayout ×1
dart ×1
google-maps ×1
mocha.js ×1
node.js ×1
riverpod ×1