flutter架 构项目基础
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:talker_flutter/talker_flutter.dart';
|
||||
import 'package:new_learn/core/router/router_keys.dart';
|
||||
|
||||
final Talker talker = Talker();
|
||||
|
||||
class DebugTalkerBubble extends StatefulWidget {
|
||||
const DebugTalkerBubble({
|
||||
super.key,
|
||||
required this.child,
|
||||
});
|
||||
|
||||
final Widget child;
|
||||
|
||||
@override
|
||||
State<DebugTalkerBubble> createState() => _DebugTalkerBubbleState();
|
||||
}
|
||||
|
||||
class _DebugTalkerBubbleState extends State<DebugTalkerBubble> {
|
||||
Offset _offset = const Offset(16, 120);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
if (kReleaseMode) return widget.child;
|
||||
|
||||
return LayoutBuilder(
|
||||
builder: (context, constraints) {
|
||||
final maxX = constraints.maxWidth - 56;
|
||||
final maxY = constraints.maxHeight - 56;
|
||||
|
||||
final clamped = Offset(
|
||||
_offset.dx.clamp(0.0, maxX.isFinite ? maxX : 0.0),
|
||||
_offset.dy.clamp(0.0, maxY.isFinite ? maxY : 0.0),
|
||||
);
|
||||
|
||||
if (clamped != _offset) {
|
||||
_offset = clamped;
|
||||
}
|
||||
|
||||
return Stack(
|
||||
children: [
|
||||
widget.child,
|
||||
Positioned(
|
||||
left: _offset.dx,
|
||||
top: _offset.dy,
|
||||
child: GestureDetector(
|
||||
onPanUpdate: (details) {
|
||||
setState(() {
|
||||
_offset += details.delta;
|
||||
});
|
||||
},
|
||||
child: FloatingActionButton(
|
||||
onPressed: () {
|
||||
final nav = rootNavigatorKey.currentState;
|
||||
if (nav == null) return;
|
||||
nav.push(
|
||||
MaterialPageRoute<void>(
|
||||
builder: (_) => TalkerScreen(talker: talker),
|
||||
),
|
||||
);
|
||||
},
|
||||
child: const Icon(Icons.bug_report),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user