Я использую BLOC для извлечения фильма из API.Я могу получить доступ к блоку внутри виджета StreamBuilder , но у меня также есть кнопка поделиться на AppBar , для которой требуется фильм .slug , чтобы показать параметры обмена.Но так как AppBar находится вне StreamBuilder, я не могу поделиться ссылкой.Есть ли способ, которым AppBar может получить доступ к StreamBuilder Снимок ?
Это код страницы:
import 'package:cinemax_app/src/blocs/movie_bloc.dart';
import 'package:cinemax_app/src/components/movie/movie_header.dart';
import 'package:cinemax_app/src/models/movie.dart';
import 'package:flutter/material.dart';
import 'package:share/share.dart';
import 'package:flutter_widget_from_html_core/flutter_widget_from_html_core.dart';
class MoviePage extends StatefulWidget {
final int movieId;
MoviePage({ this.movieId });
@override
_MoviePageState createState() => _MoviePageState();
}
class _MoviePageState extends State<MoviePage> {
MovieModel _movie;
@override
Widget build(BuildContext context) {
movieBloc.fetchMovie(widget.movieId);
return Scaffold(
body: SafeArea(
child: Stack(
children: <Widget>[
StreamBuilder(
stream: movieBloc.movie,
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.hasData) {
_movie = snapshot.data as MovieModel;
return ListView(
children: <Widget>[
MovieHeader(movie: _movie),
Container(
padding: EdgeInsets.only(top: 45, bottom: 15, left: 15, right: 15),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text('Sinopse:', style: Theme.of(context).textTheme.title),
HtmlWidget(
_movie.sinopsis,
bodyPadding: EdgeInsets.only(top: 15),
textStyle: TextStyle(color: Colors.grey),
)
],
),
)
]
);
}
return Center(child: CircularProgressIndicator());
},
),
AppBar(
backgroundColor: Colors.transparent,
elevation: 0.0,
actions: <Widget>[
PopupMenuButton(
icon: Icon(Icons.more_vert),
itemBuilder: (BuildContext context) {
return <PopupMenuItem>[
PopupMenuItem(
child: GestureDetector(
child: Text('Partilhar'),
onTap: () {
final movieSLug = _movie.slug;
// prints: 'https://cinema.com/movie/null';
final movieAddress = 'https://cinema.com/movie/${movieSLug}';
Share.share(movieAddress);
},
),
)
];
},
)
],
),
]
),
),
);
}
}
Что я делаю не так?