135 lines
4.2 KiB
Dart
135 lines
4.2 KiB
Dart
import 'package:expandable/expandable.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter/services.dart';
|
|
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
|
import 'package:get/get.dart';
|
|
import 'package:star_lock/debug/debug_tool.dart';
|
|
import 'package:star_lock/debug/log.dart';
|
|
|
|
class DebugConsoleTile extends StatefulWidget {
|
|
final DebugConsoleLog log;
|
|
final bool expanded;
|
|
|
|
const DebugConsoleTile(this.log, {key, this.expanded = false});
|
|
|
|
@override
|
|
State<DebugConsoleTile> createState() => _DebugConsoleTileState();
|
|
}
|
|
|
|
class _DebugConsoleTileState extends State<DebugConsoleTile> {
|
|
ExpandableController? controller;
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
controller = ExpandableController(initialExpanded: widget.expanded);
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Container(
|
|
color: widget.log.level.color?.withOpacity(0.05),
|
|
child: Container(
|
|
color: widget.log.level.color?.withOpacity(0.05),
|
|
child: InkWell(
|
|
onTap: widget.log.stackTrace != null
|
|
? () {
|
|
controller!.toggle();
|
|
setState(() {});
|
|
}
|
|
: () async {
|
|
DeBug.openInfo = true;
|
|
await Get.to(DeBugText(widget.log));
|
|
DeBug.openInfo = false;
|
|
},
|
|
child: ExpandablePanel(
|
|
controller: controller,
|
|
theme: const ExpandableThemeData(
|
|
tapBodyToCollapse: false,
|
|
tapHeaderToExpand: false,
|
|
hasIcon: false,
|
|
),
|
|
header: ListTile(
|
|
textColor: widget.log.level.color,
|
|
title: Text(
|
|
widget.log.message,
|
|
maxLines: 5,
|
|
overflow: TextOverflow.ellipsis,
|
|
),
|
|
trailing: Column(
|
|
children: [
|
|
SizedBox(height: widget.log.stackTrace != null ? 4 : 15),
|
|
Opacity(
|
|
opacity: 0.5,
|
|
child: widget.log.timestamp
|
|
.difference(DateTime.now())
|
|
.inDays >
|
|
1
|
|
? Text(
|
|
'${widget.log.timestamp.toIso8601String().substring(0, 10)} ${widget.log.timestamp.toIso8601String().substring(11, 19)}')
|
|
: Text(widget.log.timestamp
|
|
.toIso8601String()
|
|
.substring(11, 19)),
|
|
),
|
|
if (widget.log.stackTrace != null)
|
|
AnimatedRotation(
|
|
duration: const Duration(milliseconds: 200),
|
|
curve: Curves.easeInOut,
|
|
turns: controller!.expanded ? -0.5 : 0,
|
|
child: Icon(Icons.keyboard_arrow_down,
|
|
color: widget.log.level.color),
|
|
)
|
|
],
|
|
),
|
|
),
|
|
collapsed: Container(),
|
|
expanded: widget.log.stackTrace != null
|
|
? Opacity(
|
|
opacity: 0.75,
|
|
child: ListTile(
|
|
textColor: widget.log.level.color,
|
|
title: Text(widget.log.stackTrace.toString()),
|
|
),
|
|
)
|
|
: Container(),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
class DeBugText extends StatefulWidget {
|
|
final DebugConsoleLog log;
|
|
|
|
DeBugText(this.log, {key});
|
|
|
|
@override
|
|
State<DeBugText> createState() => _DeBugTextState();
|
|
}
|
|
|
|
class _DeBugTextState extends State<DeBugText> {
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Scaffold(
|
|
appBar: AppBar(
|
|
title: const Text('详细日志'),
|
|
),
|
|
body: SafeArea(
|
|
child: GestureDetector(
|
|
onTap: () {
|
|
Clipboard.setData(ClipboardData(text: widget.log.message));
|
|
EasyLoading.showToast('已复制到剪切板');
|
|
},
|
|
child: SingleChildScrollView(
|
|
child: Padding(
|
|
padding: EdgeInsets.all(18.w),
|
|
child: Text(widget.log.message),
|
|
)),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|