bloc_provider.dart
import 'package:flutter/material.dart';
import 'package:bloc_demo/rxdart/blocs/count_bloc.dart';
class BlocProvider extends InheritedWidget {
final CountBLoC bLoC = CountBLoC();
BlocProvider({Key key, Widget child}) : super(key: key, child: child);
@override
bool updateShouldNotify(_) => true;
static CountBLoC of(BuildContext context) =>
(context.inheritFromWidgetOfExactType(BlocProvider) as BlocProvider).bLoC;
}
count_bloc.dart
import 'package:rxdart/rxdart.dart';
import 'dart:async';
class CountBLoC {
int _count = 0;
var _subject = BehaviorSubject<int>();
Stream<int> get stream => _subject.stream;
int get value => _count;
void increment() => _subject.add(++_count);
void dispose() {
_subject.close();
}
}
top_page.dart
import 'package:flutter/material.dart';
import 'package:bloc_demo/rxdart/blocs/bloc_provider.dart';
import 'under_page.dart';
class TopPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
final bloc = BlocProvider.of(context);
return Scaffold(
appBar: AppBar(
title: Text('Top Page'),
),
body: Center(
child: StreamBuilder<int>(
stream: bloc.stream,
initialData: bloc.value,
builder: (BuildContext context, AsyncSnapshot<int> snapshot) {
return Text(
'You hit me: ${snapshot.data} times',
style: Theme.of(context).textTheme.display1,
);
}),
),
floatingActionButton: FloatingActionButton(
child: Icon(Icons.navigate_next),
onPressed: () =>
Navigator.of(context).push(MaterialPageRoute(builder: (context) => UnderPage()))),
);
}
}
under_page.dart
import 'package:flutter/material.dart';
import 'package:bloc_demo/rxdart/blocs/bloc_provider.dart';
class UnderPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
final bloc = BlocProvider.of(context);
return Scaffold(
appBar: AppBar(
title: Text('Under Page'),
),
body: Center(
child: StreamBuilder(
stream: bloc.stream,
initialData: bloc.value,
builder: (context, snapshot) => Text(
"You hit me: ${snapshot.data} times",
style: Theme.of(context).textTheme.display1,
)),
),
floatingActionButton: FloatingActionButton(
onPressed: () => bloc.increment(),
child: Icon(Icons.add),
),
);
}
}
最后,最重要的,入口处:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocProvider(
child: MaterialApp(
title: 'scoped',
theme: ThemeData.dark(),
home: TopPage(),
),
);
}
}