I am trying to show one of my firestore collection data on PaginatedDataTable on flutter web application. But getting the error. Please fine my code and debug error below. If below approach is not correct please let me know a best approach. I want to show my Firestore fields on PaginatedDataTable as stream builder method. Need help how to do this? if it is not possible in PaginatedDataTable, and if there is any other way please let me know. How to implement User class ?

Below is my example code:

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';

class AdminDashboard extends StatefulWidget {
  const AdminDashboard({Key? key}) : super(key: key);

  @override
  _AdminDashboardState createState() => _AdminDashboardState();
}

class _AdminDashboardState extends State<AdminDashboard> {
  //final DataTableSource _allUsers = UsersData();

  @override
  Widget build(BuildContext context) {
    List<User>? users;
    return StreamBuilder(
        //padding: const EdgeInsets.all(16),
        stream: FirebaseFirestore.instance.collection("users").snapshots(),
        builder: (context, AsyncSnapshot<QuerySnapshot> snap) {
          users = snap.data!.docs.map((e) => User.fromMap(e.data)).cast<User>().toList();
          final DataTableSource _allUsers = UsersData(users!);
          if (snap.hasData) {
            return PaginatedDataTable(
              header: const Text("Header Text"),
              rowsPerPage: 9,
              columns: const [
                DataColumn(label: Text('Uid')),
                DataColumn(label: Text('Name')),
                DataColumn(label: Text('Email')),
                DataColumn(label: Text('Role'))
              ],
              source: _allUsers,
            );
          } else {
            return const Text('No data...');
          }
        });
  }
}

class User {
  
  late String name;

  late String email;

  late String role;

  late String uid;

  static fromMap(Object? Function() data) {}
}

class UsersData extends DataTableSource {
  final List<User> users;

  UsersData(this.users);

  @override
  DataRow getRow(int index) {
    return DataRow.byIndex(cells: [
      DataCell(Text(users[index].uid)),
      DataCell(Text(users[index].name)),
      DataCell(Text(users[index].email)),
      DataCell(Text(users[index].role)),
    ], index: index);
  }

  @override
  bool get isRowCountApproximate => false;

  @override
  int get rowCount => users.length;

  @override
  int get selectedRowCount => 0;
}

Below is the Debug console error:

Launching lib\main.dart on Chrome in debug mode...
This app is linked to the debug service: ws://127.0.0.1:54737/8r23hBREOEg%3D/ws
Debug service listening on ws://127.0.0.1:54737/8r23hBREOEg=/ws
 Running with sound null safety
Connecting to VM Service at ws://127.0.0.1:54737/8r23hBREOEg=/ws

════════ Exception caught by widgets library ═══════════════════════════════════
The following TypeErrorImpl was thrown building StreamBuilder<QuerySnapshot<Map<String, dynamic>>>(dirty, state: _StreamBuilderBaseState<QuerySnapshot<Map<String, dynamic>>, AsyncSnapshot<QuerySnapshot<Map<String, dynamic>>>>#58793):
Unexpected null value.

The relevant error-causing widget was
StreamBuilder<QuerySnapshot<Map<String, dynamic>>>
When the exception was thrown, this was the stack
C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart 251:49      throw_
C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart 528:63  nullCheck
packages/pma/admin_dir/admin_dashboard.dart 21:81                                                                              <fn>
packages/flutter/src/widgets/async.dart 545:81                                                                                 build
packages/flutter/src/widgets/async.dart 124:48                                                                                 build
packages/flutter/src/widgets/framework.dart 4782:27                                                                            build
packages/flutter/src/widgets/framework.dart 4665:15                                                                            performRebuild
packages/flutter/src/widgets/framework.dart 4840:11                                                                            performRebuild
packages/flutter/src/widgets/framework.dart 4355:5                                                                             rebuild
packages/flutter/src/widgets/framework.dart 4643:5                                                                             [_firstBuild]
packages/flutter/src/widgets/framework.dart 4831:11                                                                            [_firstBuild]
packages/flutter/src/widgets/framework.dart 4638:5                                                                             mount
packages/flutter/src/widgets/framework.dart 3673:13                                                                            inflateWidget
packages/flutter/src/widgets/framework.dart 3425:18                                                                            updateChild
packages/flutter/src/widgets/framework.dart 4690:16                                                                            performRebuild
packages/flutter/src/widgets/framework.dart 4355:5                                                                             rebuild
packages/flutter/src/widgets/framework.dart 5020:5                                                                             update
packages/flutter/src/widgets/framework.dart 3412:14                                                                            updateChild
packages/flutter/src/widgets/framework.dart 4690:16                                                                            performRebuild
packages/flutter/src/widgets/framework.dart 4840:11                                                                            performRebuild
packages/flutter/src/widgets/framework.dart 4355:5                                                                             rebuild
packages/flutter/src/widgets/framework.dart 2620:31                                                                            buildScope
packages/flutter/src/widgets/binding.dart 882:9                                                                                drawFrame
packages/flutter/src/rendering/binding.dart 319:5                                                                              [_handlePersistentFrameCallback]
packages/flutter/src/scheduler/binding.dart 1143:15                                                                            [_invokeFrameCallback]
packages/flutter/src/scheduler/binding.dart 1080:9                                                                             handleDrawFrame
packages/flutter/src/scheduler/binding.dart 996:5                                                                              [_handleDrawFrame]
C:/b/s/w/ir/cache/builder/src/out/host_debug/flutter_web_sdk/lib/_engine/engine/platform_dispatcher.dart 1003:13               invoke
C:/b/s/w/ir/cache/builder/src/out/host_debug/flutter_web_sdk/lib/_engine/engine/platform_dispatcher.dart 157:5                 invokeOnDrawFrame
C:/b/s/w/ir/cache/builder/src/out/host_debug/flutter_web_sdk/lib/_engine/engine.dart 440:45                                    <fn>
════════════════════════════════════════════════════════════════════════════════

════════ Exception caught by widgets library ═══════════════════════════════════
Expected a value of type 'User', but got one of type 'Null'
The relevant error-causing widget was
StreamBuilder<QuerySnapshot<Map<String, dynamic>>>
════════════════════════════════════════════════════════════════════════════════ 
1

There are 1 best solutions below

1
On

The error log indicated that User.fromMap(e.data) didn't return a User(which return null instead). And I found that your User.fromMap(e.data) implementation is empty:

class User {
  
  late String name;

  late String email;

  late String role;

  late String uid;

  static fromMap(Object? Function() data) {}
}