Skip to content

Commit 641b5be

Browse files
Jayson1999Jayson6099mzdm
authored
fix: rendering overflow issue if bubbles > 5 (#96)
* - Fix #76 Use screen's width to apply container's width of page bubbles if > 5. * - Incremented version * fix: alignment of the bubbles * add an assert * chore: update version & changelog * fix: formatting * chore: move extension to a separate folder * chore: optimize calculating the bubble width * chore: update CHANGELOG.md * chore: clarify assert * chore: added test for assertion * chore: added test for overflow Co-authored-by: Jayson6099 <[email protected]> Co-authored-by: Matej Zidek <[email protected]>
1 parent 6a90108 commit 641b5be

15 files changed

+80
-13
lines changed

CHANGELOG.md

+5
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
## 3.2.0
2+
* Fixed overflowing issue with the bubbles. Thanks @Jayson1999
3+
* Updated app example
4+
* Updated CI
5+
16
## 3.1.1
27
* Updated app example. Thanks @zognotadog
38

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ You should ensure that you add the `intro_views_flutter` as a dependency in your
6565

6666
```yaml
6767
dependencies:
68-
intro_views_flutter: '^3.1.1'
68+
intro_views_flutter: '^3.2.0'
6969
```
7070
7171
You can also reference the git repository directly if you want:

lib/src/animation_gesture/animated_page_dragger.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import 'dart:async';
22
import 'dart:ui';
33

44
import 'package:flutter/material.dart';
5-
import 'package:intro_views_flutter/src/constants/constants.dart';
5+
import 'package:intro_views_flutter/src/helpers/constants.dart';
66
import 'package:intro_views_flutter/src/models/slide_update_model.dart';
77

88
/// This class provides the animation controller

lib/src/animation_gesture/page_dragger.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import 'dart:async';
22

33
import 'package:flutter/material.dart';
4-
import 'package:intro_views_flutter/src/constants/constants.dart';
4+
import 'package:intro_views_flutter/src/helpers/constants.dart';
55
import 'package:intro_views_flutter/src/models/slide_update_model.dart';
66

77
/// This class is used to get user gesture and work according to it.
File renamed without changes.

lib/src/helpers/extensions.dart

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import 'package:flutter/cupertino.dart';
2+
3+
extension BuildContextExt on BuildContext {
4+
double get screenWidth => MediaQuery.of(this).size.width;
5+
}

lib/src/models/page_button_view_model.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import 'package:intro_views_flutter/src/constants/constants.dart';
1+
import 'package:intro_views_flutter/src/helpers/constants.dart';
22

33
/// This is view model for the skip and done buttons.
44
class PageButtonViewModel {

lib/src/models/pager_indicator_view_model.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import 'package:intro_views_flutter/src/constants/constants.dart';
1+
import 'package:intro_views_flutter/src/helpers/constants.dart';
22
import 'package:intro_views_flutter/src/models/page_view_model.dart';
33

44
/// View model for page indicator.

lib/src/models/slide_update_model.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import 'package:intro_views_flutter/src/constants/constants.dart';
1+
import 'package:intro_views_flutter/src/helpers/constants.dart';
22

33
/// Model for slide update.
44
class SlideUpdate {

lib/src/ui/intro_views_flutter.dart

+6-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import 'package:flutter/material.dart';
55
import 'package:intro_views_flutter/src/animation_gesture/animated_page_dragger.dart';
66
import 'package:intro_views_flutter/src/animation_gesture/page_dragger.dart';
77
import 'package:intro_views_flutter/src/animation_gesture/page_reveal.dart';
8-
import 'package:intro_views_flutter/src/constants/constants.dart';
8+
import 'package:intro_views_flutter/src/helpers/constants.dart';
99
import 'package:intro_views_flutter/src/models/page_view_model.dart';
1010
import 'package:intro_views_flutter/src/models/pager_indicator_view_model.dart';
1111
import 'package:intro_views_flutter/src/models/slide_update_model.dart';
@@ -38,7 +38,11 @@ class IntroViewsFlutter extends StatefulWidget {
3838
this.columnMainAxisAlignment = MainAxisAlignment.spaceAround,
3939
this.fullTransition = FULL_TRANSITION_PX,
4040
this.background,
41-
}) : super(key: key);
41+
}) : assert(
42+
pages.length > 0,
43+
"At least one 'PageViewModel' item of 'pages' argument is required.",
44+
),
45+
super(key: key);
4246

4347
/// List of [PageViewModel] to display.
4448
final List<PageViewModel> pages;

lib/src/ui/page_bubble.dart

