Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import 'dart:io';
- import 'dart:async';
- import 'package:flutter/material.dart';
- import 'package:flutter_user_agent/flutter_user_agent.dart';
- import 'package:webview_flutter/webview_flutter.dart';
- import 'package:http/http.dart' as http;
- //import 'package:share/share.dart';
- void main() => runApp(MaterialApp(home: ForumsScreen()));
- class ForumsScreen extends StatefulWidget {
- @override
- State<StatefulWidget> createState() => ForumsScreenState();
- }
- class ForumsScreenState extends State<ForumsScreen> {
- final _bloc = ForumsBloc();
- Completer<WebViewController> _controller = Completer<WebViewController>();
- // todo: try passing data using an inherited widget-
- @override
- Widget build(BuildContext context) {
- return StreamBuilder<bool>(
- stream: _bloc.loadingStream,
- initialData: true,
- builder: (context, snapshot) {
- return Scaffold(
- appBar: AppBar(
- title: Text("Forums"),
- actions: <Widget>[
- RefreshButton(snapshot.data),
- SharePostButton(_controller, snapshot.data),
- ],
- ),
- body: ForumsWebView(_bloc),
- );
- });
- }
- }
- class ForumsWebView extends StatefulWidget {
- final ForumsBloc _bloc;
- ForumsWebView(this._bloc);
- @override
- _ForumsWebViewState createState() => _ForumsWebViewState();
- }
- class _ForumsWebViewState extends State<ForumsWebView> {
- Completer<WebViewController> _controller = Completer<WebViewController>();
- String _webViewUserAgent;
- // todo: potentially remove
- @override
- void initState() {
- super.initState();
- getDefaultUserAgent();
- }
- @override
- Widget build(BuildContext context) {
- return WebView(
- initialUrl: 'http://forums.redflagdeals.com',
- onWebViewCreated: (WebViewController webViewController) {
- _controller.complete(webViewController);
- },
- onPageFinished: (String string) {
- widget._bloc.forumsEventSink.add(LoadingEvent());
- final snackBar = SnackBar(
- content: Text(_getNewUserAgent(_webViewUserAgent)),
- duration: Duration(seconds: 2),
- );
- Scaffold.of(context).showSnackBar(snackBar);
- },
- navigationDelegate: (NavigationRequest request) {
- return NavigationDecision.navigate;
- },
- );
- }
- Future<void> getDefaultUserAgent() async {
- String webViewUserAgent;
- try {
- await FlutterUserAgent.init();
- webViewUserAgent = FlutterUserAgent.webViewUserAgent;
- } catch (Exception) {
- webViewUserAgent = '<error>';
- }
- if (!mounted) return;
- setState(() {
- _webViewUserAgent = webViewUserAgent;
- });
- }
- // todo user agent into variables
- // todo format by locale
- String _getNewUserAgent(String oldUserAgent) {
- return oldUserAgent.replaceFirst(
- RegExp(r'^[^(]*'), "RedFlagDealsApp/3.13.9 ");
- }
- }
- class RefreshButton extends StatefulWidget {
- final bool _loading;
- RefreshButton(this._loading);
- @override
- State<StatefulWidget> createState() => RefreshButtonState();
- }
- class RefreshButtonState extends State<RefreshButton> {
- @override
- Widget build(BuildContext context) {
- return IconButton(
- icon: Icon(
- Icons.refresh,
- color: widget._loading ? Theme.of(context).disabledColor : Colors.white,
- ),
- onPressed: () {
- _refreshPost();
- },
- );
- }
- _refreshPost() {
- // TODO
- }
- }
- class SharePostButton extends StatefulWidget {
- final Completer<WebViewController> controller;
- final bool _loading;
- SharePostButton(this.controller, this._loading);
- @override
- State<StatefulWidget> createState() => SharePostButtonState();
- }
- class SharePostButtonState extends State<SharePostButton> {
- @override
- Widget build(BuildContext context) {
- return IconButton(
- icon: Icon(Icons.share,
- color: widget._loading
- ? Theme
- .of(context)
- .disabledColor
- : Colors.white),
- onPressed: () {
- _sharePost();
- });
- }
- void _sharePost() {}
- }
- //BLOC Pattern components, move out eventually
- abstract class ForumsEvent {}
- class LoadingEvent extends ForumsEvent {}
- class ForumsBloc {
- // too many loading variables??
- bool _loading = true;
- final _loadingStateController = StreamController<bool>();
- StreamSink<bool> get _loadingSink => _loadingStateController.sink;
- Stream<bool> get loadingStream => _loadingStateController.stream;
- // input events
- final _forumsEventController = StreamController<ForumsEvent>();
- Sink<ForumsEvent> get forumsEventSink => _forumsEventController.sink;
- ForumsBloc() {
- _forumsEventController.stream.listen(_mapEventToState);
- }
- void _mapEventToState(ForumsEvent event) {
- if (event is LoadingEvent) {
- _mapLoadEventToState(event);
- }
- }
- void _mapLoadEventToState(LoadingEvent event) {
- _loading = !_loading;
- _loadingSink.add(_loading);
- }
- void dispose() {
- _loadingStateController.close();
- _forumsEventController.close();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement