Flutter自定义Widget展示插件widget_view的使用

Widget View 介绍

一个支持在Widget中分离逻辑和视图的Dart包。


这个包的原始想法

Flutter: WidgetView - A Simple Separation of Layout and Logic - gskinner blog


插件widget_view的使用方法

以下是一个使用StatefulWidgetView的计数器示例:

// 主页面类
class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;

  // 创建控制器实例
  [@override](/user/override)
  _MyHomePageController createState() => _MyHomePageController();
}

// 控制器类,用于管理状态和逻辑
class _MyHomePageController extends State<MyHomePage> {
  int counter = 0;

  // 增加计数器的方法
  void incrementCounter() {
    setState(() {
      counter++;
    });
  }

  // 返回视图类
  [@override](/user/override)
  Widget build(BuildContext context) => _MyHomePageView(this);
}

// 视图类,负责UI布局
class _MyHomePageView
    extends StatefulWidgetView<MyHomePage, _MyHomePageController> {
  const _MyHomePageView(_MyHomePageController controller, {Key key})
      : super(controller, key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title), // 显示标题
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center, // 居中对齐
          children: <Widget>[
            Text('你已经按下了按钮次数:'), // 提示文字
            Text('${controller.counter}', // 显示当前计数值
                style: Theme.of(context).textTheme.headline4),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: controller.incrementCounter, // 绑定增加计数器的方法
        tooltip: '增加', // 工具提示
        child: Icon(Icons.add), // 按钮图标
      ),
    );
  }
}

Live Templates for IntelliJ IDEs (如 Android Studio 等)

请参阅 intelij_live_templates.md


Snippets for Visual Studio Code

暂未提供。欢迎提交您的 Pull Request。


特性和问题

请在 GitHub Issue Tracker 中提交功能请求或报告问题。


完整示例代码

以下是完整的示例代码,包括 main.dart 文件:

import 'package:flutter/material.dart';
import 'package:widget_view/widget_view.dart'; // 导入 widget_view 包

void main() {
  runApp(MyApp()); // 启动应用
}

// 应用主类
class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'package:widget_view Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'package:widget_view Demo Home Page'), // 设置首页
    );
  }
}

// 主页面类
class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;

  [@override](/user/override)
  _MyHomePageController createState() => _MyHomePageController(); // 创建控制器
}

// 控制器类,管理状态和逻辑
class _MyHomePageController extends State<MyHomePage> {
  int counter = 0;

  void incrementCounter() {
    setState(() {
      counter++; // 更新计数器
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) => _MyHomePageView(this); // 返回视图类
}

// 视图类,负责 UI 布局
class _MyHomePageView
    extends StatefulWidgetView<MyHomePage, _MyHomePageController> {
  const _MyHomePageView(_MyHomePageController controller, {Key key})
      : super(controller, key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title), // 显示标题
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center, // 居中对齐
          children: <Widget>[
            Text('你已经按下了按钮次数:'), // 提示文字
            Text('${controller.counter}', // 显示当前计数值
                style: Theme.of(context).textTheme.headline4),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: controller.incrementCounter, // 绑定增加计数器的方法
        tooltip: '增加', // 工具提示
        child: Icon(Icons.add), // 按钮图标
      ),
    );
  }
}
1 回复

更多关于Flutter自定义Widget展示插件widget_view的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


widget_view 是一个用于在 Flutter 中展示自定义 Widget 的插件。它允许你将一个 Widget 作为参数传递给另一个 Widget,并在需要的地方进行展示。这个插件非常适合在需要动态展示不同 Widget 的场景中使用。

安装 widget_view 插件

首先,你需要在 pubspec.yaml 文件中添加 widget_view 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  widget_view: ^1.0.0  # 请使用最新版本

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

使用 widget_view 插件

widget_view 插件的核心是 WidgetView 类。你可以通过将自定义的 Widget 传递给 WidgetView 来展示它。

基本用法

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('WidgetView Example'),
        ),
        body: Center(
          child: WidgetView(
            child: MyCustomWidget(),
          ),
        ),
      ),
    );
  }
}

class MyCustomWidget extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Container(
      padding: EdgeInsets.all(20),
      color: Colors.blue,
      child: Text(
        'Hello, WidgetView!',
        style: TextStyle(color: Colors.white, fontSize: 24),
      ),
    );
  }
}

在这个例子中,MyCustomWidget 是一个自定义的 Widget,我们通过 WidgetView 将其展示在屏幕中央。

动态展示不同的 Widget

WidgetView 也可以用于动态展示不同的 Widget。例如,你可以根据某些条件来展示不同的 Widget:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('WidgetView Example'),
        ),
        body: Center(
          child: MyDynamicWidget(),
        ),
      ),
    );
  }
}

class MyDynamicWidget extends StatefulWidget {
  [@override](/user/override)
  _MyDynamicWidgetState createState() => _MyDynamicWidgetState();
}

class _MyDynamicWidgetState extends State<MyDynamicWidget> {
  bool _showFirstWidget = true;

  void _toggleWidget() {
    setState(() {
      _showFirstWidget = !_showFirstWidget;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        WidgetView(
          child: _showFirstWidget ? MyCustomWidget1() : MyCustomWidget2(),
        ),
        SizedBox(height: 20),
        ElevatedButton(
          onPressed: _toggleWidget,
          child: Text('Toggle Widget'),
        ),
      ],
    );
  }
}

class MyCustomWidget1 extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Container(
      padding: EdgeInsets.all(20),
      color: Colors.blue,
      child: Text(
        'Widget 1',
        style: TextStyle(color: Colors.white, fontSize: 24),
      ),
    );
  }
}

class MyCustomWidget2 extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Container(
      padding: EdgeInsets.all(20),
      color: Colors.green,
      child: Text(
        'Widget 2',
        style: TextStyle(color: Colors.white, fontSize: 24),
      ),
    );
  }
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!