Merge branch 'null-safety-ready' into null-safety

* null-safety-ready:
  add logger tool
  update error page
  update readme file & update example
  update changelog and pubspec
  auto_size_text dep update
  full migrate to sound null safety.
master
小赖 4 years ago
commit e0341c9fb9

@ -1,3 +1,3 @@
{ {
"dart.flutterSdkPath": "/Users/akufe/fvm/versions/2.0.0" "dart.flutterSdkPath": "/Users/akufe/fvm/versions/stable"
} }

@ -1,5 +1,18 @@
# CHANGELOG # CHANGELOG
## [1.0.1-nullsafety.1]
* add logger.
## [1.0.0-nullsafety.0]
* migrate to sound null safety.
## [0.1.4]
* add logger.
* update example app.
## [0.1.3] ## [0.1.3]
* listenable value. * listenable value.

@ -20,7 +20,7 @@ LoggerData.addData(data);
## WARNING ## WARNING
*only tested on flutter `1.22.5`,`1.22.6` * flutter SDK >= 2.0.0
## author ## author

@ -17,7 +17,7 @@ class MyApp extends StatelessWidget {
} }
class MyHomePage extends StatefulWidget { class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key); MyHomePage({Key? key, required this.title}) : super(key: key);
final String title; final String title;
@override @override
@ -49,6 +49,11 @@ class _MyHomePageState extends State<MyHomePage> {
appBar: AppBar( appBar: AppBar(
title: Text(widget.title), title: Text(widget.title),
), ),
floatingActionButton: FloatingActionButton(
onPressed: () {
NetTool.dio.get("https://www.baidu.com");
},
),
); );
} }
} }
@ -58,15 +63,15 @@ class NetTool {
static init() { static init() {
dio.interceptors.add(InterceptorsWrapper( dio.interceptors.add(InterceptorsWrapper(
onRequest: (options, handler) async { onRequest: (options, handler) async {
return options; return handler.next(options);
}, },
onResponse: (response, handler) async { onResponse: (response, handler) async {
LoggerData.addData(response); LoggerData.addData(response);
return response; return handler.next(response);
}, },
onError: (DioError e, handler) async { onError: (DioError e, handler) async {
LoggerData.addData(e); LoggerData.addData(e);
return e; return handler.next(e);
}, },
)); ));
} }

@ -5,84 +5,84 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: async name: async
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.5.0" version: "2.5.0"
auto_size_text: auto_size_text:
dependency: transitive dependency: transitive
description: description:
name: auto_size_text name: auto_size_text
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.0.0-nullsafety.0" version: "3.0.0-nullsafety.0"
boolean_selector: boolean_selector:
dependency: transitive dependency: transitive
description: description:
name: boolean_selector name: boolean_selector
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.0" version: "2.1.0"
characters: characters:
dependency: transitive dependency: transitive
description: description:
name: characters name: characters
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.0" version: "1.1.0"
charcode: charcode:
dependency: transitive dependency: transitive
description: description:
name: charcode name: charcode
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.0" version: "1.2.0"
clock: clock:
dependency: transitive dependency: transitive
description: description:
name: clock name: clock
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.0" version: "1.1.0"
collection: collection:
dependency: transitive dependency: transitive
description: description:
name: collection name: collection
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.15.0" version: "1.15.0"
cupertino_icons: cupertino_icons:
dependency: "direct main" dependency: "direct main"
description: description:
name: cupertino_icons name: cupertino_icons
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.0" version: "1.0.2"
device_info: device_info:
dependency: transitive dependency: transitive
description: description:
name: device_info name: device_info
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.0" version: "2.0.0"
device_info_platform_interface: device_info_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: device_info_platform_interface name: device_info_platform_interface
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.1" version: "2.0.1"
dio: dio:
dependency: "direct main" dependency: "direct main"
description: description:
name: dio name: dio
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "4.0.0-prev3" version: "4.0.0-prev3"
fake_async: fake_async:
dependency: transitive dependency: transitive
description: description:
name: fake_async name: fake_async
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.0" version: "1.2.0"
flutter: flutter:
@ -94,7 +94,7 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: flutter_highlight name: flutter_highlight
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.7.0" version: "0.7.0"
flutter_test: flutter_test:
@ -106,56 +106,63 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: get name: get
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.24.0" version: "3.26.0"
highlight: highlight:
dependency: transitive dependency: transitive
description: description:
name: highlight name: highlight
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.7.0" version: "0.7.0"
http_parser: http_parser:
dependency: transitive dependency: transitive
description: description:
name: http_parser name: http_parser
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "4.0.0" version: "4.0.0"
logger:
dependency: transitive
description:
name: logger
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.0"
matcher: matcher:
dependency: transitive dependency: transitive
description: description:
name: matcher name: matcher
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.12.10" version: "0.12.10"
meta: meta:
dependency: transitive dependency: transitive
description: description:
name: meta name: meta
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.3.0" version: "1.3.0"
package_info: package_info:
dependency: transitive dependency: transitive
description: description:
name: package_info name: package_info
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.0" version: "2.0.0"
path: path:
dependency: transitive dependency: transitive
description: description:
name: path name: path
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.8.0" version: "1.8.0"
plugin_platform_interface: plugin_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: plugin_platform_interface name: plugin_platform_interface
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.0" version: "2.0.0"
power_logger: power_logger:
@ -164,7 +171,7 @@ packages:
path: ".." path: ".."
relative: true relative: true
source: path source: path
version: "0.1.3" version: "1.0.1-nullsafety.1"
sky_engine: sky_engine:
dependency: transitive dependency: transitive
description: flutter description: flutter
@ -174,56 +181,56 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: source_span name: source_span
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.8.0" version: "1.8.0"
stack_trace: stack_trace:
dependency: transitive dependency: transitive
description: description:
name: stack_trace name: stack_trace
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.10.0" version: "1.10.0"
stream_channel: stream_channel:
dependency: transitive dependency: transitive
description: description:
name: stream_channel name: stream_channel
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.0" version: "2.1.0"
string_scanner: string_scanner:
dependency: transitive dependency: transitive
description: description:
name: string_scanner name: string_scanner
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.0" version: "1.1.0"
term_glyph: term_glyph:
dependency: transitive dependency: transitive
description: description:
name: term_glyph name: term_glyph
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.0" version: "1.2.0"
test_api: test_api:
dependency: transitive dependency: transitive
description: description:
name: test_api name: test_api
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.2.19" version: "0.2.19"
typed_data: typed_data:
dependency: transitive dependency: transitive
description: description:
name: typed_data name: typed_data
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.3.0" version: "1.3.0"
vector_math: vector_math:
dependency: transitive dependency: transitive
description: description:
name: vector_math name: vector_math
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.0" version: "2.1.0"
sdks: sdks:

@ -18,7 +18,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev
version: 1.0.0+1 version: 1.0.0+1
environment: environment:
sdk: ">=2.7.0 <3.0.0" sdk: '>=2.12.0 <3.0.0'
dependencies: dependencies:
flutter: flutter:

@ -5,42 +5,34 @@ import 'package:power_logger/src/view/dio_error_view.dart';
///Dio Error builder ///Dio Error builder
class DioErrorBuilder extends StatefulWidget { class DioErrorBuilder extends StatefulWidget {
final DioError data; final DioError data;
DioErrorBuilder({Key key, @required this.data}) : super(key: key); DioErrorBuilder({Key? key, required this.data}) : super(key: key);
@override @override
_DioErrorBuilderState createState() => _DioErrorBuilderState(); _DioErrorBuilderState createState() => _DioErrorBuilderState();
} }
class _DioErrorBuilderState extends State<DioErrorBuilder> { class _DioErrorBuilderState extends State<DioErrorBuilder> {
RequestOptions get _request => widget?.data?.requestOptions; RequestOptions get _request => widget.data.requestOptions;
String renderErrText(DioErrorType type) { String renderErrText(DioErrorType type) {
switch (type) { switch (type) {
case DioErrorType.connectTimeout: case DioErrorType.connectTimeout:
return '连接超时'; return '连接超时';
break;
case DioErrorType.sendTimeout: case DioErrorType.sendTimeout:
return '发送超时'; return '发送超时';
break;
case DioErrorType.receiveTimeout: case DioErrorType.receiveTimeout:
return '接收超时'; return '接收超时';
break;
case DioErrorType.response: case DioErrorType.response:
return 'Serve Side Error'; return 'Serve Side Error';
break;
case DioErrorType.cancel: case DioErrorType.cancel:
return '取消连接'; return '取消连接';
break;
case DioErrorType.other: case DioErrorType.other:
return '未知错误'; return '未知错误';
break;
} }
return '';
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (widget.data == null) return ListTile(title: Text('NULL Dio Error'));
return Material( return Material(
color: Colors.red[100], color: Colors.red[100],
child: Column( child: Column(

@ -5,14 +5,14 @@ import 'package:power_logger/src/view/dio_response_view.dart';
/// Dio Response Builder /// Dio Response Builder
class DioResponseBuilder extends StatefulWidget { class DioResponseBuilder extends StatefulWidget {
final Response data; final Response data;
DioResponseBuilder({Key key, this.data}) : super(key: key); DioResponseBuilder({Key? key,required this.data}) : super(key: key);
@override @override
_DioResponseBuilderState createState() => _DioResponseBuilderState(); _DioResponseBuilderState createState() => _DioResponseBuilderState();
} }
class _DioResponseBuilderState extends State<DioResponseBuilder> { class _DioResponseBuilderState extends State<DioResponseBuilder> {
RequestOptions get _request => widget?.data?.requestOptions; RequestOptions? get _request => widget.data.requestOptions;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -27,7 +27,7 @@ class _DioResponseBuilderState extends State<DioResponseBuilder> {
), ),
), ),
title: Text( title: Text(
_request.path, _request!.path,
style: TextStyle( style: TextStyle(
color: Colors.black87, color: Colors.black87,
), ),
@ -37,7 +37,7 @@ class _DioResponseBuilderState extends State<DioResponseBuilder> {
children: [ children: [
Chip( Chip(
backgroundColor: Colors.green.withOpacity(0.8), backgroundColor: Colors.green.withOpacity(0.8),
label: Text(_request.method), label: Text(_request!.method),
), ),
], ],
), ),

@ -1,10 +1,19 @@
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:logger/logger.dart';
import 'package:power_logger/power_logger.dart'; import 'package:power_logger/power_logger.dart';
/// logger data storage /// logger data storage
class LoggerData { class LoggerData {
static int _maxLength = 100; static int _maxLength = 100;
static bool _markLogger = false;
static bool get markLogger => _markLogger;
static setLogger(bool state) {
_markLogger = state;
}
static Logger _logger = Logger();
/// the real logger data. /// the real logger data.
static List<dynamic> get data => _listenableData.value; static List<dynamic> get data => _listenableData.value;
@ -13,7 +22,7 @@ class LoggerData {
/// set the logger max number. /// set the logger max number.
static setMax(int max) { static setMax(int max) {
_maxLength = max ?? 100; _maxLength = max;
} }
/// add data to logger /// add data to logger
@ -28,6 +37,8 @@ class LoggerData {
_listenableData.notify(); _listenableData.notify();
} }
} }
if (_markLogger) _logger.i(data);
} }
/// clear all logger /// clear all logger
@ -35,12 +46,12 @@ class LoggerData {
/// add data listener /// add data listener
static addListener(Function listener) { static addListener(Function listener) {
_listenableData.addListener(listener); _listenableData.addListener(listener as void Function());
} }
/// remove data listener /// remove data listener
static removeListener(Function listener) { static removeListener(Function listener) {
_listenableData.removeListener(listener); _listenableData.removeListener(listener as void Function());
} }
} }

@ -15,20 +15,20 @@ enum ContentType {
/// Dio parse /// Dio parse
class DioParser { class DioParser {
Response _response; Response? _response;
DioParser(Response response) { DioParser(Response? response) {
_response = response; _response = response;
} }
/// get dio request /// get dio request
RequestOptions get request => _response.requestOptions; RequestOptions get request => _response!.requestOptions;
/// get dio response /// get dio response
Response get response => _response; Response? get response => _response;
/// get dio contentType /// get dio contentType
ContentType get type { ContentType get type {
String _ctype = response.headers.map['content-type'].first; String _ctype = response!.headers.map['content-type']!.first;
switch (_ctype) { switch (_ctype) {
case 'text/plain': case 'text/plain':
return ContentType.TEXT_PLAIN; return ContentType.TEXT_PLAIN;

@ -3,7 +3,7 @@ import 'package:flutter/material.dart';
/// UnfocusParser /// UnfocusParser
class UnfocusParser extends StatelessWidget { class UnfocusParser extends StatelessWidget {
final dynamic data; final dynamic data;
const UnfocusParser({Key key, @required this.data}) : super(key: key); const UnfocusParser({Key? key, required this.data}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {

@ -26,14 +26,14 @@ class PowerLogger {
///PowerLogger.start(context,debug:true); ///PowerLogger.start(context,debug:true);
///``` ///```
static start(BuildContext context, {bool debug = true}) { static start(BuildContext context, {bool debug = true}) {
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance!.addPostFrameCallback((_) {
PowerLogger.debug = debug; PowerLogger.debug = debug;
if (debug) _insertToOverlay(context); if (debug) _insertToOverlay(context);
}); });
} }
static _insertToOverlay(BuildContext context) { static _insertToOverlay(BuildContext context) {
Overlay.of(context).insert(OverlayEntry( Overlay.of(context)!.insert(OverlayEntry(
builder: (context) { builder: (context) {
return LoggerFab(); return LoggerFab();
}, },

@ -6,7 +6,7 @@ import 'package:power_logger/src/views/settings_view.dart';
///Logger view ///Logger view
class PowerLoggerView extends StatefulWidget { class PowerLoggerView extends StatefulWidget {
PowerLoggerView({Key key}) : super(key: key); PowerLoggerView({Key? key}) : super(key: key);
@override @override
_PowerLoggerViewState createState() => _PowerLoggerViewState(); _PowerLoggerViewState createState() => _PowerLoggerViewState();
@ -15,7 +15,7 @@ class PowerLoggerView extends StatefulWidget {
class _PowerLoggerViewState extends State<PowerLoggerView> { class _PowerLoggerViewState extends State<PowerLoggerView> {
PageController _pageController = PageController(); PageController _pageController = PageController();
int _currentIndex = 0; int _currentIndex = 0;
void Function(void Function()) _setState; void Function(void Function())? _setState;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Theme( return Theme(
@ -37,7 +37,7 @@ class _PowerLoggerViewState extends State<PowerLoggerView> {
controller: _pageController, controller: _pageController,
onPageChanged: (index) { onPageChanged: (index) {
_currentIndex = index; _currentIndex = index;
if (_setState != null) _setState(() {}); if (_setState != null) _setState!(() {});
}, },
children: [ children: [
LoggerView(), LoggerView(),

@ -3,12 +3,12 @@ import 'package:flutter/material.dart';
///BoxView ///BoxView
class BoxView extends StatelessWidget { class BoxView extends StatelessWidget {
final Widget title; final Widget title;
final Widget child; final Widget? child;
final List<Widget> children; final List<Widget>? children;
const BoxView({ const BoxView({
Key key, Key? key,
this.child, this.child,
@required this.title, required this.title,
this.children, this.children,
}) : assert(child != null || children != null), }) : assert(child != null || children != null),
super(key: key); super(key: key);
@ -17,37 +17,29 @@ class BoxView extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Padding( return Padding(
padding: EdgeInsets.all(5), padding: EdgeInsets.all(5),
child: Material( child: Column(
color: Colors.white, crossAxisAlignment: CrossAxisAlignment.start,
borderRadius: BorderRadius.circular(5), children: [
elevation: 4, DefaultTextStyle(
child: Padding( style: TextStyle(
padding: EdgeInsets.all(5), fontSize: 20,
child: Column( color: Colors.black87,
crossAxisAlignment: CrossAxisAlignment.start, fontWeight: FontWeight.w600,
children: [ ),
DefaultTextStyle( child: title,
style: TextStyle(
fontSize: 20,
color: Colors.black87,
fontWeight: FontWeight.w600,
),
child: title,
),
child == null ? SizedBox() : SizedBox(height: 10),
DefaultTextStyle(
style: TextStyle(
fontSize: 16,
color: Colors.black87,
fontWeight: FontWeight.w400,
),
child: child ?? SizedBox(),
),
children == null ? SizedBox() : SizedBox(height: 10),
...children ?? [],
],
), ),
), child == null ? SizedBox() : SizedBox(height: 10),
DefaultTextStyle(
style: TextStyle(
fontSize: 16,
color: Colors.black87,
fontWeight: FontWeight.w400,
),
child: child ?? SizedBox(),
),
children == null ? SizedBox() : SizedBox(height: 10),
...children ?? [],
],
), ),
); );
} }

@ -6,7 +6,7 @@ import 'package:power_logger/src/view/title_view.dart';
class DioErrorView extends StatefulWidget { class DioErrorView extends StatefulWidget {
final DioError data; final DioError data;
DioErrorView({Key key, @required this.data}) : super(key: key); DioErrorView({Key? key, required this.data}) : super(key: key);
@override @override
_DioErrorViewState createState() => _DioErrorViewState(); _DioErrorViewState createState() => _DioErrorViewState();
@ -15,7 +15,7 @@ class DioErrorView extends StatefulWidget {
class _DioErrorViewState extends State<DioErrorView> { class _DioErrorViewState extends State<DioErrorView> {
RequestOptions get _request => widget.data.requestOptions; RequestOptions get _request => widget.data.requestOptions;
_buildBaseURL() { _buildBaseURL() {
return _request.baseUrl == null || _request.baseUrl.length == 0 return _request.baseUrl.length == 0
? const SizedBox() ? const SizedBox()
: BoxView( : BoxView(
title: Text('BaseURL'), title: Text('BaseURL'),
@ -26,7 +26,7 @@ class _DioErrorViewState extends State<DioErrorView> {
_buildPath() { _buildPath() {
return BoxView( return BoxView(
title: const Text('Path'), title: const Text('Path'),
child: Text(_request.path), child: SelectableText(_request.path),
); );
} }
@ -39,6 +39,13 @@ class _DioErrorViewState extends State<DioErrorView> {
); );
} }
_buildMessage() {
return BoxView(
title: const Text('Message'),
child: Text(widget.data.message),
);
}
_buildMap(dynamic params) { _buildMap(dynamic params) {
if (params is FormData) { if (params is FormData) {
Map<String, dynamic> formData = {}; Map<String, dynamic> formData = {};
@ -76,6 +83,7 @@ class _DioErrorViewState extends State<DioErrorView> {
TitleView(title: Text('Request')), TitleView(title: Text('Request')),
_buildBaseURL(), _buildBaseURL(),
_buildPath(), _buildPath(),
_buildMessage(),
_buildMap(_request.headers), _buildMap(_request.headers),
_buildMap(_request.queryParameters), _buildMap(_request.queryParameters),
_buildMap(_request.data), _buildMap(_request.data),

@ -14,8 +14,8 @@ import 'package:power_logger/src/view/title_view.dart';
// enum // enum
class DioResponseView extends StatefulWidget { class DioResponseView extends StatefulWidget {
final Response data; final Response? data;
DioResponseView({Key key, @required this.data}) : super(key: key); DioResponseView({Key? key, required this.data}) : super(key: key);
@override @override
_DioResponseViewState createState() => _DioResponseViewState(); _DioResponseViewState createState() => _DioResponseViewState();
@ -24,9 +24,9 @@ class DioResponseView extends StatefulWidget {
class _DioResponseViewState extends State<DioResponseView> { class _DioResponseViewState extends State<DioResponseView> {
bool _showRawData = false; bool _showRawData = false;
RequestOptions get _request => _dioParser.request; RequestOptions get _request => _dioParser.request;
DioParser _dioParser; late DioParser _dioParser;
_buildBaseURL() { _buildBaseURL() {
return _request.baseUrl == null || _request.baseUrl.length == 0 return _request.baseUrl.length == 0
? const SizedBox() ? const SizedBox()
: BoxView( : BoxView(
title: Text('BaseURL'), title: Text('BaseURL'),
@ -46,9 +46,9 @@ class _DioResponseViewState extends State<DioResponseView> {
title: const Text('Status'), title: const Text('Status'),
children: [ children: [
Chip( Chip(
label: Text(widget.data.statusCode.toString()), label: Text(widget.data!.statusCode.toString()),
), ),
Text(widget.data.statusMessage), Text(widget.data!.statusMessage!),
], ],
); );
} }
@ -77,7 +77,7 @@ class _DioResponseViewState extends State<DioResponseView> {
return BoxView( return BoxView(
title: Text('Data'), title: Text('Data'),
child: HighlightView( child: HighlightView(
widget.data.data, widget.data!.data,
language: _dioParser.highlight, language: _dioParser.highlight,
theme: atomOneLightTheme, theme: atomOneLightTheme,
), ),
@ -85,9 +85,9 @@ class _DioResponseViewState extends State<DioResponseView> {
case ContentType.JSON: case ContentType.JSON:
//JSON. //JSON.
//parse json of String type. //parse json of String type.
if (widget.data.data is String) { if (widget.data!.data is String) {
String json = ''; String json = '';
json = prettyJson(jsonDecode(widget.data.data)); json = prettyJson(jsonDecode(widget.data!.data));
return BoxView( return BoxView(
title: Text('Data'), title: Text('Data'),
child: HighlightView( child: HighlightView(
@ -100,14 +100,13 @@ class _DioResponseViewState extends State<DioResponseView> {
return BoxView( return BoxView(
title: Text('Data'), title: Text('Data'),
child: HighlightView( child: HighlightView(
prettyJson(widget.data.data), prettyJson(widget.data!.data),
language: 'json', language: 'json',
theme: atomOneLightTheme, theme: atomOneLightTheme,
), ),
); );
break;
case ContentType.IMAGE: case ContentType.IMAGE:
return Text("IMAGE"); return Image.network(_request.baseUrl + _request.path);
case ContentType.AUDIO: case ContentType.AUDIO:
return Text("AUDIO"); return Text("AUDIO");
case ContentType.VIDEO: case ContentType.VIDEO:
@ -118,7 +117,7 @@ class _DioResponseViewState extends State<DioResponseView> {
return BoxView( return BoxView(
title: Text('Data'), title: Text('Data'),
child: HighlightView( child: HighlightView(
prettyJson(widget.data.data), prettyJson(widget.data!.data),
language: 'json', language: 'json',
theme: atomOneLightTheme, theme: atomOneLightTheme,
), ),
@ -128,7 +127,7 @@ class _DioResponseViewState extends State<DioResponseView> {
_buildRawData() { _buildRawData() {
return BoxView( return BoxView(
title: Text('Raw Data'), title: Text('Raw Data'),
child: SelectableText(widget.data.data.toString()), child: SelectableText(widget.data!.data.toString()),
); );
} }
@ -152,10 +151,10 @@ class _DioResponseViewState extends State<DioResponseView> {
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
backgroundColor: Colors.green[600], backgroundColor: Colors.green[600],
title: Text(widget.data.requestOptions.path), title: Text(widget.data!.requestOptions.path),
actions: [ actions: [
Chip( Chip(
label: Text(widget.data.requestOptions.method), label: Text(widget.data!.requestOptions.method),
backgroundColor: Colors.lightGreen, backgroundColor: Colors.lightGreen,
), ),
SizedBox(width: 8), SizedBox(width: 8),
@ -171,7 +170,7 @@ class _DioResponseViewState extends State<DioResponseView> {
_buildMap(_request.queryParameters), _buildMap(_request.queryParameters),
_buildMap(_request.data), _buildMap(_request.data),
TitleView(title: Text('Response')), TitleView(title: Text('Response')),
_buildMap(widget.data.headers.map), _buildMap(widget.data!.headers.map),
_buildStatus(), _buildStatus(),
SwitchListTile( SwitchListTile(
value: _showRawData, value: _showRawData,

@ -1,8 +1,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class TableView extends StatelessWidget { class TableView extends StatelessWidget {
final Map map; final Map? map;
const TableView({Key key, @required this.map}) : super(key: key); const TableView({Key? key, required this.map}) : super(key: key);
Widget _buildTableTitle(String title) { Widget _buildTableTitle(String title) {
return Padding( return Padding(
padding: EdgeInsets.all(5), padding: EdgeInsets.all(5),

@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
class TitleView extends StatelessWidget { class TitleView extends StatelessWidget {
final Widget title; final Widget title;
const TitleView({Key key, @required this.title}) : super(key: key); const TitleView({Key? key, required this.title}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {

@ -8,7 +8,7 @@ import 'package:flutter/services.dart';
import 'package:package_info/package_info.dart'; import 'package:package_info/package_info.dart';
class InfoView extends StatefulWidget { class InfoView extends StatefulWidget {
InfoView({Key key}) : super(key: key); InfoView({Key? key}) : super(key: key);
@override @override
_InfoViewState createState() => _InfoViewState(); _InfoViewState createState() => _InfoViewState();
@ -16,9 +16,9 @@ class InfoView extends StatefulWidget {
class _InfoViewState extends State<InfoView> class _InfoViewState extends State<InfoView>
with AutomaticKeepAliveClientMixin { with AutomaticKeepAliveClientMixin {
PackageInfo packageInfo; PackageInfo? packageInfo;
AndroidDeviceInfo androidInfo; AndroidDeviceInfo? androidInfo;
IosDeviceInfo iosInfo; IosDeviceInfo? iosInfo;
Future getAllInfo() async { Future getAllInfo() async {
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
@ -58,7 +58,7 @@ class _InfoViewState extends State<InfoView>
children: [ children: [
Text(title), Text(title),
AutoSizeText( AutoSizeText(
subTitle ?? '', subTitle,
style: TextStyle(fontSize: 26), style: TextStyle(fontSize: 26),
maxLines: 2, maxLines: 2,
), ),
@ -68,7 +68,7 @@ class _InfoViewState extends State<InfoView>
); );
} }
_buildTile(String title, String subTitle) { _buildTile(String title, String? subTitle) {
return DefaultTextStyle( return DefaultTextStyle(
style: TextStyle(color: Colors.black), style: TextStyle(color: Colors.black),
child: ListTile( child: ListTile(
@ -93,53 +93,53 @@ class _InfoViewState extends State<InfoView>
_buildAndroidList() { _buildAndroidList() {
return SliverList( return SliverList(
delegate: SliverChildListDelegate([ delegate: SliverChildListDelegate([
_buildTile('androidId', androidInfo.androidId), _buildTile('androidId', androidInfo!.androidId),
_buildTile('board', androidInfo.board), _buildTile('board', androidInfo!.board),
_buildTile('bootloader', androidInfo.bootloader), _buildTile('bootloader', androidInfo!.bootloader),
_buildTile('brand', androidInfo.brand), _buildTile('brand', androidInfo!.brand),
_buildTile('device', androidInfo.device), _buildTile('device', androidInfo!.device),
_buildTile('display', androidInfo.display), _buildTile('display', androidInfo!.display),
_buildTile('fingerprint', androidInfo.fingerprint), _buildTile('fingerprint', androidInfo!.fingerprint),
_buildTile('hardware', androidInfo.hardware), _buildTile('hardware', androidInfo!.hardware),
_buildTile('host', androidInfo.host), _buildTile('host', androidInfo!.host),
_buildTile('id', androidInfo.id), _buildTile('id', androidInfo!.id),
_buildTile('manufacturer', androidInfo.manufacturer), _buildTile('manufacturer', androidInfo!.manufacturer),
_buildTile('model', androidInfo.model), _buildTile('model', androidInfo!.model),
_buildTile('product', androidInfo.product), _buildTile('product', androidInfo!.product),
_buildTile('tags', androidInfo.tags), _buildTile('tags', androidInfo!.tags),
_buildTile('type', androidInfo.type), _buildTile('type', androidInfo!.type),
_buildTile('isPhysicalDevice', androidInfo.isPhysicalDevice.toString()), _buildTile('isPhysicalDevice', androidInfo!.isPhysicalDevice.toString()),
_buildTile( _buildTile(
'supported32BitAbis', androidInfo.supported32BitAbis.join(',')), 'supported32BitAbis', androidInfo!.supported32BitAbis.join(',')),
_buildTile( _buildTile(
'supported64BitAbis', androidInfo.supported64BitAbis.join(',')), 'supported64BitAbis', androidInfo!.supported64BitAbis.join(',')),
_buildTile('supportedAbis', androidInfo.supportedAbis.join(',')), _buildTile('supportedAbis', androidInfo!.supportedAbis.join(',')),
_buildTile('baseOS', androidInfo.version.baseOS), _buildTile('baseOS', androidInfo!.version.baseOS),
_buildTile('codename', androidInfo.version.codename), _buildTile('codename', androidInfo!.version.codename),
_buildTile('incremental', androidInfo.version.incremental), _buildTile('incremental', androidInfo!.version.incremental),
_buildTile('release', androidInfo.version.release), _buildTile('release', androidInfo!.version.release),
_buildTile('securityPatch', androidInfo.version.securityPatch), _buildTile('securityPatch', androidInfo!.version.securityPatch),
_buildTile('previewSdkInt', androidInfo.version.previewSdkInt.toString()), _buildTile('previewSdkInt', androidInfo!.version.previewSdkInt.toString()),
_buildTile('sdkInt', androidInfo.version.sdkInt.toString()), _buildTile('sdkInt', androidInfo!.version.sdkInt.toString()),
_buildTile('systemFeatures', androidInfo.systemFeatures.join('\n')), _buildTile('systemFeatures', androidInfo!.systemFeatures.join('\n')),
])); ]));
} }
_buildIOSList() { _buildIOSList() {
return SliverList( return SliverList(
delegate: SliverChildListDelegate([ delegate: SliverChildListDelegate([
_buildTile('identifierForVendor', iosInfo.identifierForVendor), _buildTile('identifierForVendor', iosInfo!.identifierForVendor),
_buildTile('localizedModel', iosInfo.localizedModel), _buildTile('localizedModel', iosInfo!.localizedModel),
_buildTile('model', iosInfo.model), _buildTile('model', iosInfo!.model),
_buildTile('name', iosInfo.name), _buildTile('name', iosInfo!.name),
_buildTile('systemName', iosInfo.systemName), _buildTile('systemName', iosInfo!.systemName),
_buildTile('systemVersion', iosInfo.systemVersion), _buildTile('systemVersion', iosInfo!.systemVersion),
_buildTile('isPhysicalDevice', iosInfo.isPhysicalDevice.toString()), _buildTile('isPhysicalDevice', iosInfo!.isPhysicalDevice.toString()),
_buildTile('machine', iosInfo.utsname.machine), _buildTile('machine', iosInfo!.utsname.machine),
_buildTile('nodename', iosInfo.utsname.nodename), _buildTile('nodename', iosInfo!.utsname.nodename),
_buildTile('release', iosInfo.utsname.release), _buildTile('release', iosInfo!.utsname.release),
_buildTile('sysname', iosInfo.utsname.sysname), _buildTile('sysname', iosInfo!.utsname.sysname),
_buildTile('version', iosInfo.utsname.version), _buildTile('version', iosInfo!.utsname.version),
])); ]));
} }
@ -171,10 +171,10 @@ class _InfoViewState extends State<InfoView>
mainAxisSpacing: 10, mainAxisSpacing: 10,
crossAxisSpacing: 10, crossAxisSpacing: 10,
children: [ children: [
_buildGridItem('appName', packageInfo.appName), _buildGridItem('appName', packageInfo!.appName),
_buildGridItem('buildNumber', packageInfo.buildNumber), _buildGridItem('buildNumber', packageInfo!.buildNumber),
_buildGridItem('packageName', packageInfo.packageName), _buildGridItem('packageName', packageInfo!.packageName),
_buildGridItem('version', packageInfo.version), _buildGridItem('version', packageInfo!.version),
], ],
), ),
), ),

@ -3,7 +3,7 @@ import 'package:power_logger/src/data/logger_data.dart';
import 'package:power_logger/src/parser/data_parser.dart'; import 'package:power_logger/src/parser/data_parser.dart';
class LoggerView extends StatefulWidget { class LoggerView extends StatefulWidget {
LoggerView({Key key}) : super(key: key); LoggerView({Key? key}) : super(key: key);
@override @override
_LoggerViewState createState() => _LoggerViewState(); _LoggerViewState createState() => _LoggerViewState();

@ -1,7 +1,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:power_logger/power_logger.dart';
class SettingsView extends StatefulWidget { class SettingsView extends StatefulWidget {
SettingsView({Key key}) : super(key: key); SettingsView({Key? key}) : super(key: key);
@override @override
_SettingsViewState createState() => _SettingsViewState(); _SettingsViewState createState() => _SettingsViewState();
@ -15,8 +16,11 @@ class _SettingsViewState extends State<SettingsView> {
SwitchListTile( SwitchListTile(
title: Text('终端日志'), title: Text('终端日志'),
subtitle: Text(''), subtitle: Text(''),
value: false, value: LoggerData.markLogger,
onChanged: (state) {}, onChanged: (state) {
LoggerData.setLogger(state);
setState(() {});
},
), ),
], ],
); );

@ -3,7 +3,7 @@ import 'package:flutter/physics.dart';
import 'package:power_logger/src/power_logger_view.dart'; import 'package:power_logger/src/power_logger_view.dart';
class LoggerFab extends StatefulWidget { class LoggerFab extends StatefulWidget {
LoggerFab({Key key}) : super(key: key); LoggerFab({Key? key}) : super(key: key);
@override @override
_LoggerFabState createState() => _LoggerFabState(); _LoggerFabState createState() => _LoggerFabState();
@ -12,9 +12,9 @@ class LoggerFab extends StatefulWidget {
class _LoggerFabState extends State<LoggerFab> class _LoggerFabState extends State<LoggerFab>
with SingleTickerProviderStateMixin { with SingleTickerProviderStateMixin {
bool showSubPage = false; bool showSubPage = false;
AnimationController _animationController; AnimationController? _animationController;
var _dragAlignment = Alignment.center; var _dragAlignment = Alignment.center;
Animation<Alignment> _animation; late Animation<Alignment> _animation;
final _spring = final _spring =
const SpringDescription(mass: 15, stiffness: 1000, damping: 0.7); const SpringDescription(mass: 15, stiffness: 1000, damping: 0.7);
@ -34,7 +34,7 @@ class _LoggerFabState extends State<LoggerFab>
calcAlignment = Alignment(calcAlignment.x, 0.9); calcAlignment = Alignment(calcAlignment.x, 0.9);
if (_dragAlignment.y <= -0.9) if (_dragAlignment.y <= -0.9)
calcAlignment = Alignment(calcAlignment.x, -0.9); calcAlignment = Alignment(calcAlignment.x, -0.9);
_animation = _animationController.drive( _animation = _animationController!.drive(
AlignmentTween( AlignmentTween(
begin: _dragAlignment, begin: _dragAlignment,
end: calcAlignment, end: calcAlignment,
@ -44,7 +44,7 @@ class _LoggerFabState extends State<LoggerFab>
final simulation = final simulation =
SpringSimulation(_spring, 0, 1, _normalizeVelocity(velocity, size)); SpringSimulation(_spring, 0, 1, _normalizeVelocity(velocity, size));
_animationController.animateWith(simulation); _animationController!.animateWith(simulation);
} }
@override @override
@ -69,7 +69,7 @@ class _LoggerFabState extends State<LoggerFab>
duration: Duration(milliseconds: 300), duration: Duration(milliseconds: 300),
opacity: showSubPage ? 0 : 1, opacity: showSubPage ? 0 : 1,
child: GestureDetector( child: GestureDetector(
onPanStart: (details) => _animationController.stop(canceled: true), onPanStart: (details) => _animationController!.stop(canceled: true),
onPanUpdate: (details) => setState(() => _dragAlignment += Alignment( onPanUpdate: (details) => setState(() => _dragAlignment += Alignment(
details.delta.dx / (size.width / 2), details.delta.dx / (size.width / 2),
details.delta.dy / (size.height / 2), details.delta.dy / (size.height / 2),
@ -94,7 +94,7 @@ class _LoggerFabState extends State<LoggerFab>
} }
class _FabButton extends StatelessWidget { class _FabButton extends StatelessWidget {
const _FabButton({Key key}) : super(key: key); const _FabButton({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {

@ -5,77 +5,77 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: async name: async
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.5.0" version: "2.5.0"
auto_size_text: auto_size_text:
dependency: "direct main" dependency: "direct main"
description: description:
name: auto_size_text name: auto_size_text
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.0.0-nullsafety.0" version: "3.0.0-nullsafety.0"
boolean_selector: boolean_selector:
dependency: transitive dependency: transitive
description: description:
name: boolean_selector name: boolean_selector
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.0" version: "2.1.0"
characters: characters:
dependency: transitive dependency: transitive
description: description:
name: characters name: characters
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.0" version: "1.1.0"
charcode: charcode:
dependency: transitive dependency: transitive
description: description:
name: charcode name: charcode
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.0" version: "1.2.0"
clock: clock:
dependency: transitive dependency: transitive
description: description:
name: clock name: clock
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.0" version: "1.1.0"
collection: collection:
dependency: transitive dependency: transitive
description: description:
name: collection name: collection
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.15.0" version: "1.15.0"
device_info: device_info:
dependency: "direct main" dependency: "direct main"
description: description:
name: device_info name: device_info
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.0" version: "2.0.0"
device_info_platform_interface: device_info_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: device_info_platform_interface name: device_info_platform_interface
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.1" version: "2.0.1"
dio: dio:
dependency: "direct main" dependency: "direct main"
description: description:
name: dio name: dio
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "4.0.0-prev3" version: "4.0.0-prev3"
fake_async: fake_async:
dependency: transitive dependency: transitive
description: description:
name: fake_async name: fake_async
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.0" version: "1.2.0"
flutter: flutter:
@ -87,7 +87,7 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: flutter_highlight name: flutter_highlight
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.7.0" version: "0.7.0"
flutter_test: flutter_test:
@ -99,49 +99,56 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: highlight name: highlight
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.7.0" version: "0.7.0"
http_parser: http_parser:
dependency: transitive dependency: transitive
description: description:
name: http_parser name: http_parser
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "4.0.0" version: "4.0.0"
logger:
dependency: "direct main"
description:
name: logger
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.0"
matcher: matcher:
dependency: transitive dependency: transitive
description: description:
name: matcher name: matcher
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.12.10" version: "0.12.10"
meta: meta:
dependency: transitive dependency: transitive
description: description:
name: meta name: meta
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.3.0" version: "1.3.0"
package_info: package_info:
dependency: "direct main" dependency: "direct main"
description: description:
name: package_info name: package_info
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.0" version: "2.0.0"
path: path:
dependency: transitive dependency: transitive
description: description:
name: path name: path
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.8.0" version: "1.8.0"
plugin_platform_interface: plugin_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: plugin_platform_interface name: plugin_platform_interface
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.0" version: "2.0.0"
sky_engine: sky_engine:
@ -153,56 +160,56 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: source_span name: source_span
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.8.0" version: "1.8.0"
stack_trace: stack_trace:
dependency: transitive dependency: transitive
description: description:
name: stack_trace name: stack_trace
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.10.0" version: "1.10.0"
stream_channel: stream_channel:
dependency: transitive dependency: transitive
description: description:
name: stream_channel name: stream_channel
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.0" version: "2.1.0"
string_scanner: string_scanner:
dependency: transitive dependency: transitive
description: description:
name: string_scanner name: string_scanner
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.0" version: "1.1.0"
term_glyph: term_glyph:
dependency: transitive dependency: transitive
description: description:
name: term_glyph name: term_glyph
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.0" version: "1.2.0"
test_api: test_api:
dependency: transitive dependency: transitive
description: description:
name: test_api name: test_api
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.2.19" version: "0.2.19"
typed_data: typed_data:
dependency: transitive dependency: transitive
description: description:
name: typed_data name: typed_data
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.3.0" version: "1.3.0"
vector_math: vector_math:
dependency: transitive dependency: transitive
description: description:
name: vector_math name: vector_math
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.0" version: "2.1.0"
sdks: sdks:

@ -1,10 +1,10 @@
name: power_logger name: power_logger
description: A well log tool on flutter, support Dio and custom type data. description: A well log tool on flutter, support Dio and custom type data.
version: 0.1.3 version: 1.0.1-nullsafety.1
homepage: https://github.com/laiiihz/power_logger homepage: https://github.com/laiiihz/power_logger
environment: environment:
sdk: ">=2.7.0 <3.0.0" sdk: '>=2.12.0 <3.0.0'
flutter: ">=1.17.0" flutter: ">=1.17.0"
dependencies: dependencies:
@ -14,7 +14,8 @@ dependencies:
flutter_highlight: ^0.7.0 flutter_highlight: ^0.7.0
device_info: ^2.0.0 device_info: ^2.0.0
package_info: ^2.0.0 package_info: ^2.0.0
auto_size_text: 3.0.0-nullsafety.0 auto_size_text: ^3.0.0-nullsafety.0
logger: ^1.0.0
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:

Loading…
Cancel
Save