在Flutter中,我们可以使用InheritedWidget
来避免多个Widget实例共享Bloc状态。下面是一个示例代码:
import 'package:flutter/material.dart';
// 创建一个Bloc类
class CounterBloc {
int _counter = 0;
void increment() {
_counter++;
}
int get counter => _counter;
}
// 创建一个InheritedWidget
class CounterBlocProvider extends InheritedWidget {
final CounterBloc bloc;
CounterBlocProvider({Key key, Widget child, this.bloc})
: super(key: key, child: child);
@override
bool updateShouldNotify(CounterBlocProvider oldWidget) {
// 当前只有bloc变化时才通知更新
return bloc != oldWidget.bloc;
}
static CounterBlocProvider of(BuildContext context) {
return context.dependOnInheritedWidgetOfExactType();
}
}
// 创建一个Counter的Widget
class Counter extends StatelessWidget {
@override
Widget build(BuildContext context) {
// 通过CounterBlocProvider.of(context)来获取CounterBloc的实例
final CounterBloc bloc = CounterBlocProvider.of(context).bloc;
return Column(
children: [
Text('Counter: ${bloc.counter}'),
RaisedButton(
child: Text('Increment'),
onPressed: () {
// 调用Bloc的increment方法来增加计数器
bloc.increment();
},
),
],
);
}
}
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
// 创建CounterBloc的实例
final CounterBloc bloc = CounterBloc();
return CounterBlocProvider(
bloc: bloc,
child: MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
appBar: AppBar(
title: Text('Bloc Example'),
),
body: Center(
child: Counter(),
),
),
),
);
}
}
在这个示例中,我们创建了一个CounterBloc
类来管理计数器的状态。然后,我们创建了一个CounterBlocProvider
继承自InheritedWidget
,并将CounterBloc
实例作为参数传递给它。
在Counter
Widget中,我们通过CounterBlocProvider.of(context)
来获取CounterBloc
实例,并在需要使用计数器的地方调用bloc.increment()
方法来增加计数器。
在main
函数中,我们创建了CounterBloc
实例,并将它作为参数传递给CounterBlocProvider
。然后,我们使用CounterBlocProvider
作为根Widget来构建我们的应用程序。
通过这种方式,我们可以确保在整个Widget树中,所有的Counter
Widget都共享同一个CounterBloc
实例,从而正确地管理和共享状态。