155 lines
4.4 KiB
Dart
155 lines
4.4 KiB
Dart
//SECTION - Imports
|
|
//
|
|
//s1 PACKAGES
|
|
//---------------
|
|
//s2 CORE
|
|
import 'package:flutter/material.dart';
|
|
//s2 3RD-PARTY
|
|
//
|
|
//s1 DEPENDENCIES
|
|
//----------------
|
|
//s2 SERVICES
|
|
//s2 MODELS
|
|
import 'style.dart';
|
|
//s2 MISC
|
|
//!SECTION - Imports
|
|
//
|
|
//SECTION - Exports
|
|
//!SECTION - Exports
|
|
//
|
|
|
|
class AstromicButtonBase extends StatefulWidget {
|
|
//SECTION - Widget Arguments
|
|
//s1 -- Functionality
|
|
final VoidCallback? onTap;
|
|
final VoidCallback? onHold;
|
|
//s1 -- Configurations
|
|
final bool isEnabled;
|
|
final bool withFeedback;
|
|
final bool withHighlightChange;
|
|
final TextDirection textDirection;
|
|
//s1 -- Style
|
|
final InteractiveInkFeatureFactory? splashFactory;
|
|
final AstromicButtonStyle Function(bool isEnabled, bool isHighlighted) style;
|
|
//s1 -- Content
|
|
final Widget Function(bool isEnabled, bool isHighlighted) child;
|
|
//!SECTION
|
|
//
|
|
const AstromicButtonBase({
|
|
Key? key,
|
|
//
|
|
this.onTap,
|
|
this.onHold,
|
|
//
|
|
this.isEnabled = true,
|
|
this.withFeedback = true,
|
|
this.withHighlightChange = true,
|
|
required this.textDirection,
|
|
//s1 -- Style
|
|
this.splashFactory,
|
|
required this.style,
|
|
//s1 -- Content
|
|
required this.child,
|
|
}) : super(
|
|
key: key,
|
|
);
|
|
|
|
@override
|
|
State<AstromicButtonBase> createState() => _AstromicButtonBaseState();
|
|
}
|
|
|
|
class _AstromicButtonBaseState extends State<AstromicButtonBase> {
|
|
//
|
|
//SECTION - State Variables
|
|
//s1 --Controllers
|
|
//s1 --Controllers
|
|
//
|
|
//s1 --State
|
|
late bool _isHighlighted;
|
|
//s1 --State
|
|
//
|
|
//s1 --Constants
|
|
//s1 --Constants
|
|
//!SECTION
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
//
|
|
//SECTION - State Variables initializations & Listeners
|
|
//s1 --Controllers & Listeners
|
|
//s1 --Controllers & Listeners
|
|
//
|
|
//s1 --State
|
|
_isHighlighted = false;
|
|
//s1 --State
|
|
//
|
|
//s1 --Late & Async Initializers
|
|
//s1 --Late & Async Initializers
|
|
//!SECTION
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
//SECTION - Build Setup
|
|
//s1 -Values
|
|
//s1 -Values
|
|
//
|
|
//s1 -Widgets
|
|
//s1 -Widgets
|
|
//!SECTION
|
|
|
|
//SECTION - Build Return
|
|
return Material(
|
|
color: widget.style(widget.isEnabled, _isHighlighted).backgroundGradient != null ? Colors.transparent : widget.style(widget.isEnabled, _isHighlighted).backgroundColor,
|
|
shape: OutlineInputBorder(
|
|
borderSide: BorderSide(
|
|
width: widget.style(widget.isEnabled, _isHighlighted).borderWidth ?? 1,
|
|
color: widget.style(widget.isEnabled, _isHighlighted).borderColor ?? Colors.black,
|
|
),
|
|
borderRadius: widget.style(widget.isEnabled, _isHighlighted).borderRadius?.resolve(widget.textDirection) ?? BorderRadius.circular(0),
|
|
),
|
|
child: Ink(
|
|
decoration: BoxDecoration(
|
|
borderRadius: widget.style(widget.isEnabled, _isHighlighted).borderRadius?.resolve(widget.textDirection) ?? BorderRadius.circular(0),
|
|
gradient: widget.style(widget.isEnabled, _isHighlighted).backgroundGradient,
|
|
),
|
|
child: InkWell(
|
|
splashFactory: widget.splashFactory,
|
|
splashColor: widget.withFeedback ? widget.style(widget.isEnabled, _isHighlighted).splashColor : Colors.transparent,
|
|
hoverColor: widget.withFeedback ? widget.style(widget.isEnabled, _isHighlighted).hoverColor : Colors.transparent,
|
|
highlightColor: widget.withFeedback ? widget.style(widget.isEnabled, _isHighlighted).highlightColor : Colors.transparent,
|
|
//
|
|
borderRadius: widget.style(widget.isEnabled, _isHighlighted).borderRadius?.resolve(widget.textDirection) ?? BorderRadius.circular(0),
|
|
//
|
|
onTap: widget.isEnabled && widget.onTap != null ? widget.onTap : null,
|
|
onLongPress: widget.isEnabled && widget.onHold != null ? widget.onHold : null,
|
|
onHighlightChanged: widget.withHighlightChange
|
|
? (v) {
|
|
setState(() {
|
|
_isHighlighted = v;
|
|
});
|
|
}
|
|
: null,
|
|
//
|
|
child: Padding(
|
|
padding: widget.style(widget.isEnabled, _isHighlighted).contentPadding ?? EdgeInsets.zero,
|
|
child: widget.child(
|
|
widget.isEnabled,
|
|
_isHighlighted,
|
|
),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
//!SECTION
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
//SECTION - Disposable variables
|
|
//!SECTION
|
|
super.dispose();
|
|
}
|
|
}
|