GetX Firebase 流不更新 UI
GetX Firebase stream does not update UI
我遗漏了 GetX 和 Firebase 流的一些基本知识。
ListView 的 UI 不会更新,直到 UI(setState 或其他)发生变化。
我得到了一个 TodoController,它带有一个绑定到 Firebase 流的 RxList 和一个用于显示所有待办事项的 ListView。 ListView 未更新。
GetBuilder<TodoController>(
builder: (_) => TodoListView(
todos: _.todos,
),
),
DB class
final FirebaseFirestore _firestore = FirebaseFirestore.instance;
String uid = FirebaseAuth.instance.currentUser!.uid;
return _firestore
.collection('todos')
.snapshots()
.map((QuerySnapshot query) {
List<Todo> _todos = [];
for (var todoDoc in query.docs) {
_todos.add(
Todo.fromDocumentSnapshot(todoDoc)
);
}
return _todos;
});
控制器class
class TodoController extends GetxController {
final RxList<Todo> _todos = RxList<Todo>([]);
final TodosDB _db = TodosDB();
@override
void onReady() {
_todos.bindStream(_db.getTodoStream());
super.onReady();
}
List<Todo> get todos {
// to some fancy stuff... doesn't matter if I make
// use of .where or anything
return _todos;
}
}
通过将 GetBuilder
更改为 GetX
解决
GetBuilder 是 non-reactive 而 GetX 是反应式的
GetBuilder<TodoController>(
builder: (_) => TodoListView(
todos: _.todos,
),
),
改成这个
GetX<TodoController>(
builder: (_) => TodoListView(
todos: _.todos,
),
),
我遗漏了 GetX 和 Firebase 流的一些基本知识。 ListView 的 UI 不会更新,直到 UI(setState 或其他)发生变化。
我得到了一个 TodoController,它带有一个绑定到 Firebase 流的 RxList 和一个用于显示所有待办事项的 ListView。 ListView 未更新。
GetBuilder<TodoController>(
builder: (_) => TodoListView(
todos: _.todos,
),
),
DB class
final FirebaseFirestore _firestore = FirebaseFirestore.instance;
String uid = FirebaseAuth.instance.currentUser!.uid;
return _firestore
.collection('todos')
.snapshots()
.map((QuerySnapshot query) {
List<Todo> _todos = [];
for (var todoDoc in query.docs) {
_todos.add(
Todo.fromDocumentSnapshot(todoDoc)
);
}
return _todos;
});
控制器class
class TodoController extends GetxController {
final RxList<Todo> _todos = RxList<Todo>([]);
final TodosDB _db = TodosDB();
@override
void onReady() {
_todos.bindStream(_db.getTodoStream());
super.onReady();
}
List<Todo> get todos {
// to some fancy stuff... doesn't matter if I make
// use of .where or anything
return _todos;
}
}
通过将 GetBuilder
更改为 GetX
GetBuilder 是 non-reactive 而 GetX 是反应式的
GetBuilder<TodoController>(
builder: (_) => TodoListView(
todos: _.todos,
),
),
改成这个
GetX<TodoController>(
builder: (_) => TodoListView(
todos: _.todos,
),
),