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), // 按钮图标
),
);
}
}
更多关于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),
),
);
}
}