在Flutter中,BLoC(Business Logic Component)是一种用于管理应用状态的架构模式
FutureBuilder
FutureBuilder
是一个Flutter Widget,它可以等待一个Future
完成并显示结果。你可以在BLoC中使用FutureBuilder
来处理异步调用。
class MyBloc {
final _repository = MyRepository();
Future<MyData> fetchData() async {
return await _repository.fetchData();
}
}
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('My App')),
body: FutureBuilder<MyData>(
future: MyBloc().fetchData(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return Center(child: CircularProgressIndicator());
} else if (snapshot.hasError) {
return Center(child: Text('Error: ${snapshot.error}'));
} else {
return Center(child: Text('Data: ${snapshot.data}'));
}
},
),
);
}
}
StreamBuilder
StreamBuilder
是另一个Flutter Widget,它可以监听一个Stream
并显示最新的数据。你可以在BLoC中使用StreamBuilder
来处理异步调用。
class MyBloc {
final _repository = MyRepository();
final _streamController = StreamController<MyData>.broadcast();
Stream<MyData> get dataStream => _streamController.stream;
void fetchData() async {
try {
final data = await _repository.fetchData();
_streamController.add(data);
} catch (e) {
_streamController.addError(e);
}
}
void dispose() {
_streamController.close();
}
}
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('My App')),
body: StreamBuilder<MyData>(
stream: MyBloc().dataStream,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return Center(child: CircularProgressIndicator());
} else if (snapshot.hasError) {
return Center(child: Text('Error: ${snapshot.error}'));
} else if (snapshot.hasData) {
return Center(child: Text('Data: ${snapshot.data}'));
} else {
return Container();
}
},
),
);
}
}
async
和await
你还可以在BLoC中使用async
和await
关键字来处理异步调用。
class MyBloc {
final _repository = MyRepository();
Future<MyData> fetchData() async {
try {
final data = await _repository.fetchData();
return data;
} catch (e) {
throw e;
}
}
}
class MyWidget extends StatefulWidget {
@override
_MyWidgetState createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
Future<MyData> _dataFuture;
@override
void initState() {
super.initState();
_dataFuture = MyBloc().fetchData();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('My App')),
body: FutureBuilder<MyData>(
future: _dataFuture,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waitiaing) {
return Center(child: CircularProgressIndicator());
} else if (snapshot.hasError) {
return Center(child: Text('Error: ${snapshot.error}'));
} else {
return Center(child: Text('Data: ${snapshot.data}'));
}
},
),
);
}
}
这些方法可以帮助你在初始化BLoC时处理异步调用。你可以根据自己的需求选择合适的方法。
领取专属 10元无门槛券
手把手带您无忧上云