wip: highlight wallet with status in safe wallet list
This commit is contained in:
parent
b916c44db4
commit
7514eb7299
|
@ -10,15 +10,14 @@ import 'package:gecko/providers/my_wallets.dart';
|
||||||
import 'package:gecko/models/wallet_data.dart';
|
import 'package:gecko/models/wallet_data.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:gecko/providers/substrate_sdk.dart';
|
import 'package:gecko/providers/substrate_sdk.dart';
|
||||||
import 'package:gecko/providers/wallet_options.dart';
|
|
||||||
import 'package:gecko/screens/myWallets/chest_options.dart';
|
import 'package:gecko/screens/myWallets/chest_options.dart';
|
||||||
import 'package:gecko/screens/myWallets/import_g1_v1.dart';
|
import 'package:gecko/screens/myWallets/import_g1_v1.dart';
|
||||||
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
|
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
|
||||||
import 'package:gecko/widgets/balance.dart';
|
|
||||||
import 'package:gecko/widgets/bottom_app_bar.dart';
|
import 'package:gecko/widgets/bottom_app_bar.dart';
|
||||||
import 'package:gecko/widgets/commons/offline_info.dart';
|
import 'package:gecko/widgets/commons/offline_info.dart';
|
||||||
import 'package:gecko/widgets/payment_popup.dart';
|
import 'package:gecko/widgets/payment_popup.dart';
|
||||||
import 'package:gecko/widgets/wallet_tile.dart';
|
import 'package:gecko/widgets/wallet_tile.dart';
|
||||||
|
import 'package:gecko/widgets/wallet_tile_membre.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:flutter_svg/flutter_svg.dart';
|
import 'package:flutter_svg/flutter_svg.dart';
|
||||||
import 'package:tutorial_coach_mark/tutorial_coach_mark.dart';
|
import 'package:tutorial_coach_mark/tutorial_coach_mark.dart';
|
||||||
|
@ -224,8 +223,6 @@ class _WalletsHomeState extends State<WalletsHome> {
|
||||||
|
|
||||||
Widget myWalletsTiles(BuildContext context, int currentChestNumber) {
|
Widget myWalletsTiles(BuildContext context, int currentChestNumber) {
|
||||||
final myWalletProvider = Provider.of<MyWalletsProvider>(context);
|
final myWalletProvider = Provider.of<MyWalletsProvider>(context);
|
||||||
final walletOptions =
|
|
||||||
Provider.of<WalletOptionsProvider>(context, listen: false);
|
|
||||||
final bool isWalletsExists = myWalletProvider.checkIfWalletExist();
|
final bool isWalletsExists = myWalletProvider.checkIfWalletExist();
|
||||||
final sub = Provider.of<SubstrateSdk>(context, listen: false);
|
final sub = Provider.of<SubstrateSdk>(context, listen: false);
|
||||||
|
|
||||||
|
@ -250,6 +247,13 @@ class _WalletsHomeState extends State<WalletsHome> {
|
||||||
return Comparable.compare(p1.number!, p2.number!);
|
return Comparable.compare(p1.number!, p2.number!);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Get first wallet with identity
|
||||||
|
final idtyWallet = listWallets.firstWhere(
|
||||||
|
(w) => w.hasIdentity(),
|
||||||
|
orElse: () => WalletData(address: ''),
|
||||||
|
);
|
||||||
|
listWallets.removeWhere((w) => w.address == idtyWallet.address);
|
||||||
|
|
||||||
WalletData? defaultWallet = myWalletProvider.getDefaultWallet();
|
WalletData? defaultWallet = myWalletProvider.getDefaultWallet();
|
||||||
final screenWidth = MediaQuery.of(context).size.width;
|
final screenWidth = MediaQuery.of(context).size.width;
|
||||||
int nTule;
|
int nTule;
|
||||||
|
@ -303,6 +307,10 @@ class _WalletsHomeState extends State<WalletsHome> {
|
||||||
|
|
||||||
return CustomScrollView(slivers: <Widget>[
|
return CustomScrollView(slivers: <Widget>[
|
||||||
const SliverToBoxAdapter(child: SizedBox(height: 20)),
|
const SliverToBoxAdapter(child: SizedBox(height: 20)),
|
||||||
|
if (idtyWallet.address != '')
|
||||||
|
SliverToBoxAdapter(
|
||||||
|
child: WalletTileMembre(
|
||||||
|
repository: idtyWallet, defaultWallet: defaultWallet)),
|
||||||
SliverGrid.count(
|
SliverGrid.count(
|
||||||
key: keyListWallets,
|
key: keyListWallets,
|
||||||
crossAxisCount: nTule,
|
crossAxisCount: nTule,
|
||||||
|
@ -366,10 +374,7 @@ class _WalletsHomeState extends State<WalletsHome> {
|
||||||
List<dynamic> rejected,
|
List<dynamic> rejected,
|
||||||
) {
|
) {
|
||||||
return WalletTile(
|
return WalletTile(
|
||||||
repository: repository,
|
repository: repository, defaultWallet: defaultWallet);
|
||||||
walletOptions: walletOptions,
|
|
||||||
defaultWallet: defaultWallet,
|
|
||||||
currentChestNumber: currentChestNumber);
|
|
||||||
}),
|
}),
|
||||||
),
|
),
|
||||||
Consumer<SubstrateSdk>(builder: (context, sub, _) {
|
Consumer<SubstrateSdk>(builder: (context, sub, _) {
|
||||||
|
@ -443,95 +448,3 @@ class _WalletsHomeState extends State<WalletsHome> {
|
||||||
])));
|
])));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class BalanceBuilder extends StatelessWidget {
|
|
||||||
const BalanceBuilder({
|
|
||||||
Key? key,
|
|
||||||
required this.address,
|
|
||||||
required this.isDefault,
|
|
||||||
}) : super(key: key);
|
|
||||||
|
|
||||||
final String address;
|
|
||||||
final bool isDefault;
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Container(
|
|
||||||
width: double.infinity,
|
|
||||||
color: isDefault ? orangeC : yellowC,
|
|
||||||
child: Padding(
|
|
||||||
padding:
|
|
||||||
const EdgeInsets.only(left: 5, right: 5, top: 38, bottom: 10),
|
|
||||||
child: Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
|
||||||
children: [
|
|
||||||
Opacity(
|
|
||||||
opacity: 0.7,
|
|
||||||
child: Balance(
|
|
||||||
address: address,
|
|
||||||
size: 16,
|
|
||||||
color: isDefault ? Colors.white : Colors.black,
|
|
||||||
loadingColor: isDefault ? yellowC : orangeC),
|
|
||||||
)
|
|
||||||
],
|
|
||||||
)),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class CustomClipperOval extends CustomClipper<Rect> {
|
|
||||||
@override
|
|
||||||
Rect getClip(Size size) {
|
|
||||||
return Rect.fromCircle(
|
|
||||||
center: Offset(size.width / 2, size.width / 2),
|
|
||||||
radius: size.width / 2 + 3);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
bool shouldReclip(CustomClipper<Rect> oldClipper) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class ClipOvalShadow extends StatelessWidget {
|
|
||||||
final Shadow shadow;
|
|
||||||
final CustomClipper<Rect> clipper;
|
|
||||||
final Widget child;
|
|
||||||
|
|
||||||
const ClipOvalShadow({
|
|
||||||
Key? key,
|
|
||||||
required this.shadow,
|
|
||||||
required this.clipper,
|
|
||||||
required this.child,
|
|
||||||
}) : super(key: key);
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return CustomPaint(
|
|
||||||
painter: _ClipOvalShadowPainter(
|
|
||||||
clipper: clipper,
|
|
||||||
shadow: shadow,
|
|
||||||
),
|
|
||||||
child: ClipRect(clipper: clipper, child: child),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class _ClipOvalShadowPainter extends CustomPainter {
|
|
||||||
final Shadow shadow;
|
|
||||||
final CustomClipper<Rect> clipper;
|
|
||||||
|
|
||||||
_ClipOvalShadowPainter({required this.shadow, required this.clipper});
|
|
||||||
|
|
||||||
@override
|
|
||||||
void paint(Canvas canvas, Size size) {
|
|
||||||
var paint = shadow.toPaint();
|
|
||||||
var clipRect = clipper.getClip(size).shift(const Offset(0, 0));
|
|
||||||
canvas.drawOval(clipRect, paint);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
bool shouldRepaint(CustomPainter oldDelegate) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,28 +1,22 @@
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:gecko/globals.dart';
|
import 'package:gecko/globals.dart';
|
||||||
import 'package:gecko/models/wallet_data.dart';
|
import 'package:gecko/models/wallet_data.dart';
|
||||||
import 'package:gecko/models/widgets_keys.dart';
|
import 'package:gecko/models/widgets_keys.dart';
|
||||||
import 'package:gecko/providers/wallet_options.dart';
|
|
||||||
import 'package:gecko/screens/myWallets/wallet_options.dart';
|
import 'package:gecko/screens/myWallets/wallet_options.dart';
|
||||||
import 'package:gecko/screens/myWallets/wallets_home.dart';
|
import 'package:gecko/widgets/balance.dart';
|
||||||
import 'package:gecko/widgets/commons/smooth_transition.dart';
|
import 'package:gecko/widgets/commons/smooth_transition.dart';
|
||||||
import 'package:gecko/widgets/name_by_address.dart';
|
import 'package:gecko/widgets/name_by_address.dart';
|
||||||
|
|
||||||
class WalletTile extends StatelessWidget {
|
class WalletTile extends StatelessWidget {
|
||||||
const WalletTile(
|
const WalletTile({
|
||||||
{Key? key,
|
Key? key,
|
||||||
required this.repository,
|
required this.repository,
|
||||||
required this.walletOptions,
|
required this.defaultWallet,
|
||||||
required this.defaultWallet,
|
}) : super(key: key);
|
||||||
required this.currentChestNumber})
|
|
||||||
: super(key: key);
|
|
||||||
|
|
||||||
final WalletData repository;
|
final WalletData repository;
|
||||||
final WalletOptionsProvider walletOptions;
|
|
||||||
final WalletData defaultWallet;
|
final WalletData defaultWallet;
|
||||||
final int currentChestNumber;
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
@ -31,7 +25,6 @@ class WalletTile extends StatelessWidget {
|
||||||
child: GestureDetector(
|
child: GestureDetector(
|
||||||
key: keyOpenWallet(repository.address),
|
key: keyOpenWallet(repository.address),
|
||||||
onTap: () {
|
onTap: () {
|
||||||
walletOptions.getAddress(currentChestNumber, repository.derivation!);
|
|
||||||
Navigator.push(
|
Navigator.push(
|
||||||
context,
|
context,
|
||||||
SmoothTransition(
|
SmoothTransition(
|
||||||
|
@ -121,3 +114,95 @@ class WalletTile extends StatelessWidget {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class BalanceBuilder extends StatelessWidget {
|
||||||
|
const BalanceBuilder({
|
||||||
|
Key? key,
|
||||||
|
required this.address,
|
||||||
|
required this.isDefault,
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
|
final String address;
|
||||||
|
final bool isDefault;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Container(
|
||||||
|
width: double.infinity,
|
||||||
|
color: isDefault ? orangeC : yellowC,
|
||||||
|
child: Padding(
|
||||||
|
padding:
|
||||||
|
const EdgeInsets.only(left: 5, right: 5, top: 38, bottom: 10),
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
Opacity(
|
||||||
|
opacity: 0.7,
|
||||||
|
child: Balance(
|
||||||
|
address: address,
|
||||||
|
size: 16,
|
||||||
|
color: isDefault ? Colors.white : Colors.black,
|
||||||
|
loadingColor: isDefault ? yellowC : orangeC),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
)),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ClipOvalShadow extends StatelessWidget {
|
||||||
|
final Shadow shadow;
|
||||||
|
final CustomClipper<Rect> clipper;
|
||||||
|
final Widget child;
|
||||||
|
|
||||||
|
const ClipOvalShadow({
|
||||||
|
Key? key,
|
||||||
|
required this.shadow,
|
||||||
|
required this.clipper,
|
||||||
|
required this.child,
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return CustomPaint(
|
||||||
|
painter: _ClipOvalShadowPainter(
|
||||||
|
clipper: clipper,
|
||||||
|
shadow: shadow,
|
||||||
|
),
|
||||||
|
child: ClipRect(clipper: clipper, child: child),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class _ClipOvalShadowPainter extends CustomPainter {
|
||||||
|
final Shadow shadow;
|
||||||
|
final CustomClipper<Rect> clipper;
|
||||||
|
|
||||||
|
_ClipOvalShadowPainter({required this.shadow, required this.clipper});
|
||||||
|
|
||||||
|
@override
|
||||||
|
void paint(Canvas canvas, Size size) {
|
||||||
|
var paint = shadow.toPaint();
|
||||||
|
var clipRect = clipper.getClip(size).shift(const Offset(0, 0));
|
||||||
|
canvas.drawOval(clipRect, paint);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool shouldRepaint(CustomPainter oldDelegate) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class CustomClipperOval extends CustomClipper<Rect> {
|
||||||
|
@override
|
||||||
|
Rect getClip(Size size) {
|
||||||
|
return Rect.fromCircle(
|
||||||
|
center: Offset(size.width / 2, size.width / 2),
|
||||||
|
radius: size.width / 2 + 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool shouldReclip(CustomClipper<Rect> oldClipper) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,209 @@
|
||||||
|
import 'dart:io';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:gecko/globals.dart';
|
||||||
|
import 'package:gecko/models/wallet_data.dart';
|
||||||
|
import 'package:gecko/models/widgets_keys.dart';
|
||||||
|
import 'package:gecko/screens/myWallets/wallet_options.dart';
|
||||||
|
import 'package:gecko/widgets/balance.dart';
|
||||||
|
import 'package:gecko/widgets/commons/smooth_transition.dart';
|
||||||
|
import 'package:gecko/widgets/name_by_address.dart';
|
||||||
|
|
||||||
|
class WalletTileMembre extends StatelessWidget {
|
||||||
|
const WalletTileMembre({
|
||||||
|
Key? key,
|
||||||
|
required this.repository,
|
||||||
|
required this.defaultWallet,
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
|
final WalletData repository;
|
||||||
|
final WalletData defaultWallet;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Padding(
|
||||||
|
padding: const EdgeInsets.symmetric(horizontal: 70, vertical: 20),
|
||||||
|
child: GestureDetector(
|
||||||
|
key: keyOpenWallet(repository.address),
|
||||||
|
onTap: () {
|
||||||
|
Navigator.push(
|
||||||
|
context,
|
||||||
|
SmoothTransition(
|
||||||
|
page: WalletOptions(
|
||||||
|
wallet: repository,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
child: SizedBox(
|
||||||
|
key: repository.number == 1 ? keyDragAndDrop : const Key('nothing'),
|
||||||
|
height: 240,
|
||||||
|
child: ClipOvalShadow(
|
||||||
|
shadow: const Shadow(
|
||||||
|
color: Colors.transparent,
|
||||||
|
offset: Offset(0, 0),
|
||||||
|
blurRadius: 5,
|
||||||
|
),
|
||||||
|
clipper: CustomClipperOval(),
|
||||||
|
child: ClipRRect(
|
||||||
|
borderRadius: const BorderRadius.all(Radius.circular(12)),
|
||||||
|
child: Column(children: <Widget>[
|
||||||
|
Expanded(
|
||||||
|
child: Container(
|
||||||
|
width: double.infinity,
|
||||||
|
height: double.infinity,
|
||||||
|
decoration: const BoxDecoration(
|
||||||
|
gradient: RadialGradient(
|
||||||
|
radius: 0.8,
|
||||||
|
colors: [
|
||||||
|
Color.fromARGB(255, 255, 255, 211),
|
||||||
|
yellowC,
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
child: repository.imageCustomPath == null ||
|
||||||
|
repository.imageCustomPath == ''
|
||||||
|
? Image.asset(
|
||||||
|
'assets/avatars/${repository.imageDefaultPath}',
|
||||||
|
alignment: Alignment.bottomCenter,
|
||||||
|
scale: 0.5,
|
||||||
|
)
|
||||||
|
: Container(
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
shape: BoxShape.circle,
|
||||||
|
color: Colors.transparent,
|
||||||
|
image: DecorationImage(
|
||||||
|
fit: BoxFit.fitHeight,
|
||||||
|
image: FileImage(
|
||||||
|
File(repository.imageCustomPath!),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)),
|
||||||
|
Stack(children: <Widget>[
|
||||||
|
BalanceBuilder(
|
||||||
|
address: repository.address,
|
||||||
|
isDefault: repository.address == defaultWallet.address),
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
Column(
|
||||||
|
children: [
|
||||||
|
const SizedBox(height: 7),
|
||||||
|
Opacity(
|
||||||
|
opacity: 0.7,
|
||||||
|
child: NameByAddress(
|
||||||
|
wallet: repository,
|
||||||
|
size: 20,
|
||||||
|
color:
|
||||||
|
defaultWallet.address == repository.address
|
||||||
|
? Colors.white
|
||||||
|
: Colors.black,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
fontStyle: FontStyle.normal,
|
||||||
|
))
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]),
|
||||||
|
]),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class BalanceBuilder extends StatelessWidget {
|
||||||
|
const BalanceBuilder({
|
||||||
|
Key? key,
|
||||||
|
required this.address,
|
||||||
|
required this.isDefault,
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
|
final String address;
|
||||||
|
final bool isDefault;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Container(
|
||||||
|
width: double.infinity,
|
||||||
|
color: isDefault ? orangeC : yellowC,
|
||||||
|
child: Padding(
|
||||||
|
padding:
|
||||||
|
const EdgeInsets.only(left: 5, right: 5, top: 45, bottom: 10),
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
Opacity(
|
||||||
|
opacity: 0.7,
|
||||||
|
child: Balance(
|
||||||
|
address: address,
|
||||||
|
size: 16,
|
||||||
|
color: isDefault ? Colors.white : Colors.black,
|
||||||
|
loadingColor: isDefault ? yellowC : orangeC),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
)),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ClipOvalShadow extends StatelessWidget {
|
||||||
|
final Shadow shadow;
|
||||||
|
final CustomClipper<Rect> clipper;
|
||||||
|
final Widget child;
|
||||||
|
|
||||||
|
const ClipOvalShadow({
|
||||||
|
Key? key,
|
||||||
|
required this.shadow,
|
||||||
|
required this.clipper,
|
||||||
|
required this.child,
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return CustomPaint(
|
||||||
|
painter: _ClipOvalShadowPainter(
|
||||||
|
clipper: clipper,
|
||||||
|
shadow: shadow,
|
||||||
|
),
|
||||||
|
child: ClipRect(clipper: clipper, child: child),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class _ClipOvalShadowPainter extends CustomPainter {
|
||||||
|
final Shadow shadow;
|
||||||
|
final CustomClipper<Rect> clipper;
|
||||||
|
|
||||||
|
_ClipOvalShadowPainter({required this.shadow, required this.clipper});
|
||||||
|
|
||||||
|
@override
|
||||||
|
void paint(Canvas canvas, Size size) {
|
||||||
|
var paint = shadow.toPaint();
|
||||||
|
var clipRect = clipper.getClip(size).shift(const Offset(0, 0));
|
||||||
|
canvas.drawOval(clipRect, paint);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool shouldRepaint(CustomPainter oldDelegate) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class CustomClipperOval extends CustomClipper<Rect> {
|
||||||
|
@override
|
||||||
|
Rect getClip(Size size) {
|
||||||
|
return Rect.fromCircle(
|
||||||
|
center: Offset(size.width / 2, size.width / 2),
|
||||||
|
radius: size.width / 2 + 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool shouldReclip(CustomClipper<Rect> oldClipper) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue