页面加载时未调用Flutter Getx Controller onInit方法



我已经建立了一个todo应用程序与扑动,getx和firebase。我有一个登录页面,注册页面和待办事项页面,我显示待办事项列表。我使用firebase_auth包进行身份验证,使用cloud_firestore包保存和检索firestore中的数据。我有两个模型-一个用于用户,另一个用于待办事项。

为了在firestore中保存待办事项,我有以下方法-

Future<void> addTodo(String content, String uid) async {
try {
await firebaseFirestore
.collection("users")
.doc(uid)
.collection("todos")
.add({
"content": content,
"dateCreated": Timestamp.now(),
"done": false,
});
} catch (e) {
print(e.toString());
rethrow;
}
}

要从firestore中检索待办事项列表,我使用下面的方法返回待办事项流

Stream<List<TodoModel>> todoStream(String uid) {
return firebaseFirestore
.collection("users")
.doc(uid)
.collection("todos")
.orderBy("dateCreated", descending: true)
.snapshots()
.map((event) {
List<TodoModel> retVal = List.empty(growable: true);
event.docs.forEach((element) {
TodoModel todo = TodoModel();
todo.todoId = element.id;
todo.content = element['content'];
todo.dateCreated = element['dateCreated'];
todo.done = element['done'];
print(todo.toString());
retVal.add(todo);
});
return retVal;
});
}

正如您所看到的,特定用户的todo与他们的id绑定在一起。

现在在我的todo控制器的onInit方法中,我调用上面的函数来获取todo的流

@override
void onInit() {
String uid = Get.find<AuthController>().user;
todoList.bindStream(DatabaseService().todoStream(uid));
super.onInit();
}

Auth控制器返回用户的id,然后将该id馈送给todoStream函数以获取todos

在构建方法中的应用程序的主页中,我像这样注入Todo控制器

Get.put(TodoController());

在Scaffold小部件的主体中,我使用Obx显示待办事项,如下所示

Obx(
() {
if (Get.find<TodoController>().todos.length > 0) {
return Expanded(
child: ListView.builder(
itemCount: Get.find<TodoController>().todos.length,
itemBuilder: (_, index) {
TodoModel todo = Get.find<TodoController>().todos[index];
return Card(
margin:
EdgeInsets.symmetric(horizontal: 20, vertical: 5),
child: Padding(
padding: EdgeInsets.all(10.0),
child: Row(
children: [
Expanded(
child: Text(
todo.content,
style: TextStyle(
fontSize: 15,
fontWeight: FontWeight.bold,
),
),
),
Checkbox(
value: todo.done,
onChanged: (newValue) {
print(newValue);
}),
],
),
),
);
},
),
);
} else {
return Text(
"Loading....",
style: TextStyle(fontSize: 20.0, fontWeight: FontWeight.bold),
);
}
},
)

我面临的问题是当应用程序启动和第一个用户登录时,我可以看到todo控制器被创建和初始化,他的todo列表显示在页面上。然而,当他退出登录,另一个用户登录时,页面能够正确显示他的名字,这意味着用户被正确识别,但仍然显示第一个用户的待办事项列表。

这告诉我,当第二个用户登录时,todo控制器的onInit方法没有被调用。

有人知道如何解决这个问题吗?

下面是TodoController -

class TodoController extends GetxController {
Rxn<List<TodoModel>> todoList = Rxn<List<TodoModel>>();
List<TodoModel> get todos => todoList.value ?? [];
void clear() => todoList = Rxn<List<TodoModel>>();
@override
void onInit() {
String uid = Get.find<AuthController>().user;
print("onInit called=====================" + uid);
todoList.bindStream(DatabaseService().todoStream(uid));
print("todo bind stream done=========================");
super.onInit();
}
}

oninit函数调用实际问题是与bindstream todoList.bindStream(DatabaseService().todoStream(uid));在调用这个bindstream之后,它需要一秒钟从firebase获取数据,之后这给了模型,所以你需要在ui页面上添加加载器,一旦数据加载到dolist !=null则需要False loader并显示数据

最新更新