我正在尝试创建一个用于日志记录的实用程序。
我需要知道print()vsdebugPrint()和之间的实际区别log()。
我看到的许多答案都已经过时或令人困惑。此外,一些赞成的答案是矛盾的。
我正在尝试以红色打印错误消息。我正在使用 ANSI 代码来实现它。
debugPrint("\x1B[31m HelloDebug \x1B[0m");
Run Code Online (Sandbox Code Playgroud)
上面一张用红色打印。
但是当我使用同样的方法时log(),它不会以红色打印。它转义了 ANSI 代码。
我发现的一件事是 log() 有错误参数。如果我将某些内容作为错误传递,它默认处理红色。
在第一个使用 的例子中log,红色不会出现,因为 ANSI 代码被忽略。但在debugPrint使用过程中,效果还不错。在第三个中,默认情况下会出现红色错误。但即使对于空字符串消息也会添加额外的行。
是否可以使用ANSI code日志制作彩色文本?因为我有其他 ANSI 代码来制作不同颜色的文本。
我不想使用 debugPrint,因为如果我太频繁地打印某些内容,系统会忽略日志。
经过一段时间的挖掘,我发现日志函数是在 dart 运行时中用 c++ 实现的。因为日志函数是 dart sdk 中的外部函数。
external void log(
String message, {
DateTime? time,
int? sequenceNumber,
int level = 0,
String name = '',
Zone? zone,
Object? error,
StackTrace? stackTrace,
});
Run Code Online (Sandbox Code Playgroud)
https://github.com/dart-lang/sdk/blob/main/runtime/lib/developer.cc
我在挖掘时也看到了一些不同的答案。下面的答案说debugPrint仅在小部件类中可用。这仍然是真的吗?
我遇到了访问视图模型的问题。
我有一个活动和其中的 2 个片段。我有一个活动和片段的视图模型,使用在主机活动中创建的视图模型的相同实例。
class MyViewModel(var paymentDataModel: PaymentDataModel) : ViewModel(){
fun someMethod():Boolean{
//return Something
}
}
class MyViewModelFactory(var paymentDataModel: PaymentDataModel) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
return MyViewModel(paymentDataModel) as T
}
}
class NewPaymentAmountFragment : Fragment() {
private val paymentViewModel: MyViewModel by activityViewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
if(paymentViewModel.someMehtod()){
//Accessing activity viewmodel in fragment
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果我在活动函数中使用 viewModel 扩展定义 viewmodel,则会出现以下错误。
导致:java.lang.RuntimeException:无法创建类 com.app.MyViewModel 的实例
class MyActivity : BaseActivity(){
val myViewModel: …Run Code Online (Sandbox Code Playgroud)