+3-1
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,16 @@ import 'package:intro_views_flutter/src/models/page_bubble_view_model.dart';
77
class PageBubble extends StatelessWidget {
88
const PageBubble({
99
required this.viewModel,
10+
required this.width,
1011
});
1112

1213
final PageBubbleViewModel viewModel;
14+
final double width;
1315

1416
@override
1517
Widget build(BuildContext context) {
1618
return Container(
17-
width: 55.0,
19+
width: width,
1820
height: 65.0,
1921
child: Center(
2022
child: Padding(

lib/src/ui/page_indicator_buttons.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import 'package:flutter/material.dart';
2-
import 'package:intro_views_flutter/src/constants/constants.dart';
2+
import 'package:intro_views_flutter/src/helpers/constants.dart';
33
import 'package:intro_views_flutter/src/models/page_button_view_model.dart';
44

55
/// Skip, Next, and Back button class.

lib/src/ui/pager_indicator.dart

+10-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'package:flutter/material.dart';
2-
import 'package:intro_views_flutter/src/constants/constants.dart';
2+
import 'package:intro_views_flutter/src/helpers/constants.dart';
3+
import 'package:intro_views_flutter/src/helpers/extensions.dart';
34
import 'package:intro_views_flutter/src/models/page_bubble_view_model.dart';
45
import 'package:intro_views_flutter/src/models/pager_indicator_view_model.dart';
56
import 'package:intro_views_flutter/src/ui/page_bubble.dart';
@@ -16,8 +17,14 @@ class PagerIndicator extends StatelessWidget {
1617
Widget build(BuildContext context) {
1718
// extracting page bubble information from page view model
1819
final bubbles = <PageBubble>[];
20+
final numOfPages = viewModel.pages.length;
1921

20-
for (var i = 0; i < viewModel.pages.length; i++) {
22+
// calculates the width of the bubble to avoid the overflowing render issue #96
23+
final bubbleWidth = BUBBLE_WIDTH * numOfPages > context.screenWidth
24+
? (context.screenWidth / numOfPages)
25+
: BUBBLE_WIDTH;
26+
27+
for (var i = 0; i < numOfPages; i++) {
2128
final page = viewModel.pages[i];
2229

2330
// calculating percent active
@@ -41,6 +48,7 @@ class PagerIndicator extends StatelessWidget {
4148

4249
// adding to the list
4350
bubbles.add(PageBubble(
51+
width: bubbleWidth,
4452
viewModel: PageBubbleViewModel(
4553
iconAssetPath: page.iconImageAssetPath,
4654
iconColor: page.iconColor,

pubspec.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: intro_views_flutter
22
description: A Flutter package for simple material design app intro screens with some cool animations.
3-
version: 3.1.1
3+
version: 3.2.0
44
homepage: https://github.com/aagarwal1012/IntroViews-Flutter
55

66
environment:

test/widget_test.dart

+43
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import 'package:flutter/material.dart';
88
import 'package:flutter_test/flutter_test.dart';
9+
import 'package:intro_views_flutter/intro_views_flutter.dart';
910

1011
// ignore: avoid_relative_lib_imports
1112
import '../example/lib/main.dart';
@@ -133,4 +134,46 @@ void main() {
133134

134135
expect(find.byKey(const Key('Portrait Page')), findsWidgets);
135136
});
137+
138+
testWidgets('should throw an assert if pages list is empty', (
139+
WidgetTester tester,
140+
) async {
141+
final pages = <PageViewModel>[];
142+
143+
await expectLater(
144+
() async => await tester.pumpWidget(
145+
IntroViewsFlutter(pages),
146+
),
147+
throwsA(
148+
isAssertionError.having(
149+
(AssertionError error) => error.message,
150+
'message',
151+
contains("At least one 'PageViewModel' item"),
152+
),
153+
),
154+
);
155+
});
156+
157+
testWidgets('should not overflow if many bubbles', (
158+
WidgetTester tester,
159+
) async {
160+
final pages = List.generate(
161+
15,
162+
(index) => PageViewModel(
163+
pageColor: const Color(0xFF03A9F4),
164+
title: Text('$index'),
165+
),
166+
);
167+
168+
tester.binding.window.physicalSizeTestValue = const Size(500, 800);
169+
await tester.pumpWidget(
170+
MaterialApp(
171+
home: Builder(
172+
builder: (_) => IntroViewsFlutter(pages),
173+
),
174+
),
175+
);
176+
177+
expect(tester.takeException(), isNull);
178+
});
136179
}

0 commit comments

Comments
 (0)