【问题标题】:Fetching from Firestore into SfDataGrid从 Firestore 获取到 SfDataGrid
【发布时间】:2022-08-05 18:07:08
【问题描述】:

您能否与我分享一个使用 Flutter 连接到 Firestore 的 SfDatagrid 示例?谢谢

  • 听起来您有几个问题需要研究: - 如何将数据从 Firestore 加载到 Flutter 应用程序 - 如何将数据转换为表格行 - 如何使用 SfDatagrid API 在 Flutter 中构建表格
  • 谢谢大卫,我知道如何从 Firestore 中检索,我也知道如何填充 Listview.builder。但是这个 SFDatagrid 对我来说是一个挑战。我可以与您分享我的部分代码吗?如果您能提供帮助,我将不胜感激。谢谢

标签: flutter google-cloud-firestore datatable


【解决方案1】:

这对我有用, 这是基于 Syncfusion 网站上的一个示例: https://www.syncfusion.com/kb/12766/how-to-load-data-from-firebase-to-flutter-datatable-sfdatagrid 此示例使用实时数据库,但您只需要填写正确的代码即可使其适用于 firestore,因此无需:

  getDataFromDatabase() async {
    var value = FirebaseDatabase.instance.reference();
    var getValue = await value.child('DataGridEmployeeCollection').once();
    return getValue;
  }

你初始化:

 FirebaseFirestore db = FirebaseFirestore.instance;
  Stream<QuerySnapshot> _userStream =
  FirebaseFirestore.instance.collection('Users').snapshots();

我使用流是因为我希望我的数据实时更新。 然后按照示例进行操作,它应该如下所示:

用户数据来源:

class UserDataSource extends DataGridSource {
  UserDataSource(this._currentUserInfo) {
    _buildDataRow();
  }

  List<DataGridRow> users = [];
  List<CurrentUserInfo> _currentUserInfo;

  void _buildDataRow() {
    users = _currentUserInfo
        .map<DataGridRow>((e) => DataGridRow(
              cells: [
                DataGridCell<String>(
                  columnName: "Uid",
                  value: e.Uid,
                ),
                DataGridCell<String>(
                  columnName: "Name",
                  value: e.Name,
                ),
                DataGridCell(
                  columnName: "Surname",
                  value: e.Surname,
                ),
                DataGridCell(
                  columnName: "Role",
                  value: e.UserRole,
                ),
                DataGridCell(
                  columnName: "City",
                  value: e.City,
                ),
              ],
            ))
        .toList();
  }

  @override
  List<DataGridRow> get rows => users;

  @override
  DataGridRowAdapter buildRow(
    DataGridRow row,
  ) {
    return DataGridRowAdapter(
        cells: row.getCells().map<Widget>((e) {
      return Container(
        alignment: Alignment.center,
        padding: EdgeInsets.all(8.0),
        child: Text(e.value.toString()),
      );
    }).toList());
  }
}
class _UserIndexState extends State<UserIndex> {
  @override
  late UserDataSource userDataSource;
  late List<CurrentUserInfo> UserData = [];
  FirebaseFirestore db = FirebaseFirestore.instance;
  Stream<QuerySnapshot> _userStream =
      FirebaseFirestore.instance.collection('Users').snapshots();

  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return BaseWidget(child: Center(
      child: StreamBuilder<QuerySnapshot>(
        stream: _userStream,
        builder: (context, AsyncSnapshot<QuerySnapshot> snapshot) {
          if (!snapshot.hasData) return LinearProgressIndicator();
          UserData.clear();
          snapshot.data!.docs.forEach((doc) {
            UserData.add(
                CurrentUserInfo.fromJson(doc.data() as Map<String, dynamic>));
          });

          userDataSource = UserDataSource(UserData);
          return SfDataGrid(
            columnWidthMode: ColumnWidthMode.fill,
            source: userDataSource,
            columns: <GridColumn>[
              GridColumn(
                columnName: "Uid",
                label: Container(
                  padding: EdgeInsets.all(16.0),
                  alignment: Alignment.center,
                  child: Text(
                    'ID',
                  ),
                ),
              ),
              //make gridcollumns for Name Surname role and city
              GridColumn(
                columnName: "Name",
                label: Container(
                  padding: EdgeInsets.all(16.0),
                  alignment: Alignment.center,
                  child: Text(
                    'Name',
                  ),
                ),
              ),
              GridColumn(
                columnName: "Surname",
                label: Container(
                  padding: EdgeInsets.all(16.0),
                  alignment: Alignment.center,
                  child: Text(
                    'Surname',
                  ),
                ),
              ),
              GridColumn(
                columnName: "Role",
                label: Container(
                  padding: EdgeInsets.all(16.0),
                  alignment: Alignment.center,
                  child: Text(
                    'Role',
                  ),
                ),
              ),
              GridColumn(
                columnName: "City",
                label: Container(
                  padding: EdgeInsets.all(16.0),
                  alignment: Alignment.center,
                  child: Text(
                    'City',
                  ),
                ),
              ),
            ],
          );
        },
      ),
    ),);
  }
}

【讨论】:

  • 请记住,Stack Overflow 不仅旨在解决眼前的问题,还可以帮助未来的读者找到类似问题的解决方案,这需要了解底层代码。这对于我们社区的初学者和不熟悉语法的成员来说尤其重要。鉴于,你能edit你的答案包括你在做什么的解释吗为什么你认为这是最好的方法?
猜你喜欢
  • 2020-11-15
  • 1970-01-01
  • 1970-01-01
  • 2018-10-14
  • 2021-08-06
  • 2021-10-18
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
相关资源
最近更新 更多