Closed awaisjamil-vd closed 2 years ago
@awaisjamil-vd I think you can test functionality by wrapping whole app within MediaQuery to simulate different screen sizes. Note: Don't use MediaQueryData.fromWindow. A simple example: (You can use (GlobalKey().currentContext?.findRenderObject() as RenderBox).size to get a widget size, See tutorials).
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
testWidgets('Test Responsiveness', (WidgetTester tester) async {
// Declare Sizes
const Size designSize = Size(360, 640);
const Size initialSize = designSize;
const Size biggerSize = Size(480, 920);
const Size smallerSize = Size(300, 560);
// We'll use MediaQuery to simulate diffrent screen sizes
MediaQueryData currentData = MediaQueryData(size: initialSize);
const MediaQueryData biggerData = MediaQueryData(size: biggerSize);
const MediaQueryData smallerData = MediaQueryData(size: smallerSize);
// Used to find a widget. See [CommonFinders.byKey].
final _key = UniqueKey();
// Click on button. See code bellow.
Future<int> tap() async {
await tester.tap(find.byKey(_key));
return tester.pumpAndSettle();
}
void testSize(Size size) {
expect(1.w, equals(size.width / designSize.width));
expect(1.h, equals(size.height / designSize.height));
print('[OK] Size: $size, width: ${1.w}, height: ${1.h}');
}
await tester.pumpWidget(StatefulBuilder(
builder: (BuildContext context, StateSetter setState) {
return MediaQuery(
data: currentData,
child: ScreenUtilInit(
useInheritedMediaQuery: true,
designSize: designSize,
builder: (_) => MaterialApp(
home: Material(
child: TextButton(
key: _key,
child: Text('Change Screen Size'),
onPressed: () {
setState(() {
currentData = currentData.size == initialSize
// First test is with bigger screen
? biggerData
// Second with smaller screen
: smallerData;
});
},
),
),
),
),
);
},
));
// Tests with initial screen size
testSize(initialSize);
// Click On button to simulate changing screen size
await tap();
// Tests with bigger screen size
testSize(biggerSize);
// Click On button to simulate changing screen size
await tap();
// Tests with smaller screen size
testSize(smallerSize);
});
}
This issue is stale because it has been open for 30 days with no activity.
This issue was closed because it has been inactive for 14 days since being marked as stale.
@awaisjamil-vd I think you can test functionality by wrapping whole app within MediaQuery to simulate different screen sizes. Note: Don't use MediaQueryData.fromWindow. A simple example: (You can use (GlobalKey().currentContext?.findRenderObject() as RenderBox).size to get a widget size, See tutorials).
import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { testWidgets('Test Responsiveness', (WidgetTester tester) async { // Declare Sizes const Size designSize = Size(360, 640); const Size initialSize = designSize; const Size biggerSize = Size(480, 920); const Size smallerSize = Size(300, 560); // We'll use MediaQuery to simulate diffrent screen sizes MediaQueryData currentData = MediaQueryData(size: initialSize); const MediaQueryData biggerData = MediaQueryData(size: biggerSize); const MediaQueryData smallerData = MediaQueryData(size: smallerSize); // Used to find a widget. See [CommonFinders.byKey]. final _key = UniqueKey(); // Click on button. See code bellow. Future<int> tap() async { await tester.tap(find.byKey(_key)); return tester.pumpAndSettle(); } void testSize(Size size) { expect(1.w, equals(size.width / designSize.width)); expect(1.h, equals(size.height / designSize.height)); print('[OK] Size: $size, width: ${1.w}, height: ${1.h}'); } await tester.pumpWidget(StatefulBuilder( builder: (BuildContext context, StateSetter setState) { return MediaQuery( data: currentData, child: ScreenUtilInit( useInheritedMediaQuery: true, designSize: designSize, builder: (_) => MaterialApp( home: Material( child: TextButton( key: _key, child: Text('Change Screen Size'), onPressed: () { setState(() { currentData = currentData.size == initialSize // First test is with bigger screen ? biggerData // Second with smaller screen : smallerData; }); }, ), ), ), ), ); }, )); // Tests with initial screen size testSize(initialSize); // Click On button to simulate changing screen size await tap(); // Tests with bigger screen size testSize(biggerSize); // Click On button to simulate changing screen size await tap(); // Tests with smaller screen size testSize(smallerSize); }); }
In my case, it does not work now... flutter_screenutil version :: 5.5.4 flutter version :: 3.0.5
I changed screenUtilInit's builder method to (context, widget){} for run without context error, then it spit such errors.
══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
The following assertion was thrown building MediaQuery(MediaQueryData(size: Size(360.0, 640.0),
devicePixelRatio: 1.0, textScaleFactor: 1.0, platformBrightness: Brightness.light, padding:
EdgeInsets.zero, viewPadding: EdgeInsets.zero, viewInsets: EdgeInsets.zero, alwaysUse24HourFormat:
false, accessibleNavigation: false, highContrast: false, disableAnimations: false, invertColors:
false, boldText: false, navigationMode: traditional, gestureSettings:
DeviceGestureSettings(touchSlop: 18.0), displayFeatures: [])):
dependOnInheritedWidgetOfExactType
The relevant error-causing widget was: MediaQuery MediaQuery:file:///Users/satoshi/Documents/flutter_projects/flutter_pdfview/testtest/test/screen_util_test.dart:35:16
When the exception was thrown, this was the stack:
... Normal element mounting (15 frames)
Here I attach my code.
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
testWidgets('Test Responsiveness', (WidgetTester tester) async {
// Declare Sizes
const Size designSize = Size(360, 640);
const Size initialSize = designSize;
const Size biggerSize = Size(480, 920);
const Size smallerSize = Size(300, 560);
// We'll use MediaQuery to simulate diffrent screen sizes
MediaQueryData currentData = const MediaQueryData(size: initialSize);
const MediaQueryData biggerData = MediaQueryData(size: biggerSize);
const MediaQueryData smallerData = MediaQueryData(size: smallerSize);
// Used to find a widget. See [CommonFinders.byKey].
final _key = UniqueKey();
// Click on button. See code bellow.
Future<int> tap() async {
await tester.tap(find.byKey(_key));
return tester.pumpAndSettle();
}
void testSize(Size size) {
expect(1.w, equals(size.width / designSize.width));
expect(1.h, equals(size.height / designSize.height));
print('[OK] Size: $size, width: ${1.w}, height: ${1.h}');
}
await tester.pumpWidget(StatefulBuilder(
builder: (BuildContext context, StateSetter setState) {
return MediaQuery(
data: currentData,
child: ScreenUtilInit(
useInheritedMediaQuery: true,
designSize: designSize,
builder: (_context, _widget) => MaterialApp(
home: Material(
child: TextButton(
key: _key,
child: const Text('Change Screen Size'),
onPressed: () {
setState(() {
currentData = currentData.size == initialSize
// First test is with bigger screen
? biggerData
// Second with smaller screen
: smallerData;
});
},
),
),
),
),
);
},
));
// Tests with initial screen size
testSize(initialSize);
// Click On button to simulate changing screen size
await tap();
// Tests with bigger screen size
testSize(biggerSize);
// Click On button to simulate changing screen size
await tap();
// Tests with smaller screen size
testSize(smallerSize);
});
}
I have the exact same issue with @sejun2 I thought it was related to flutter 3.3.0 since I didn't have this issue last week. But your version seems to be 3.0.5 and still failing. Can we get any help from the author?
@canavci312 After removing MediaQuery widget, then it works fine.
@canavci312 After removing MediaQuery widget, then it works fine.
yes it works after deleting it but everything overflows now :( they weren't overflowing before
,但现在所有内容都溢出了:(它们之前没有溢出
Hello, I have also encountered the same test problem at present, this code will directly report an error, is there any good way to test widgets containing flutter_screenutil plug-in?
how can i widget test those widget that has screenutill? please guide