Flutter网页嵌入插件flutter_web_frame的使用

发布于 1周前 作者 yuanlaile 来自 Flutter

Flutter Web Frame 插件的使用

简介

flutter_web_frame 是一个用于在大型设备(如Web或桌面)上设置最大宽度/尺寸的Flutter插件。这非常适合用来限制内容大小,如果你的应用还没有为多个设备/平台提供响应式版本时。

Pub

安装

按照 这里 的说明进行安装。

使用示例

示例代码

以下是一个完整的示例demo,展示了如何使用 flutter_web_frame 插件:

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_web_frame/flutter_web_frame.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return FlutterWebFrame(
      builder: (context) {
        return MaterialApp(
          home: FirstScreen(),
        );
      },
      clipBehavior: Clip.hardEdge,
      maximumSize: Size(475.0, 812.0),
      enabled: kIsWeb,
      backgroundColor: Colors.grey,
    );
  }
}

class FirstScreen extends StatelessWidget {
  const FirstScreen({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Web Frame'),
      ),
      body: Stack(
        children: [
          Positioned(
            child: _buildButton(context),
            left: 0,
            top: 20,
          ),
          Positioned(
            child: _buildButton(context),
            right: 0,
            top: 20,
          ),
          Positioned(
            child: _buildButton(context),
            left: 0,
            bottom: 20,
          ),
          Positioned(
            child: _buildButton(context),
            right: 0,
            bottom: 20,
          ),
          Center(child: _buildButton(context)),
        ],
      ),
    );
  }

  Widget _buildButton(BuildContext context) {
    return ElevatedButton.icon(
      onPressed: () {
        Navigator.of(context).push(
          MaterialPageRoute(
            builder: (_) => SomeScreen(number: 1),
          ),
        );
      },
      icon: Icon(Icons.next_plan),
      label: Text('Next Page'),
    );
  }
}

class SomeScreen extends StatelessWidget {
  const SomeScreen({Key? key, required this.number}) : super(key: key);

  final int number;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Screen $number'),
      ),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          ElevatedButton(
            onPressed: () {
              Navigator.of(context).pop();
            },
            child: Text('Back'),
          ),
          SizedBox(height: 20, width: double.infinity),
          ElevatedButton(
            onPressed: () {
              Navigator.of(context).push(
                MaterialPageRoute(
                  builder: (_) => SomeScreen(number: number + 1),
                ),
              );
            },
            child: Text('Next To Screen ${number + 1}'),
          ),
          SizedBox(height: 20, width: double.infinity),
          TextField(
            decoration: InputDecoration(hintText: 'Input some text'),
          ),
        ],
      ),
    );
  }
}

代码解释

  • 导入必要的包:首先导入了 flutter_web_frame 和其他必要的Flutter包。
  • 主函数main() 函数启动应用,并运行 MyApp 小部件。
  • MyApp 类:这是应用的根小部件,使用 FlutterWebFrame 包裹了一个 MaterialAppFlutterWebFrame 设置了最大尺寸、是否启用以及背景颜色等属性。
  • FirstScreen 类:定义了第一个屏幕的内容,包括一个带有按钮的 Scaffold。按钮点击后会导航到下一个页面。
  • SomeScreen 类:表示后续页面,包含返回按钮、前往下一页的按钮和一个文本输入框。

通过这个示例,你可以看到如何在大型设备上限制应用的内容区域大小,并保持良好的用户体验。希望这个示例能帮助你更好地理解和使用 flutter_web_frame 插件!


更多关于Flutter网页嵌入插件flutter_web_frame的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter网页嵌入插件flutter_web_frame的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter应用中使用flutter_web_view插件(注意:当前主流且广泛使用的插件是webview_flutter,但原理相似,如果你特定指的是flutter_web_frame,可能是一个较旧或者特定用途的插件,但以下示例将基于webview_flutter进行说明,因为flutter_web_frame在官方和常见社区资源中较少提及)来嵌入网页的示例代码。

首先,确保你的Flutter项目已经创建,并且你已经添加了webview_flutter插件到你的pubspec.yaml文件中:

dependencies:
  flutter:
    sdk: flutter
  webview_flutter: ^2.0.0  # 请检查最新版本号

然后,运行flutter pub get来安装依赖。

接下来,在你的Flutter项目中创建一个新的Dart文件(例如webview_screen.dart),并添加以下代码来展示WebView:

import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';

class WebViewScreen extends StatefulWidget {
  @override
  _WebViewScreenState createState() => _WebViewScreenState();
}

class _WebViewScreenState extends State<WebViewScreen> {
  late WebViewController _controller;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('WebView Example'),
      ),
      body: WebView(
        initialUrl: 'https://www.example.com',  // 替换为你想要加载的URL
        javascriptMode: JavascriptMode.UNRESTRICTED, // 允许JavaScript执行
        onWebViewCreated: (WebViewController webViewController) {
          _controller = webViewController;

          // 示例:在页面加载完成后执行一些JavaScript代码
          _controller.evaluateJavascript('document.title').then((title) {
            print("Page title is $title");
          });
        },
        onPageFinished: (String url) {
          print("Page finished loading: $url");
        },
        navigationDelegate: (NavigationRequest request) {
          if (request.url.startsWith("https://www.example.com/")) {
            return NavigationDecision.navigate;
          } else if (request.isForMainFrame) {
            // 对于不在允许范围内的URL,可以选择阻止导航
            return NavigationDecision.prevent;
          }
          return NavigationDecision.navigate;
        },
      ),
    );
  }
}

最后,在你的主文件(例如main.dart)中,将这个新的WebView屏幕添加到路由中:

import 'package:flutter/material.dart';
import 'webview_screen.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter WebView Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: WebViewScreen(),
    );
  }
}

这个示例展示了如何使用webview_flutter插件在Flutter应用中嵌入一个WebView,并处理了一些基本的WebView事件,如页面加载完成和JavaScript执行。如果你确实需要flutter_web_frame的具体代码,可能需要查找该插件的官方文档或GitHub仓库,因为非主流或特定用途的插件可能需要不同的使用方法。不过,上述示例对于大多数WebView嵌入需求是通用的。

回到顶部