Running Palette Generator (by flutter team) inside an async function freezes the app for a bit - flutter

I was trying to use the palette generator plugin by flutter team. However, when I run the function, the UI freezes for two seconds or three. Here is how im trying to use it:
void _generateColorPalette(BuildContext context) async {
try {
if (this.imageData == null) {
return;
}
setState(() {
isLoading = true;
});
final PaletteGenerator _temp = await PaletteGenerator.fromImageProvider(
MemoryImage(imageData as Uint8List));
setState(() {
isLoading = false;
pallete = _temp.colors.toList();
});
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Pallete Generated!'),
behavior: SnackBarBehavior.floating,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(50.0),
),
),
);
} catch (e) {
setState(() {
isLoading = false;
});
print('Error occured while generating the palette: $e');
}
}
I also tried using it in a compute function but to no avail cause i get this error:
Restarted application in 2,281ms.
I/Timeline( 4948): Timeline: Activity_launch_request time:96984061
W/Activity( 4948): Slow Operation: Activity com.example.glitter/.MainActivity onActivityResult took 187ms
I/flutter ( 4948): ══╡ EXCEPTION CAUGHT BY IMAGE RESOURCE SERVICE ╞════════════════════════════════════════════════════
I/flutter ( 4948): The following _CastError was thrown while resolving an image:
I/flutter ( 4948): Null check operator used on a null value
I/flutter ( 4948):
I/flutter ( 4948): When the exception was thrown, this was the stack:
I/flutter ( 4948): #0 ImageProvider.resolveStreamForKey
I/flutter ( 4948): #1 ImageProvider.resolve.<anonymous closure>
I/flutter ( 4948): #2 ImageProvider._createErrorHandlerAndKey.<anonymous closure>.<anonymous closure>
I/flutter ( 4948): #3 SynchronousFuture.then
I/flutter ( 4948): #4 ImageProvider._createErrorHandlerAndKey.<anonymous closure>
I/flutter ( 4948): #8 ImageProvider._createErrorHandlerAndKey
I/flutter ( 4948): #9 ImageProvider.resolve
I/flutter ( 4948): #10 PaletteGenerator.fromImageProvider
I/flutter ( 4948): #11 _ImageScreenState.generatePallete
I/flutter ( 4948): #12 _IsolateConfiguration.apply
I/flutter ( 4948): #13 _spawn.<anonymous closure>
I/flutter ( 4948): #14 _spawn.<anonymous closure>
I/flutter ( 4948): #15 Timeline.timeSync (dart:developer/timeline.dart:163:22)
I/flutter ( 4948): #16 _spawn
I/flutter ( 4948): #17 _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:286:17)
I/flutter ( 4948): (elided 4 frames from class _RawReceivePortImpl and dart:async)
I/flutter ( 4948):
I/flutter ( 4948): Image provider: MemoryImage(Uint8List#e9679, scale: 1.0)
I/flutter ( 4948): Image configuration: ImageConfiguration(devicePixelRatio: 1.0)
I/flutter ( 4948): Image key: MemoryImage(Uint8List#e9679, scale: 1.0)
I/flutter ( 4948): ════════════════════════════════════════════════════════════════════════════════════════════════════
I/flutter ( 4948): Error occured: TimeoutException: Timeout occurred trying to load from MemoryImage(Uint8List#e9679, scale: 1.0)
Reloaded 1 of 949 libraries in 1,408ms.
I/flutter ( 4948): ══╡ EXCEPTION CAUGHT BY IMAGE RESOURCE SERVICE ╞════════════════════════════════════════════════════
I/flutter ( 4948): The following _CastError was thrown while resolving an image:
I/flutter ( 4948): Null check operator used on a null value
I/flutter ( 4948):
I/flutter ( 4948): When the exception was thrown, this was the stack:
I/flutter ( 4948): #0 ImageProvider.resolveStreamForKey
I/flutter ( 4948): #1 ImageProvider.resolve.<anonymous closure>
I/flutter ( 4948): #2 ImageProvider._createErrorHandlerAndKey.<anonymous closure>.<anonymous closure>
I/flutter ( 4948): #3 SynchronousFuture.then
I/flutter ( 4948): #4 ImageProvider._createErrorHandlerAndKey.<anonymous closure>
I/flutter ( 4948): #8 ImageProvider._createErrorHandlerAndKey
I/flutter ( 4948): #9 ImageProvider.resolve
I/flutter ( 4948): #10 PaletteGenerator.fromImageProvider
I/flutter ( 4948): #11 _ImageScreenState.generatePallete
I/flutter ( 4948): #12 _IsolateConfiguration.apply
I/flutter ( 4948): #13 _spawn.<anonymous closure>
I/flutter ( 4948): #14 _spawn.<anonymous closure>
I/flutter ( 4948): #15 Timeline.timeSync (dart:developer/timeline.dart:163:22)
I/flutter ( 4948): #16 _spawn
I/flutter ( 4948): #17 _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:286:17)
I/flutter ( 4948): (elided 4 frames from class _RawReceivePortImpl and dart:async)
I/flutter ( 4948):
I/flutter ( 4948): Image provider: MemoryImage(Uint8List#53605, scale: 1.0)
I/flutter ( 4948): Image configuration: ImageConfiguration(devicePixelRatio: 1.0)
I/flutter ( 4948): Image key: MemoryImage(Uint8List#53605, scale: 1.0)
I/flutter ( 4948): ════════════════════════════════════════════════════════════════════════════════════════════════════
I/flutter ( 4948): Error occured: TimeoutException: Timeout occurred trying to load from MemoryImage(Uint8List#53605, scale: 1.0)
Reloaded 2 of 949 libraries in 1,273ms.
Heres how I was trying to use it in isolate:
void _generateColorPalette(BuildContext context) async {
try {
if (this.imageData == null) {
return;
}
setState(() {
isLoading = true;
});
// final PaletteGenerator _temp = await PaletteGenerator.fromImageProvider(
// MemoryImage(imageData as Uint8List));
final List<Color>? _temp =
await compute(generatePalette, imageData as Uint8List);
if (_temp == null) {
return;
}
setState(() {
isLoading = false;
// pallete = _temp.colors.toList();
pallete = _temp;
});
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Pallete Generated!'),
behavior: SnackBarBehavior.floating,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(50.0),
),
),
);
} catch (e) {
setState(() {
isLoading = false;
});
print('Error occured while generating the palette: $e');
}
}
and the isolated function:
Future<List<Color>?> generatePalette(Uint8List _image) async {
try {
final PaletteGenerator _generator =
await PaletteGenerator.fromImageProvider(MemoryImage(_image));
return _generator.colors.toList();
} catch (e) {
print('Error occured while generating palette in the isolate: $e');
}
}
Any ideas on what might be missing?

Related

NoSuchMethodError: The method '[]' was called on null. flutter local json file

[ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: NoSuchMethodError: The method '[]' was called on null.
[ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: NoSuchMethodError: The method '[]' was called on null.
E/flutter ( 8471): Receiver: null
E/flutter ( 8471): Tried calling: []("runnerId")
E/flutter ( 8471): #0 Object.noSuchMethod (dart:core-patch/object_patch.dart:51:5)
E/flutter ( 8471): #1 new Metadata.fromMap (package:jsonfatch/model/event.dart:348:22)
E/flutter ( 8471): #2 new MarketRunner.fromMap (package:jsonfatch/model/event.dart:329:28)
E/flutter ( 8471): #3 new Market.fromMap.<anonymous closure> (package:jsonfatch/model/event.dart:138:52)
E/flutter ( 8471): #4 MappedListIterable.elementAt (dart:_internal/iterable.dart:417:31)
E/flutter ( 8471): #5 ListIterator.moveNext (dart:_internal/iterable.dart:343:26)
E/flutter ( 8471): #6 new List.from (dart:core-patch/array_patch.dart:57:19)
E/flutter ( 8471): #7 new Market.fromMap (package:jsonfatch/model/event.dart:137:18)
E/flutter ( 8471): #8 new EventDetails.fromMap.<anonymous closure> (package:jsonfatch/model/event.dart:65:62)
E/flutter ( 8471): #9 MappedListIterable.elementAt (dart:_internal/iterable.dart:417:31)
E/flutter ( 8471): #10 ListIterator.moveNext (dart:_internal/iterable.dart:343:26)
E/flutter ( 8471): #11 new List.from (dart:core-patch/array_patch.dart:57:19)
E/flutter ( 8471): #12 new EventDetails.fromMap (package:jsonfatch/model/event.dart:65:11)
E/flutter ( 8471): #13 HomePageState.loadData.<anonymous closure> (package:jsonfatch/home.dart:28:51)
E/flutter ( 8471): #14 MappedListIterable.elementAt (dart:_internal/iterable.dart:417:31)
E/flutter ( 8471): #15 ListIterator.moveNext (dart:_internal/iterable.dart:343:26)
E/flutter ( 8471): #16 new List.from (dart:core-patch/array_patch.dart:38:29)
E/flutter ( 8471): #17 new List.of (dart:core-patch/array_patch.dart:68:17)
E/flutter ( 8471): #18 ListIterable.toList (dart:_internal/iterable.dart:211:44)
E/flutter ( 8471): #19 HomePageState.loadData (package:jsonfatch/home.dart:29:10)
E/flutter ( 8471): <asynchronous suspension>
E/flutter ( 8471): #20 HomePageState.initState (package:jsonfatch/home.dart:19:5)
E/flutter ( 8471): #21 StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4765:58)
E/flutter ( 8471): #22 ComponentElement.mount (package:flutter/src/widgets/framework.dart:4601:5)
E/flutter ( 8471): #23 Element.inflateWidget (package:flutter/src/widgets/framework.dart:3569:14)
E/flutter ( 8471): #24 Element.updateChild (package:flutter/src/widgets/framework.dart:3327:18)
E/flutter ( 8471): #25 RenderObjectToWidgetElement._rebuild (package:flutter/src/widgets/binding.dart:1252:16)
E/flutter ( 8471): #26 RenderObjectToWidgetElement.mount (package:flutter/src/widgets/binding.dart:1223:5)E/flutter ( 8471): #27 RenderObjectToWidgetAdapter.attachToRenderTree.<anonymous closure> (package:flutter/src/widgets/binding.dart:1165:17)
E/flutter ( 8471): #28 BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2683:19)
E/flutter ( 8471): #29 RenderObjectToWidgetAdapter.attachToRenderTree (package:flutter/src/widgets/binding.dart:1164:13)
E/flutter ( 8471): #30 WidgetsBinding.attachRootWidget (package:flutter/src/widgets/binding.dart:974:7)
E/flutter ( 8471): #31 WidgetsBinding.scheduleAttachRootWidget.<anonymous closure> (package:flutter/src/widgets/binding.dart:955:7)
E/flutter ( 8471): #32 _rootRun (dart:async/zone.dart:1182:47)
E/flutter ( 8471): #33 _CustomZone.run (dart:async/zone.dart:1093:19)
E/flutter ( 8471): #34 _CustomZone.runGuarded (dart:async/zone.dart:997:7)
E/flutter ( 8471): #35 _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:1037:23)
E/flutter ( 8471): #36 _rootRun (dart:async/zone.dart:1190:13)
E/flutter ( 8471): #37 _CustomZone.run (dart:async/zone.dart:1093:19)
E/flutter ( 8471): #38 _CustomZone.bindCallback.<anonymous closure> (dart:async/zone.dart:1021:23)
E/flutter ( 8471): #39 Timer._createTimer.<anonymous closure> (dart:async-patch/timer_patch.dart:18:15)
E/flutter ( 8471): #40 _Timer._runTimers (dart:isolate-patch/timer_impl.dart:397:19)
E/flutter ( 8471): #41 _Timer._handleMessage (dart:isolate-patch/timer_impl.dart:428:5)
E/flutter ( 8471): #42 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)
my json file in which the data is nested key value per and do many json obj
"runners":[
{
"id":10301,
"name":"roman",
"sortPriority":0,
"metadata":{
"runnerId":"10301"
}
},
{
"id":7337,
"name":"khali",
"sortPriority":0,
"metadata":{
"runnerId":"7337"
}
}
],
my map code for the runnerId. it was an nested array object. other all i have maped in model file
class Metadata {
Metadata({
this.runnerId,
});
String runnerId;
factory Metadata.fromMap(Map<String, dynamic> map) => Metadata(
runnerId: map["runnerId"],
);
Map<String, dynamic> toMap() => {
"runnerId": runnerId,
};
}
My Home.dart Code
class HomePage extends StatefulWidget {
#override
HomePageState createState() => HomePageState();
}
class HomePageState extends State<HomePage> {
#override
void initState() {
super.initState();
loadData();
}
loadData() async {
await Future.delayed(Duration(seconds: 2));
var cktJson = await rootBundle.loadString("assets/files/ckt.json");
var decodedData = jsonDecode(cktJson);
var cricketData = decodedData["cktdata"];
EventsModel.markets = List.from(cricketData)
.map<EventDetails>((item) => EventDetails.fromMap(item))
.toList();
setState(() {});
print("Decoded :-"+decodedData);
print("CrircktD :-"+ cricketData);
}
#override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
appBar: AppBar(
backgroundColor: MainBackgroundColor,
title: Text("Radhe Json Fatch"),
),
body: SafeArea(
child: Column(
children: [
Expanded(
child: (EventsModel.markets != null && EventsModel.markets.isNotEmpty)?
ListView.builder(
scrollDirection: Axis.vertical,
itemCount: EventsModel.markets.length,
itemBuilder: (context, index) {
return LiveEventCricket(item: EventsModel.markets[index]);
},
):Center(child: CircularProgressIndicator()),
),
],
),
),
),
);
}
}

flutter ClientException in http requests

This is the function containing the request :
Future<String> getRequest(String serviceName, Map<String, String> a) async {
var responseBody = '{"data": "", "status": "NOK"}';
try {
http.Response response =
await http.get(_urlBase + '$_serverApi$serviceName', headings: a);
if (response.statusCode == 200) {
responseBody = response.body;
}
} catch (e) {
// An error was received
throw new Exception("GET ERROR");
}
return responseBody;
}
and this is where i call it :
void _confirm() async {
if (_formKey.currentState.saveAndValidate()) {
print(_formKey.currentState.value);
Map<String, String> c =
Map<String, String>.from(_formKey.currentState.value);
// just below
var a = await auth.getRequest('se_connecter', c);
print(a);
} else {
print(_formKey.currentState.value);
print("validation failed");
}
}
everytime i try it, the code in the try bloc fails, and it throws the exception (ClientException after i removed try and catch bloc)
This the exception stacktrace :
I/flutter (10979): #0 IOClient.send
package:http/src/io_client.dart:65
I/flutter (10979): <asynchronous suspension>
I/flutter (10979): #1 BaseClient._sendUnstreamed
package:http/src/base_client.dart:176
I/flutter (10979): #2 BaseClient.get
package:http/src/base_client.dart:35
I/flutter (10979): #3 get.<anonymous closure>
package:http/http.dart:46
I/flutter (10979): #4 _withClient
package:http/http.dart:166
I/flutter (10979): #5 get
package:http/http.dart:46
I/flutter (10979): #6 getRequest
package:event_app/auth.dart:125
I/flutter (10979): #7 ConnectPageState._confirm
package:event_app/pages/connect_page.dart:28
I/flutter (10979): #8 _InkResponseState._handleTap
package:flutter/…/material/ink_well.dart:706
I/flutter (10979): #9 _InkResponseState.build.<anonymous closure>
package:flutter/…/material/ink_well.dart:789
I/flutter (10979): #10 GestureRecognizer.invokeCallback
package:flutter/…/gestures/recognizer.dart:182
I/flutter (10979): #11 TapGestureRecognizer.handleTapUp
package:flutter/…/gestures/tap.dart:486
I/flutter (10979): #12 BaseTapGestureRecognizer._checkUp
package:flutter/…/gestures/tap.dart:264
I/flutter (10979): #13 BaseTapGestureRecognizer.
In my case (sometimes instead of blank appeared the error "HttpException: Connection closed before full header was received") the call was to an https address using Microsoft Internet Information Services as backend, in the SSL settings of the website in IIS i had mistakenly set "Client certificates: Accept" instead of "Client certificates: Ignore", setting "Ignore" solved the problem.
Solved, the problem was the ssl encryption, so i removed it from my backend.

Flutter bloc_pattern returning NoSuchMethodError

I am building my first Flutter app, and foolishly enough, I started off with complex structures such as the MVVM, I don't know very much about it but have tried.
Here is my folder structure:
lib
---models
------videos.dart
---repos
------videos.dart
---viewmodels
------videos.dart
main.dart (I know)
In my main.dart file, I am using StreamBuilder to fetch the lisit of videos, here's the code:
class Home extends StatelessWidget {
VideosBloc videosBloc = BlocProvider.getBloc<VideosBloc>();
#override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
Expanded(
flex: 1,
child: CustomAppBar(),
),
Expanded(
flex: 9,
child: Container(
color: Theme.of(context).primaryColorDark,
child: StreamBuilder(
stream: videosBloc.videosStream,
builder: (context, snapshot) {
List<Video> videos = snapshot != null ? snapshot.data : [];
return ListView(
children: videos.map((video) {
return VideoContainer(video);
}).toList(),
);
},
),
),
)
],
);
}
}
There there is this bloc file:
import 'dart:async';
import 'package:bloc_pattern/bloc_pattern.dart';
import 'package:peeke_vines/models/videos.dart';
import 'package:peeke_vines/repositories/videos.dart';
import 'package:rxdart/rxdart.dart';
class VideosBloc extends BlocBase {
VideosBloc();
//Stream that receives a number and changes the count;
var _videosController =
BehaviorSubject<List<Video>>.seeded(VideosRepo().getVideos());
//output
Stream<List<Video>> get videosStream => _videosController.stream;
//input
Sink<List<Video>> get videosSink => _videosController.sink;
//dispose will be called automatically by closing its streams
#override
void dispose() {
_videosController.close();
super.dispose();
}
}
And this bloc gets this data from a repository
import 'package:peeke_vines/models/videos.dart';
class VideosRepo {
VideosRepo();
List<Video> videos = VideoModel().fetchVideos();
List<Video> getVideos() {
return [];
}
}
And this repository currently just gets the data from a model, but later I'll implement a web service to fetch the data from:
import 'package:meta/meta.dart';
class VideoModel {
List<Video> fetchVideos() {
return [
Video(
video: 'assets/videos/main.wmv',
title: 'Peeke Vines Video Title',
date: '2 Days ago',
thumbnail: 'assets/thumbnails/1.jpg',
duration: 13.5),
Video(
video: 'assets/videos/main.wmv',
title: 'Peeke Vines Video Title',
date: '2 Days ago',
thumbnail: 'assets/thumbnails/2.jpg',
duration: 13.5),
Video(
video: 'assets/videos/main.wmv',
title: 'Peeke Vines Video Title',
date: '2 Days ago',
thumbnail: 'assets/thumbnails/1.jpg',
duration: 13.5)
];
}
}
class Video {
String video, title, date, thumbnail;
double duration;
Video(
{#required this.video,
#required this.title,
#required this.date,
#required this.thumbnail,
#required this.duration});
}
Now, whenever I import the bloc in the main.dart file using this line:
VideosBloc videosBloc = BlocProvider.getBloc<VideosBloc>();
I get this error:
I/flutter ( 4338): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter ( 4338): The following NoSuchMethodError was thrown building MyApp(dirty):
I/flutter ( 4338): Class 'NoSuchMethodError' has no instance getter 'message'.
I/flutter ( 4338): Receiver: Instance of 'NoSuchMethodError'
I/flutter ( 4338): Tried calling: message
I/flutter ( 4338):
I/flutter ( 4338): When the exception was thrown, this was the stack:
I/flutter ( 4338): #0 Object.noSuchMethod (dart:core-patch/object_patch.dart:50:5)
I/flutter ( 4338): #1 BlocProvider.getBloc (package:bloc_pattern/src/bloc_provider.dart:47:12)
I/flutter ( 4338): #2 new Home (package:peeke_vines/main.dart:35:40)
I/flutter ( 4338): #3 MyApp.build (package:peeke_vines/main.dart:21:20)
I/flutter ( 4338): #4 StatelessElement.build (package:flutter/src/widgets/framework.dart:3974:28)
I/flutter ( 4338): #5 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3924:15)
I/flutter ( 4338): #6 Element.rebuild (package:flutter/src/widgets/framework.dart:3721:5)
I/flutter ( 4338): #7 ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3907:5)
I/flutter ( 4338): #8 ComponentElement.mount (package:flutter/src/widgets/framework.dart:3902:5)
I/flutter ( 4338): #9 Element.inflateWidget (package:flutter/src/widgets/framework.dart:3084:14)
I/flutter ( 4338): #10 Element.updateChild (package:flutter/src/widgets/framework.dart:2887:12)
I/flutter ( 4338): #11 RenderObjectToWidgetElement._rebuild (package:flutter/src/widgets/binding.dart:939:16)
I/flutter ( 4338): #12 RenderObjectToWidgetElement.mount (package:flutter/src/widgets/binding.dart:910:5)
I/flutter ( 4338): #13 RenderObjectToWidgetAdapter.attachToRenderTree.<anonymous closure> (package:flutter/src/widgets/binding.dart:856:17)
I/flutter ( 4338): #14 BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2320:19)
I/flutter ( 4338): #15 RenderObjectToWidgetAdapter.attachToRenderTree (package:flutter/src/widgets/binding.dart:855:13)
Can you tell me why this error is coming?
The issue is that you are trying to get the Bloc outside of the build method.
Try to get it at the start of the build method.

How to make a reusable PopupMenuButton in Flutter

I want to make a reusable PopupMenuButton in flutter, so i can call that widget and assign the PopupMenuItem dynamically.
Here is what i've done, but it throw a framework error. I am relatively new in flutter.
here is class that supposed to be reusable:
class PopupMenu {
PopupMenu({#required this.title, #required this.onTap});
final String title;
final VoidCallback onTap;
}
class PopupmMenuButtonBuilder {
setPopup(List<PopupMenu> popupItem) {
return PopupMenuButton<String>(
onSelected: (_) {
popupItem.forEach((item) => item.onTap);
},
itemBuilder: (BuildContext context) {
popupItem.forEach(
(item) {
return <PopupMenuItem<String>>[
PopupMenuItem<String>(
value: item.title,
child: Text(
item.title,
),
),
];
},
);
},
);
}
}
and then i call the widget like this:
child: PopupmMenuButtonBuilder().setPopup([
PopupMenu(title: 'Item 1', onTap: () => print('item 1 selected')),
PopupMenu(title: 'Item 2', onTap: () => print('item 2 selected')),
]),
It shows the 3 dot icon button, but when i tap the icon it throws this error:
I/flutter ( 8509): ══╡ EXCEPTION CAUGHT BY GESTURE ╞═══════════════════════════════════════════════════════════════════
I/flutter ( 8509): The following assertion was thrown while handling a gesture:
I/flutter ( 8509): 'package:flutter/src/material/popup_menu.dart': Failed assertion: line 723 pos 10: 'items != null &&
I/flutter ( 8509): items.isNotEmpty': is not true.
I/flutter ( 8509): Either the assertion indicates an error in the framework itself, or we should provide substantially
I/flutter ( 8509): more information in this error message to help you determine and fix the underlying cause.
I/flutter ( 8509): In either case, please report this assertion by filing a bug on GitHub:
I/flutter ( 8509): https://github.com/flutter/flutter/issues/new?template=BUG.md
I/flutter ( 8509): When the exception was thrown, this was the stack:
I/flutter ( 8509): #2 showMenu (package:flutter/src/material/popup_menu.dart:723:10)
I/flutter ( 8509): #3 _PopupMenuButtonState.showButtonMenu (package:flutter/src/material/popup_menu.dart:898:5)
I/flutter ( 8509): #4 _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:511:14)
I/flutter ( 8509): #5 _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:566:30)
I/flutter ( 8509): #6 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:166:24)
I/flutter ( 8509): #7 TapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:240:9)
I/flutter ( 8509): #8 TapGestureRecognizer.acceptGesture (package:flutter/src/gestures/tap.dart:211:7)
I/flutter ( 8509): #9 GestureArenaManager.sweep (package:flutter/src/gestures/arena.dart:156:27)
I/flutter ( 8509): #10 _WidgetsFlutterBinding&BindingBase&GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:225:20)
I/flutter ( 8509): #11 _WidgetsFlutterBinding&BindingBase&GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:199:22)
I/flutter ( 8509): #12 _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:156:7)
I/flutter ( 8509): #13 _WidgetsFlutterBinding&BindingBase&GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:102:7)I/flutter ( 8509): #14 _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:86:7)I/flutter ( 8509): #18 _invoke1 (dart:ui/hooks.dart:233:10)
I/flutter ( 8509): #19 _dispatchPointerDataPacket (dart:ui/hooks.dart:154:5)
I/flutter ( 8509): (elided 5 frames from class _AssertionError and package dart:async)
I/flutter ( 8509): Handler: onTap
I/flutter ( 8509): Recognizer:
I/flutter ( 8509): TapGestureRecognizer#8968f(debugOwner: GestureDetector, state: ready, won arena, finalPosition:
I/flutter ( 8509): Offset(339.0, 54.0), sent tap down)
I/flutter ( 8509): ════════════════════════════════════════════════════════════════════════════════════════════════════
Your itemBuilder needs to return a List. It doesn't actually return anything - note how the return is inside the forEach so it's just returning from the lambda. In general, forEach should sometimes be avoided. Also, the PopupMenuButtonBuilder class is redundant - it could be replaced with a static or top-level function.
One other thing that's unclear is why you want to call each onTap for every select. As you currently have it it's going to call every callback!
Try this:
class PopupMenu {
PopupMenu({#required this.title, #required this.onTap});
final String title;
final VoidCallback onTap;
static PopupMenuButton<String> createPopup(List<PopupMenu> popupItems) {
return PopupMenuButton<String>(
onSelected: (value) {
popupItems.firstWhere((e) => e.title == value).onTap();
},
itemBuilder: (context) => popupItems
.map((item) => PopupMenuItem<String>(
value: item.title,
child: Text(
item.title,
),
))
.toList(),
);
}
}
You can also create a changeable list to append to the Popup menu instead of manually creating it one by one in the child
child: PopupMenu(popUpList: _popUpList).createPopup()),
then in the Popup menu class
class PopupMenu {
const PopupMenu({this.popUpList});
final List<PopUpList> popUpList;
PopupMenuButton<String> createPopup() {
return PopupMenuButton<String>(
onSelected: (value) {
popUpList.firstWhere((e) => e.title == value).onTap();
},
itemBuilder: (context) => popUpList
.map((item) => PopupMenuItem<String>(
value: item.title,
child: Text(item.title),
)).toList(),
);
}
}
model
class PopUpList{
String title;
VoidCallback onTap;
PopUpList({this.onTap, this.title});
}
cheers!

FutureBuilder snapshot returning null, possible json parsing failure

I am trying to render a list based on an API response. Here is the model :
class ProductModel {
final int id;
final String name;
final String nameBn;
final String price;
final String priceBn;
final bool oldPrice;
final String oldPriceVal;
final String oldPriceValBn;
final List<ImageBunny> image;
final String slug;
final String shortDescriptionOpt;
final String shortDescription;
final String shortDescriptionBn;
final int maxItem;
final bool size;
final List<String> sizeList;
final bool color;
final List<String> colorList;
final bool unit;
final String unitBn;
final String unitEn;
final int ranking;
ProductModel(
{this.id,
this.name,
this.nameBn,
this.price,
this.priceBn,
this.oldPrice,
this.oldPriceVal,
this.oldPriceValBn,
this.image,
this.slug,
this.shortDescriptionOpt,
this.shortDescription,
this.shortDescriptionBn,
this.maxItem,
this.color,
this.colorList,
this.ranking,
this.size,
this.sizeList,
this.unit,
this.unitBn,
this.unitEn
});
}
and the listview component:
class Products extends StatelessWidget {
#override
Widget build(BuildContext context) {
return _buildProductsListPage();
}
_buildProductsListPage() {
return Container(
color: Colors.grey[100],
child: FutureBuilder<List<ProductModel>>(
future: _parseProductsFromResponse(),
builder: (context, snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.active:
case ConnectionState.waiting:
return Center(child: CircularProgressIndicator());
case ConnectionState.none:
return Center(child: Text("Unable to connect right now"));
case ConnectionState.done:
return ListView.builder(
itemCount: 18,
scrollDirection: Axis.vertical,
shrinkWrap: true,
itemBuilder: (context, index) {
print(index);
print(snapshot.data);
return ProductComponent(
product1: snapshot.data[index - 1],
product2: snapshot.data[index],
);
},
);
}
},
),
);
}
Future<dynamic> _getProducts() async {
var response = await http.get('https://example.com/api/featured/').catchError(
(error) {
return false;
},
);
return json.decode(response.body);
}
Future<List<ProductModel>> _parseProductsFromResponse() async {
List<ProductModel> productsList = <ProductModel>[];
var dataFromResponse = await _getProducts();
dataFromResponse['results'].forEach(
(newProduct) {
//print(newProduct);
//parse the product's images
List<ImageBunny> imagesOfProductList = [];
print("hit 1");
newProduct["image"].forEach(
(newImage) {
print("hit 2");
imagesOfProductList.add(
new ImageBunny(
imageMobileFeatureList: newImage["imageMobileFeatureList"],
imageMobileProductDetails: newImage["imageMobileProductDetails"],
),
);
},
);
// parse Size List
List<String> sizeList = [];
newProduct["size_list"].forEach((value) {
print("hit 3");
sizeList.add(value);
});
print("hit 4");
// parse Color List
List<String> colorList = [];
newProduct["color_list"].forEach((value) {
print("hit 5");
var color = value.toString();
var colorVal = color.substring(1, color.length);
colorList.add(colorVal);
});
print("hit 6");
//parse new product's details
ProductModel product = ProductModel(
id: int.tryParse(newProduct["id"]),
name: newProduct["name"].toString(),
nameBn: newProduct["name_bn"].toString(),
price: newProduct["price"].toString(),
priceBn: newProduct["price_bn"].toString(),
oldPrice: newProduct["old_price"],
oldPriceVal: newProduct["old_price_val"] != null? newProduct["old_price_val"].toString(): "",
oldPriceValBn: newProduct["old_price_val_bn"] != null? newProduct["old_price_val_bn"].toString(): "",
slug: newProduct["slug"].toString(),
shortDescriptionOpt: newProduct["short_description_opt"],
shortDescription: newProduct["short_description"].toString(),
shortDescriptionBn: newProduct["short_description_bn"].toString(),
maxItem: newProduct["max_item"],
size: newProduct["size"],
sizeList: sizeList,
color: newProduct["color"],
colorList: colorList,
unit: newProduct["unit"],
unitBn: newProduct["unit_bn"] != null? newProduct["unit_bn"].toString() : "",
unitEn: newProduct["unit_en"] != null? newProduct["unit_en"].toString() : "",
ranking: newProduct["ranking"],
image: imagesOfProductList,
);
print("hit 7");
productsList.add(product);
},
);
print(productsList);
return productsList;
}
}
and the terminal output:
I/flutter (14968): hit 1
I/flutter (14968): hit 2
I/flutter (14968): hit 4
I/flutter (14968): hit 6
I/flutter (14968): 0
I/flutter (14968): null
I/flutter (14968): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter (14968): The following NoSuchMethodError was thrown building:
I/flutter (14968): The method '[]' was called on null.
I/flutter (14968): Receiver: null
I/flutter (14968): Tried calling: [](-1)
I/flutter (14968):
I/flutter (14968): When the exception was thrown, this was the stack:
I/flutter (14968): #0 Object.noSuchMethod (dart:core-patch/object_patch.dart:50:5)
I/flutter (14968): #1 Products._buildProductsListPage.<anonymous closure>.<anonymous closure> (package:eknimishei/partials/products.dart:73:46)
I/flutter (14968): #2 SliverChildBuilderDelegate.build (package:flutter/src/widgets/sliver.dart:398:15)
I/flutter (14968): #3 SliverMultiBoxAdaptorElement._build.<anonymous closure> (package:flutter/src/widgets/sliver.dart:1006:67)
I/flutter (14968): #4 _HashMap.putIfAbsent (dart:collection-patch/collection_patch.dart:137:29)
I/flutter (14968): #5 SliverMultiBoxAdaptorElement._build (package:flutter/src/widgets/sliver.dart:1006:26)
I/flutter (14968): #6 SliverMultiBoxAdaptorElement.createChild.<anonymous closure> (package:flutter/src/widgets/sliver.dart:1019:55)
I/flutter (14968): #7 BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2258:19)
I/flutter (14968): #8 SliverMultiBoxAdaptorElement.createChild (package:flutter/src/widgets/sliver.dart:1012:11)
I/flutter (14968): #9 RenderSliverMultiBoxAdaptor._createOrObtainChild.<anonymous closure> (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:275:23)
I/flutter (14968): #10 RenderObject.invokeLayoutCallback.<anonymous closure> (package:flutter/src/rendering/object.dart:1740:58)
I/flutter (14968): #11 PipelineOwner._enableMutationsToDirtySubtrees (package:flutter/src/rendering/object.dart:797:15)
I/flutter (14968): #12 RenderObject.invokeLayoutCallback (package:flutter/src/rendering/object.dart:1740:13)
I/flutter (14968): #13 RenderSliverMultiBoxAdaptor._createOrObtainChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:264:5)
I/flutter (14968): #14 RenderSliverMultiBoxAdaptor.addInitialChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:348:5)
I/flutter (14968): #15 RenderSliverList.performLayout (package:flutter/src/rendering/sliver_list.dart:78:12)
I/flutter (14968): #16 RenderObject.layout (package:flutter/src/rendering/object.dart:1644:7)
I/flutter (14968): #17 RenderSliverPadding.performLayout (package:flutter/src/rendering/sliver_padding.dart:182:11)
I/flutter (14968): #18 RenderObject.layout (package:flutter/src/rendering/object.dart:1644:7)
I/flutter (14968): #19 RenderViewportBase.layoutChildSequence (package:flutter/src/rendering/viewport.dart:407:13)
I/flutter (14968): #20 RenderShrinkWrappingViewport._attemptLayout (package:flutter/src/rendering/viewport.dart:1651:12)
I/flutter (14968): #21 RenderShrinkWrappingViewport.performLayout (package:flutter/src/rendering/viewport.dart:1614:20)
I/flutter (14968): #22 RenderObject.layout (package:flutter/src/rendering/object.dart:1644:7)
I/flutter (14968): #23 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
I/flutter (14968): #24 RenderObject.layout (package:flutter/src/rendering/object.dart:1644:7)
I/flutter (14968): #25 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
I/flutter (14968): #26 RenderObject.layout (package:flutter/src/rendering/object.dart:1644:7)
I/flutter (14968): #27 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
I/flutter (14968): #28 RenderObject.layout (package:flutter/src/rendering/object.dart:1644:7)
I/flutter (14968): #29 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
I/flutter (14968): #30 RenderObject.layout (package:flutter/src/rendering/object.dart:1644:7)
I/flutter (14968): #31 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
I/flutter (14968): #32 RenderObject.layout (package:flutter/src/rendering/object.dart:1644:7)
I/flutter (14968): #33 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
I/flutter (14968): #34 RenderObject.layout (package:flutter/src/rendering/object.dart:1644:7)
I/flutter (14968): #35 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
I/flutter (14968): #36 RenderObject.layout (package:flutter/src/rendering/object.dart:1644:7)
I/flutter (14968): #37 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
I/flutter (14968): #38 RenderObject.layout (package:flutter/src/rendering/object.dart:1644:7)
I/flutter (14968): #39 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
I/flutter (14968): #40 RenderObject.layout (package:flutter/src/rendering/object.dart:1644:7)
I/flutter (14968): #41 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
I/flutter (14968): #42 RenderObject.layout (package:flutter/src/rendering/object.dart:1644:7)
I/flutter (14968): #43 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
I/flutter (14968): #44 RenderObject.layout (package:flutter/src/rendering/object.dart:1644:7)
I/flutter (14968): #45 _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
I/flutter (14968): #46 RenderObject.layout (package:flutter/src/rendering/object.dart:1644:7)
I/flutter (14968): #47 RenderSliverList.performLayout.advance (package:flutter/src/rendering/sliver_list.dart:201:17)
I/flutter (14968): #48 RenderSliverList.performLayout (package:flutter/src/rendering/sliver_list.dart:234:19)
I/flutter (14968): #49 RenderObject.layout (package:flutter/src/rendering/object.dart:1644:7)
I/flutter (14968): #50 RenderSliverPadding.performLayout (package:flutter/src/rendering/sliver_padding.dart:182:11)
I/flutter (14968): #51 RenderObject.layout (package:flutter/src/rendering/object.dart:1644:7)
I/flutter (14968): #52 RenderViewportBase.layoutChildSequence (package:flutter/src/rendering/viewport.dart:407:13)
I/flutter (14968): #53 RenderViewport._attemptLayout (package:flutter/src/rendering/viewport.dart:1322:12)
I/flutter (14968): #54 RenderViewport.performLayout (package:flutter/src/rendering/viewport.dart:1240:20)
I/flutter (14968): #55 RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:1519:7)
I/flutter (14968): #56 PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:766:18)
I/flutter (14968): #57 _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:347:19)
I/flutter (14968): #58 _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding&WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:701:13)
I/flutter (14968): #59 _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:286:5)
I/flutter (14968): #60 _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1012:15)
I/flutter (14968): #61 _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:952:9)
I/flutter (14968): #62 _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:864:5)
I/flutter (14968): #66 _invoke (dart:ui/hooks.dart:219:10)
I/flutter (14968): #67 _drawFrame (dart:ui/hooks.dart:178:3)
I/flutter (14968): (elided 3 frames from package dart:async)
I/flutter (14968): ════════════════════════════════════════════════════════════════════════════════════════════════════
I/flutter (14968): 1
I/flutter (14968): null
I/flutter (14968): Another exception was thrown: NoSuchMethodError: The method '[]' was called on null.
I/flutter (14968): 2
I/flutter (14968): null
I/flutter (14968): Another exception was thrown: NoSuchMethodError: The method '[]' was called on null.
So from terminal output , we can see its not printing hit 7 , so something wrong with json parsing.