I am trying to build a generic data table. When the user scrolls to bottom of the data table I add the bloc event to get the next set of data from firebase. This works fine when not being done genericly. The problem is I don't know how to pass the type of a class or even if its possible. I need the 'is' function to ensure the state is display.
The code below works fine but is not generic
void scrollListener() {
if (scrollController.offset >= scrollController.position.maxScrollExtent &&
!scrollController.position.outOfRange) {
if (_blocController.state is StateClientListDisplayed &&
_blocController.hasNext) {
_blocController.add(EventDisplayClients());
}
}
}
This is my attempting at making the generic version
void scrollListener() {
if (scrollController.offset >= scrollController.position.maxScrollExtent &&
!scrollController.position.outOfRange) {
if (widget.blocController.state is widget.stateDataDisplayed) {
widget.blocController.add(widget.eventLoadMoreData);
}
}
}
Really in need of help. I either don't understand what other posts are saying or they say its not possible. Can someone clarify this can be done or guide me. Thanks!!
Android Studio give me this type error:
error: The name 'widget.stateDataDisplayed' isn't defined, so it can't be used in an 'is' expression. (type_test_with_undefined_name at [track] lib/src/widgets/data_table.dart:43)
Edit 2: Full class
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:track/src/abstract_classes/bloc.dart';
class GenericDataTable extends StatefulWidget {
late double screenWidth, screenHeight;
final List<String> columnsTitles;
final blocController;
final BlocState stateDataDisplayed;
final BlocEvent eventLoadMoreData;
GenericDataTable({
Key? key,
required this.blocController,
required this.stateDataDisplayed,
required this.eventLoadMoreData,
required this.columnsTitles,
required this.screenWidth,
required this.screenHeight,
}) : super(key: key);
@override
State<GenericDataTable> createState() => _GenericDataTableState();
}
class _GenericDataTableState extends State<GenericDataTable> {
final ScrollController scrollController = ScrollController();
@override
void initState() {
scrollController.addListener(scrollListener);
super.initState();
}
@override
void dispose() {
scrollController.dispose();
super.dispose();
}
void scrollListener() {
if (scrollController.offset >= scrollController.position.maxScrollExtent &&
!scrollController.position.outOfRange) {
if (widget.blocController.state is widget.stateDataDisplayed) {
widget.blocController.add(widget.eventLoadMoreData);
}
}
}
This looks to have solved it
if (_blocController.state.runtimeType == StateClientListDisplayed && _blocController.hasNext) {
_blocController.add(EventDisplayClients());
}