Flutter/Firebase - 正确的轨道?

Flutter/Firebase - Right Track?

我 54 岁了,正在自学 Flutter 并取得了长足的进步。关于 Firebase 的实施,我(再次)遇到了减速带。虽然我得到了为每条记录显示一行数据的非常基本的问题,但问题在于每条记录的详细信息。我认为问题在于我没有引用记录 ID。

在查看无穷无尽的示例时,我还认为我显示记录 ListView 的代码过于臃肿,这使得抓取记录和显示所有字段(编辑屏幕)变得更加困难。

我想单击“Walsh-Test”链接查看所有字段并进行更新。我可以创建一个新的 edit/update 屏幕我最初的问题是打开所选记录的屏幕。

如有任何建议,我们将不胜感激。

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

class MeterReadHomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      appBar: AppBar(
        backgroundColor: Color(0xff4367b1),
        automaticallyImplyLeading: false,
        leading: GestureDetector(
          onTap: () {
            Navigator.pop(context);
          },
          child: Icon(
            Icons.arrow_back,
            color: Colors.white,
          ),
        ),
        title: Text(
          "WelakaOne",
          style: TextStyle(
            color: Colors.white,
          ),
        ),
      ),
      body: StreamBuilder(
        stream: FirebaseFirestore.instance
            .collection('meter_reads')
            .orderBy('accountname')
            .snapshots(),
        builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
          if (!snapshot.hasData) {
            return Center(
              child: CircularProgressIndicator(),
            );
          }
          return Padding(
            padding: const EdgeInsets.fromLTRB(6, 20, 0, 0),
            child: Container(
              child: GestureDetector(
                onTap: () {},
                child: ListView(
                  children: snapshot.data.docs.map(
                    (document) {
                      return Row(
                        children: [
                          Container(
                            width: 50,
                            child: Icon(
                              Icons.access_alarm,
                              size: 36,
                              color: Color(0xff4367b1),
                            ),
                          ),
                          Container(
                            child: Text(
                              document['accountname'],
                              style: TextStyle(
                                fontSize: 20,
                                fontWeight: FontWeight.bold,
                                color: Color(0xff4367b1),
                              ),
                            ),
                          ),
                          SizedBox(height: 44),
                        ],
                      );
                    },
                  ).toList(),
                ),
              ),
            ),
          );
        },
      ),
    );
  }
}
[![Flutter/Firebase/Open to Selected Record][1]][1]

我了解到您想在点击警报磁贴时转到另一个页面(编辑屏幕)。 因此,我的建议是使用 A ListTile 小部件而不是您正在使用的行小部件。

您可以阅读有关 ListTile 的 onTap 属性、here 关于到新 screen/page 的路由,您必须使用 MaterialPageRoute 创建新路由,并使用 Navigator 的 push 方法将其推送到您的 Material 应用程序。

附上使用Navigator跳转到不同页面的示例代码,需要你的app的BuildContext。以下是如何获取它的示例:

import 'package:flutter/material.dart';
import 'package:rate_your_professor/screens/firstScreen.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Some App',
      home: SomeApp(),
    );
  }
}

class SomeApp extends StatelessWidget {
  Widget getListView(BuildContext context) {
    var listView = ListView(
      children: <Widget>[
        Text(
          "XXXXXXXXXXXXXXX",
          textDirection: TextDirection.rtl,
          textAlign: TextAlign.center,
        ),
        ListTile(
          leading: Icon(Icons.location_city),
          title: Text("XXXXX ", textDirection: TextDirection.rtl),
          subtitle: Text(
            "XXXXXXXXXX",
            textDirection: TextDirection.rtl,
          ),
          onTap: () {
            Navigator.push(
              context,
              MaterialPageRoute(
                  builder: (context) => YourNewPage(),
                  ),
            );
          },
        ),
      ],
    );
    return listView;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(body: getListView(context));
  }
}