Я использую sqflite
базу данных для сохранения списка пользователей.
У меня есть экран со списком пользователей, который показывает список пользователей и имеет потрясающую кнопку,
по нажатию кнопки 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()
, как указано в комментариях
Ниже приводится ссылка на полный пример
https://github.com/pritsawa/sqflite_example