Привет, я пытаюсь создать простую базу данных в реальном времени с помощью Streambuilder, возвращая Listview.builder, который в нем является ListTile. Я использую sh, чтобы дать ListTile возможность перемещаться на другой дротик. что мне удалось сделать, однако, когда я пытаюсь передать элемент, он становится null , но когда я пытаюсь его распечатать, он печатается в терминале.
class ListItemsDisplay extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return _ListItemsDisplay();
}
}
class _ListItemsDisplay extends State<ListItemsDisplay> {
@override
Widget build(BuildContext context) {
return new StreamBuilder(
stream: Firestore.instance.collection("posts").snapshots(),
builder: (context, snapshot) {
if (!snapshot.hasData) {
return Center(
child: Text("Loading.."),
);
} else {
return ListView.builder(
itemCount: snapshot.data.documents.length,
itemBuilder: (context, index)`enter code here` {
if (snapshot.data.documents[index]['title'] != null &&
snapshot.data.documents[index]['title'] != "" &&
snapshot.data.documents[index]['title'] != " ") {
print(
"MY ID: " + snapshot.data.documents[index].documentID);
return ListTile(
title: Text(snapshot.data.documents[index]['title']),
onTap: () {
if (snapshot.data.documents[index]['title'] !=
null) {**//AS YOU CAN SEE HERE IM TRYING TO PASS the document id in DISPLAYITEM() CLASS**
print("MY ITEM ID ""TAPPED"" IF NOT NULL: "+snapshot.data.documents[index].documentID);
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => DisplayItem(snapshot.data.documents[index].documentID)));
} else {
print("MY ITEM ID ""TAPPED"" IF NULL: "+snapshot.data.documents[index].documentID);
}
});
} else {
return ListTile(
title: Text("Missing title [REPORT TO ADMIN]"),
);
}
});
}
});
}
}
Вот мой DisplayItem class.
class DisplayItem extends StatelessWidget {
final String _myId;
DisplayItem(this._myId);
String getTitle(String myId) {
if(myId.isNotEmpty && myId!=null) {
Firestore.instance.collection("posts").document(myId).get().then((value) {
if (value.data['title'].toString() != null &&
value.data['title'].toString() != "" &&
value.data['title'].toString() != " ")
return value.data['title'].toString();
else
return "NONE FOUND";
});
}
else
return "HELLO";
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text("TITLE"),
),
body: Column(
children: <Widget>[
Text(getTitle(_myId)),
],
),
),
);
}
}
Я пытаюсь создать базу данных в реальном времени (firestore), в которой флаттер будет отображать список элементов при щелчке любого элемента в списке; он перенаправит пользователя к другому файлу дротика, в котором этот файл дротика будет отображать более подробное описание предмета.
Вот ошибка:
════════ Exception caught by widgets library ═══════════════════════════════════════════════════════
The following assertion was thrown building DisplayItem(dirty):
A non-null String must be provided to a Text widget.
'package:flutter/src/widgets/text.dart':
Failed assertion: line 298 pos 10: 'data != null'
The relevant error-causing widget was:
DisplayItem file:///D:/Programming/Flutter_Projects/flutter_study/lib/main.dart:64:59
When the exception was thrown, this was the stack:
#2 new Text (package:flutter/src/widgets/text.dart:298:10)
#3 DisplayItem.build (package:flutterstudy/Display.dart:31:7)
#4 StatelessElement.build (package:flutter/src/widgets/framework.dart:4576:28)
#5 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4502:15)
#6 Element.rebuild (package:flutter/src/widgets/framework.dart:4218:5)
...
════════════════════════════════════════════════════════════════════════════════════════════════════
HERE IS THE ID IM TRYING TO PASS
I/flutter (11339): MY NOT NULL ID: sc94LjZJz57t947YgTlp
КОГДА Я НАЖИМАЮ ЭТО (файл DisplayItem : /// D: /Programming/Flutter_Projects/flutter_study/lib/main.dart: 64: 59)
IM ПЕРЕНАПРАВЛЕН ЗДЕСЬ: builder: (context) => DisplayItem (snapshot.data.documents [index] .documentID)));
HERE's WHAT HAPPENS:
as soon as I ran, I added a print method that will print document ID of items.
I/flutter (13386): MY ID: sc94LjZJz57t947YgTlp
I/flutter (13386): MY ID: xqbkvhVveYhr3YvgSGuE
Now I clicked any of the Item
IT Shows the **ERROR ON TERMINAL** then it displays the last method I added in onTap, which print method:
I/flutter (13386): MY ITEM ID TAPPED IF NOT NULL: sc94LjZJz57t947YgTlp