我正在使用sqflite
数据库来保存用户列表。我有用户列表屏幕,它显示用户列表,它有一个 fab 按钮,单击 fab 按钮,用户被重定向到下一个屏幕,他可以在其中将新用户添加到数据库。新用户已正确插入数据库,但当用户按下后退按钮并返回用户列表屏幕时,新添加的用户在屏幕上不可见。我必须关闭应用程序并重新打开它,然后新添加的用户会在屏幕上可见。
我正在使用bloc
模式,以下是我显示用户列表的代码
class _UserListState extends State<UserList> {
UserBloc userBloc;
@override
void initState() {
super.initState();
userBloc = BlocProvider.of<UserBloc>(context);
userBloc.fetchUser();
}
@override
void dispose() {
userBloc?.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
floatingActionButton: FloatingActionButton(
onPressed: () {
Navigator.of(context).pushNamed("/detail");
},
child: Icon(Icons.add),
),
body: StreamBuilder(
stream: userBloc.users,
builder: (context, AsyncSnapshot<List<User>> snapshot) {
if (!snapshot.hasData) {
return Center(
child: CircularProgressIndicator(),
);
}
if (snapshot.data != null) {
return ListView.builder(
itemBuilder: (context, index) {
return Dismissible(
key: Key(snapshot.data[index].id.toString()),
direction: DismissDirection.endToStart,
onDismissed: (direction) {
userBloc.deleteParticularUser(snapshot.data[index]);
},
child: ListTile(
onTap: () {
Navigator.of(context).push(MaterialPageRoute(
builder: (context) => UserDetail(
user: snapshot.data[index],
)));
},
title: Text(snapshot.data[index].name),
subtitle:
Text("Mobile Number ${snapshot.data[index].userId}"),
trailing:
Text("User Id ${snapshot.data[index].mobileNumber}"),
),
);
},
itemCount: snapshot.data.length,
);
}
},
),
);
}
}
以下是我的集团代码
class UserBloc implements BlocBase {
final _users = BehaviorSubject<List<User>>();
Observable<List<User>> get users => _users.stream;
fetchUser() async {
await userRepository.initializeDatabase();
final users = await userRepository.getUserList();
_users.sink.add(users);
}
insertUser(String name,int id,int phoneNumber) async {
userRepository.insertUser(User(id, name, phoneNumber));
fetchUser();
}
updateUser(User user) async {
userRepository.updateUser(user);
}
deleteParticularUser(User user) async {
userRepository.deleteParticularUser(user);
}
deleteAllUser() {
return userRepository.deleteAllUsers();
}
@override
void dispose() {
_users.close();
}
}
正如雷米发布的回答说我应该尝试BehaviorSubject
并且ReplaySubject
我尝试过但它没有帮助。正如评论中指出的那样,我也打电话给 fetchUser();
里面insertUser()
以下是完整示例的链接