Как я могу распоряжаться Flutter WebviewScaffold при смене экрана? - PullRequest
0 голосов
/ 06 января 2019

У меня есть главный экран, который показывает изображение заголовка с кнопкой для перехода ко второму экрану, а также веб-представление (скаффолд) в контейнере под ним. Когда я переключаюсь на второй экран, веб-просмотр все еще там. Это похоже на проблему, подобную этой ( Flutter: закрыть веб-просмотр, когда вы покинули страницу ), но я не могу понять, как реализовать событие dispose. Кто-нибудь может помочь? Я использую пакет flutter_webview_plugin. Вот мой код:

import 'package:flutter/material.dart';

import 'package:flutter_webview_plugin/flutter_webview_plugin.dart';

import 'dart:async';

import './SecondScreen.dart';

String selectedUrl = 'https://flutter.io';

void main() {
  runApp(new MyApp());
}

class MyApp extends StatelessWidget {
  final flutterWebViewPlugin = FlutterWebviewPlugin();

  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Generated App',
      theme: new ThemeData(
        primarySwatch: Colors.purple,
        primaryColor: const Color(0xFF8e80a8),
        accentColor: const Color(0xFF8e80a8),
        canvasColor: const Color(0xFF8e80a8),
      ),
      home: new MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key}) : super(key: key);

  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {


  @override
  Widget build(BuildContext context) {
    return Container(
      decoration: BoxDecoration(color: Color(0xFF8e80a8)),
      child: new Column(
          mainAxisAlignment: MainAxisAlignment.start,
          mainAxisSize: MainAxisSize.min,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: <Widget>[
            Padding(
              padding: const EdgeInsets.fromLTRB(10, 30, 10, 5),
              child: new Image.asset(
                'lib/assets/newoldralogo1.png',
              ),
            ),
            Container(
              constraints: BoxConstraints.expand(
                height:
                    Theme.of(context).textTheme.display1.fontSize * 1.1 + 10.0,
              ),
              child: new Stack(fit: StackFit.expand,
                  children: <Widget>[
                Container(
                  decoration: BoxDecoration(color: Color(0xFF8e80a8)),
                  child: Padding(
                    padding: const EdgeInsets.fromLTRB(10, 10, 10, 10),
                    child: Image.asset(
                      "lib/assets/newoldralogo1.png",
                      alignment: Alignment.topCenter,
                      fit: BoxFit.fitWidth,
                    ),
                  ),
                ),
                Container(
                  child: RaisedButton(
                    onPressed: () {
                      Navigator.push(
                        context,
                        MaterialPageRoute(builder: (context) => SecondScreen()),
                      );
                    },
                    color: Color(0xFFFFFF),
                  ),
                ),
              ]),
            ),

            Container(
              constraints: BoxConstraints.expand(
                height:
                    Theme.of(context).textTheme.display1.fontSize * 1.1 + 300.0,
              ),
              padding: const EdgeInsets.fromLTRB(10, 15, 10, 5),
              color: Color(0xFF8e80a8),
              alignment: Alignment.center,
              child: Container(
                child: WebviewScaffold(
                  url:
                      ('https://flutter.io/'),
                ),
              ),
            )
          ]),
    );
  }
}

/*
@override
void dispose() {
  super.dispose();
  _MyHomePageState();

}
*/

1 Ответ

0 голосов
/ 08 января 2019

Решение состоит в том, чтобы изменить «Navigator.push» на «Navigator.pushRemove». Это будет означать, что первый экран не появится, поэтому нажатие кнопки «Назад» (по крайней мере на устройстве Android) приведет к выходу из приложения. Это не совсем то, что я пытался сделать, но пока буду работать.

Если бы кто-нибудь мог показать мне, куда положить вещь "распоряжаться", я все равно хотел бы знать! В то же время, я просто буду продолжать. Спасибо тем, кто поделился таким большим количеством полезной информации в Интернете!

Кстати, вот новый код, немного подправленный:

import 'package:flutter/material.dart';
import 'package:flutter_webview_plugin/flutter_webview_plugin.dart';
import './SecondScreen.dart';

class WebView extends StatefulWidget {
  @override
  _WebViewState createState() => _WebViewState();
}

class _WebViewState extends State<WebView> {
  TextEditingController controller = TextEditingController();
  FlutterWebviewPlugin flutterWebviewPlugin = FlutterWebviewPlugin();
  var urlString =
      "https://stackoverflow.com/questions/43692923/flutter-container-onpressed";

  launchUrl() {
    setState(() {
      urlString = controller.text;
      flutterWebviewPlugin.reloadUrl(urlString);
    });
  }

  @override
  void initState() {
    super.initState();
    flutterWebviewPlugin.onStateChanged.listen((WebViewStateChanged wvs) {
      print(wvs.type);
    });
  }

  //this part isn't working
  @override
  void dispose() {
    _WebViewState();
    // close the webview here
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      decoration: BoxDecoration(color: Color(0xFF8e80a8)),
      child: Column(
        mainAxisAlignment: MainAxisAlignment.start,
        mainAxisSize: MainAxisSize.min,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: <Widget>[
          new GestureDetector(
            onTap: () {
              Navigator.pushReplacement(
                context,
                MaterialPageRoute(builder: (context) => SecondScreen()),
              );
            },
            child: Padding(
              padding: const EdgeInsets.fromLTRB(10, 40, 10, 10),
              child: new Container(
                  constraints: BoxConstraints.expand(
                    height: Theme.of(context).textTheme.display1.fontSize * 1.1 +
                        40.0,
                  ),
                  child: new Image.asset(
                    'lib/assets/newoldralogo1menubutton3.png',
                    alignment: Alignment.topCenter,
                    fit: BoxFit.fitWidth,
                  )),
            ),
          ),
          Padding(
            padding: const EdgeInsets.all(10.0),
            child: Container(
              constraints: BoxConstraints.expand(
                height: Theme.of(context).textTheme.display1.fontSize * 1.1 + 250.0,
              ),
              child: WebviewScaffold(
                url: urlString,
                withZoom: false,
              ),
            ),
          ),
        ],
      ),
    );
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...