Bloc模式的存储库模型是一种常用的架构模式,用于管理应用程序的状态和业务逻辑。在这种模式中,存储库负责从数据源(如数据库或网络)获取数据,并将其提供给Bloc层。Bloc层负责处理业务逻辑,并将状态传递给UI层进行显示。
下面是一个示例,展示了如何使用Bloc模式的存储库模型和List
首先,定义一个数据源接口,用于从数据源获取数据:
abstract class CounterDataSource {
Future getCounter();
Future setCounter(int counter);
}
然后,实现一个具体的数据源类,例如使用SharedPreferences来存储计数器的值:
class SharedPreferencesCounterDataSource implements CounterDataSource {
static const String _counterKey = 'counter';
@override
Future getCounter() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.getInt(_counterKey) ?? 0;
}
@override
Future setCounter(int counter) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
await prefs.setInt(_counterKey, counter);
}
}
接下来,定义一个存储库类,用于处理数据源的交互和业务逻辑:
class CounterRepository {
final CounterDataSource dataSource;
CounterRepository({required this.dataSource});
Future getCounter() {
return dataSource.getCounter();
}
Future setCounter(int counter) {
return dataSource.setCounter(counter);
}
}
然后,实现一个Bloc类,用于处理业务逻辑和状态管理:
class CounterBloc {
final CounterRepository repository;
final _counter = BehaviorSubject();
CounterBloc({required this.repository}) {
_initCounter();
}
Stream get counter => _counter.stream;
void _initCounter() async {
int initialCounter = await repository.getCounter();
_counter.sink.add(initialCounter);
}
void incrementCounter() async {
int currentCounter = await repository.getCounter();
await repository.setCounter(currentCounter + 1);
_counter.sink.add(currentCounter + 1);
}
void dispose() {
_counter.close();
}
}
最后,在UI层中使用Bloc类来管理状态和更新UI:
class CounterPage extends StatefulWidget {
final CounterBloc bloc;
CounterPage({required this.bloc});
@override
_CounterPageState createState() => _CounterPageState();
}
class _CounterPageState extends State {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Counter'),
),
body: StreamBuilder(
stream: widget.bloc.counter,
builder: (context, snapshot) {
if (snapshot.hasData) {
return Center(
child: Text(
'Counter: ${snapshot.data}',
style: TextStyle(fontSize: 24),
),
);
} else {
return Center(child: CircularProgressIndicator());
}
},
),
floatingActionButton: FloatingActionButton(
onPressed: () {
widget.bloc.incrementCounter();
},
child: Icon(Icons.add),
),
);
}
@override
void dispose() {
widget.bloc.dispose();
super.dispose();
}
}
以上是一个简单的示例,展示了如何使用Bloc模式的存储库模型和List