【Flutter 工程】004-代码生成:functional_widget

【Flutter 工程】004-代码生成:functional_widget

一、概述

1、Flutter 开发痛点

部件代码冗长

class Foo extends StatelessWidget {
  final int value;
  final int value2;

  const Foo({Key key, this.value, this.value2}) : super(key: key);

  
  Widget build(BuildContext context) {
    return Text('$value $value2');
  }
}

使用普通函数可以更好地完成某些事情的代码

Widget foo(BuildContext context, { int value, int value2 }) {
  return Text('$value $value2');
}

但不推荐这么做!因为 Flutter 能够对类组件进行 const 优化,如果使用函数的话会丧失这种优化!

2、functional_widget 函数小部件

写完函数,生成对应的小部件!

functional_widget是一个用于 Flutter 应用程序的第三方包,它提供了一种简化小部件创建的方式,称为函数式小部件(Functional Widgets)。

在传统的Flutter开发中,创建小部件通常需要编写一个继承自StatelessWidgetStatefulWidget的类,并实现其build方法来描述小部件的外观和行为。这种方式需要编写较多的模板代码,尤其是对于简单的小部件而言。

functional_widget包通过引入函数式小部件的概念,提供了一种更简洁和直观的方式来创建小部件。使用函数式小部件,您可以将小部件的外观和行为直接定义在一个函数内部,而无需创建一个独立的类。

使用functional_widget,您可以使用注解来标记函数,使其成为一个函数式小部件。该注解会生成一个相应的小部件类,将函数的实现转换为该类的build方法。这样,您就可以像使用普通小部件一样在您的应用程序中使用函数式小部件。

函数式小部件具有以下优点:

  1. 简洁性:您可以将小部件的实现直接定义在一个函数内部,避免编写独立的类和模板代码。
  2. 可读性:函数式小部件更加直观和紧凑,使得代码更易于阅读和理解。
  3. 可组合性:函数式小部件可以轻松地组合和嵌套,使得构建复杂的用户界面变得更加灵活和便捷。

functional_widget包不仅提供了函数式小部件的注解,还提供了一些其他的辅助函数和工具,用于进一步简化和优化小部件的创建过程。

总的来说,functional_widget是一个实用的工具包,可帮助开发者以一种更加简洁和直观的方式创建Flutter小部件。它提供了函数式小部件的概念,并通过注解和工具简化了小部件的创建和使用过程。使用functional_widget可以提高代码的可读性和可维护性,同时减少样板代码的编写量。

3、主页

https://pub.flutter-io.cn/packages/functional_widget

二、基本使用

1、安装 functional_widget

flutter pub add dev:functional_widget dev:build_runner functional_widget_annotation

2、传统写法

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: const Center(
        child: Text("hello world!", style: TextStyle(fontSize: 40),),
      ),
    );
  }
}

3、运行结果

image-20230526140617497

4、代码改造

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

part 'main.g.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: const Center(
        child: MyText("Hello World"),
      ),
    );
  }
}


Widget myText(String value) {
  return Text(
    value,
    style: const TextStyle(fontSize: 40),
  );
}

5、代码生成

命令

# --delete-conflicting-outputs 可选,会在生成代码冲突的时候,删除原来的代码,重新生成
flutter pub run build_runner build --delete-conflicting-outputs

生成的代码

// GENERATED CODE - DO NOT MODIFY BY HAND

part of 'main.dart';

// **************************************************************************
// FunctionalWidgetGenerator
// **************************************************************************

class MyText extends StatelessWidget {
  const MyText(
    this.value, {
    Key? key,
  }) : super(key: key);

  final String value;

  
  Widget build(BuildContext _context) => myText(value);
}

6、运行结果

image-20230526152125183

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很高兴为您解答问题!关于Flutter实战视频-移动电商-48.详细页_详情和评论的切换,我可以提供以下解答: 在Flutter实战视频-移动电商-48中,详细页的详情和评论的切换是通过一个TabBar实现的。具体来说,通过在AppBar中添加一个TabBar来实现不同页面之间的切换。在这个TabBar中,我们可以添加两个Tab,分别为“详情”和“评论”,并分别对应两个页面。当用户点击不同的Tab时,就可以切换到不同的页面。 在Flutter中,TabBar可以使用DefaultTabController和TabBarView来实现。DefaultTabController是一个Widget,它可以管理TabBar和TabBarView之间的关系。TabBarView则是一个Widget,它可以显示不同的页面。 具体实现方法如下: ```dart class DetailPage extends StatefulWidget { @override _DetailPageState createState() => _DetailPageState(); } class _DetailPageState extends State<DetailPage> { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('商品详情'), bottom: TabBar( tabs: <Widget>[ Tab( text: '详情', ), Tab( text: '评论', ), ], ), ), body: DefaultTabController( length: 2, child: TabBarView( children: <Widget>[ // 详情页面 DetailWidget(), // 评论页面 CommentWidget(), ], ), ), ); } } ``` 在上面的代码中,我们首先创建了一个AppBar,并在其中添加了一个TabBar。然后,在Scaffold的body中,我们创建了一个DefaultTabController,并将其length设为2,即有两个页面。最后,我们在TabBarView中添加了两个Widget,即DetailWidget和CommentWidget,分别对应详情页面和评论页面。 希望这个解答能够对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值