KS
Size: a a a
KS
🅵
🅵
🅵
KS
🅵
KS
🅵
🅵
import 'dart:async';
import 'dart:math' show Random;
typedef Future Handler();
void main() async {
// Объявляю контроллер для проброса результатов
final StreamController<dynamic> _resultController = StreamController<dynamic>.broadcast();
final Stream<dynamic> _handlerResultStream = _resultController.stream;
// Виджеты "слущающие" контроллер результатов
widget1(_handlerResultStream);
widget2(_handlerResultStream);
// Моя функция - хэндлер
Handler handler = () =>
Future.delayed(const Duration(seconds: 1))
.then((_) => Random().nextInt(1024));
// Гдето получаю результат хэндлера и добавляю в контроллер
handler().then(_resultController.add);
// dispose (При закрытии)
await Future.delayed(const Duration(seconds: 5));
_resultController.close();
}
void widget1(Stream<dynamic> _handlerResultStream) {
_handlerResultStream.forEach((dynamic result) => print('Widget #1: $result'));
}
void widget2(Stream<dynamic> _handlerResultStream) {
_handlerResultStream.forEach((dynamic result) => print('Widget #2: $result'));
}🅵
🅵
KS
AP
AP
VV
class ListPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return DefaultTabController(
length: 1,
child: NestedScrollView(
headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
return <Widget>[
SliverOverlapAbsorber(
handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),
sliver: SliverAppBar(title: Text("Items List")),
),
];
},
body: TabBarView(children: [
SafeArea(
top: false,
bottom: false,
child: Builder(
builder: (BuildContext context) {
return CustomScrollView(
key: PageStorageKey<String>('_'),
slivers: <Widget>[
SliverOverlapInjector(
handle: NestedScrollView.sliverOverlapAbsorberHandleFor(
context),
),
SliverFixedExtentList(
itemExtent: 48.0,
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return ListTile(
title: Text("item #$index"),
onTap: () => Navigator.pushNamed(
context, "/details",
arguments: index),
);
},
childCount: 55,
),
)
],
);
},
),
)
]),
),
);
}
}AP
class ListPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return DefaultTabController(
length: 1,
child: NestedScrollView(
headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
return <Widget>[
SliverOverlapAbsorber(
handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),
sliver: SliverAppBar(title: Text("Items List")),
),
];
},
body: TabBarView(children: [
SafeArea(
top: false,
bottom: false,
child: Builder(
builder: (BuildContext context) {
return CustomScrollView(
key: PageStorageKey<String>('_'),
slivers: <Widget>[
SliverOverlapInjector(
handle: NestedScrollView.sliverOverlapAbsorberHandleFor(
context),
),
SliverFixedExtentList(
itemExtent: 48.0,
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return ListTile(
title: Text("item #$index"),
onTap: () => Navigator.pushNamed(
context, "/details",
arguments: index),
);
},
childCount: 55,
),
)
],
);
},
),
)
]),
),
);
}
}M
M
AP