Flutter - 如何在多个地方重用一些代码

Posted

技术标签:

【中文标题】Flutter - 如何在多个地方重用一些代码【英文标题】:Flutter - How can I reuse some code at multiple places 【发布时间】:2021-01-28 11:15:27 【问题描述】:

您好,我有一个应用程序,我将在其中制作一本书,这本书将带有图像,

我正在尝试重用代码,这意味着如何在一个方法中添加代码,而不是在不同的区域使用该方法,但只更改每个方法中的图像......以使代码更可重用???代码将保持不变,但每个代码块中的图像会改变......我不想一次又一次地复制和粘贴代码。

    import 'dart:ui';
    import 'package:adobe_xd/adobe_xd.dart';
    import 'dart:io';
    import 'package:Quran_highlighter/main.dart';
    import 'package:flutter/rendering.dart';
    import 'package:system_shortcuts/system_shortcuts.dart';
    import 'package:Quran_highlighter/Widgets/NavDrawer.dart';
    import 'package:flutter/material.dart';
    import 'package:zoom_widget/zoom_widget.dart';
    import 'package:flutter/gestures.dart';
    import 'package:Quran_highlighter/Widgets/size_config.dart';
    import 'package:flutter_slidable/flutter_slidable.dart';
    
    class Aliflaammeem extends StatefulWidget 
      @override
      _AliflaammeemState createState() => _AliflaammeemState();
    
    
    class _AliflaammeemState extends State<Aliflaammeem> 
    
      @override
      Widget build(BuildContext context) 
        var screenSizes = MediaQuery.of(context).size;
        return Scaffold(
            appBar: new AppBar(title: new Text("1 Alif-laam-meem آلم, Pg2")),
            // return DefaultTextStyle(
            // style: Theme.of(context).textTheme.bodyText2,
            body: LayoutBuilder(builder:
                (BuildContext context, BoxConstraints viewportConstraints) 
              return SingleChildScrollView(
                  child: Stack(children: <Widget>[
                new Slidable(
                  delegate: new SlidableDrawerDelegate(),
                  actionExtentRatio: 0.10,
                  // body: Center,
                  child: SafeArea(
                    top: true,
                    bottom: true,
                    right: true,
                    left: true,
                    child: new Container(
                      **child: new Image.asset(
                        "test/assets/Para 1 - Alif-laam-meem no color/quranpg2.png",**
                        fit: BoxFit.cover,
                      ),
                    ),
                  ),
                  actions: <Widget>[
                    new IconSlideAction(
                        caption: 'English',
                        // color: Colors.lightBlue,
                        color: Colors.blueGrey,
                        icon: Icons.language,
                        foregroundColor: Colors.lightBlue,
                        // color: Colors.black,
                        // ),
                        onTap: () 
                          Navigator.push(
                            context,
                            MaterialPageRoute(
                                builder: (context) => Changepg2topg3()),
                          );
                        ),
                    new IconSlideAction(
                        caption: 'Forward',
                        // color: Colors.greenAccent,
                        // color: Colors.black87,
                        icon: Icons.arrow_back_ios,
                        foregroundColor: Colors.greenAccent,
                        onTap: () 
                          Navigator.push(
                            context,
                            MaterialPageRoute(
                                builder: (context) => Changepg2topg3()),
                          );
                        ),
                    // ),
                  ],
                  secondaryActions: <Widget>[
                    new IconSlideAction(
                      caption: 'Back',
                      // color: Colors.red[200],
                      icon: Icons.arrow_forward_ios,
                      foregroundColor: Colors.red[200],
                      // color: Colors.black87,
    
                      // onTap: () => _showSnackBar('More'),
                    ),
                    new IconSlideAction(
                      caption: 'Arabic',
                      // color: Colors.yellow[800],
                      icon: Icons.brightness_4,
                      foregroundColor: Colors.yellow[800],
                      color: Colors.blueGrey,
    
                      // onTap: () =>
                    ),
                  ],
                ),
              ]));
            ));
      
    
   //I WANT THE TOP CODE TO BE THE GLOBAL CODE WHICH WILL REUSED AGAIN AND 

AGAIN IN THE SAME CLASS - AND IF I CHANGE SOMETHING UP THERE, I WANT IT TO AUTOMATICALLY CHANGE THROUGHOUT ALL THE PAGES 
    AND BELOW WE HAVE THE SAME CODE WHICH I COPIED AND PASTED - AND JUST CHANGED THE IMAGE AND APPBAR TITLE....  I NEED TO SEE HOW I CAN ACHIEVE THIS WITHOUT COPY AND PASTING....



    class Changepg2topg3 extends StatelessWidget 
      @override
      Widget build(BuildContext context) 
        var screenSizes = MediaQuery.of(context).size;
        return Scaffold(
            appBar: new AppBar(title: new Text("1 Alif-laam-meem آلم, Pg3")),
            // return DefaultTextStyle(
            // style: Theme.of(context).textTheme.bodyText2,
            body: LayoutBuilder(builder:
                (BuildContext context, BoxConstraints viewportConstraints) 
              return SingleChildScrollView(
                  child: Stack(children: <Widget>[
                new Slidable(
                  delegate: new SlidableDrawerDelegate(),
                  actionExtentRatio: 0.10,
                  // body: Center,
                  child: SafeArea(
                    top: true,
                    bottom: true,
                    right: true,
                    left: true,
                    child: new Container(
                      // padding: EdgeInsets.zero,
                      **child: new Image.asset(
                        `"test/assets/Para 1 - Alif-laam-meem no color/quranpg3.png",*`*
                        // fit: BoxFit.fitidth,
                        fit: BoxFit.cover,
                      ),
                    ),
                  ),
                  actions: <Widget>[
                    new IconSlideAction(
                      caption: 'English',
                      color: Colors.lightBlue,
                      icon: Icons.language,
    
                      // onTap: () =>
                    ),
                    new IconSlideAction(
                      caption: 'Forward',
    
                      color: Colors.greenAccent,
                      icon: Icons.arrow_back_ios,
                      // onTap: () => _showSnackBar('Share'),
                    ),
                  ],
                  secondaryActions: <Widget>[
                    new IconSlideAction(
                        caption: 'Back',
                        color: Colors.red[200],
                        icon: Icons.arrow_forward_ios,
                        onTap: () 
                          Navigator.push(
                            context,
                            MaterialPageRoute(builder: (context) => Aliflaammeem()),
                          );
                        ),
                    // ),
                    new IconSlideAction(
                      caption: 'Arabic',
                      color: Colors.yellow[800],
                      icon: Icons.brightness_4,
                      // onTap: () =>
                    ),
                  ],
                ),
              ]));
              // );
            ));
      
    
    
    // 

【问题讨论】:

你想学习状态管理:flutter.dev/docs/development/data-and-backend/state-mgmt/…。我建议从 Provider 开始,然后切换到 Bloc。我在这里解释了如何使用 Provider:***.com/questions/63444318/… 我正在尝试重用代码,这意味着如何在方法中添加代码,而不是在不同区域使用该方法,但只更改每个方法中的图像......以使代码更可重用 这不是“重用”代码的好方法。先看看状态管理,比较一下哪个方案更擅长代码复用。 所以我尝试阅读您的示例,但不确定这是否是我要寻找的...我想编写一次代码 - 作为全局变量并一次又一次地重用它,但只更改图像,将有 846 张图像,我想确保代码和所有按钮都将保持一致。你能告诉我一个与我的例子相关的例子吗?我已将上述内容更改为仅反映我想要重用的代码 我没有真正的例子,但我认为你必须使用 Provider 和 Bloc。只在小部件之间传递数据是不好的。 【参考方案1】:

1.创建一个返回列表的类 2.制作一个New Widget函数并将列表传入该函数

【讨论】:

我对flutter非常陌生,请您详细说明

以上是关于Flutter - 如何在多个地方重用一些代码的主要内容,如果未能解决你的问题,请参考以下文章

SBT:如何在多个任务中重用带有参数的代码?

如何在 Flutter 中重用 Stack 小部件的子级

如何在 Flutter 中创建和使用 SnackBar 进行重用(全局)

Flutter 从 Api 获取 Userinfo 并在任何地方使用。请帮我

在Flutter中,如果我把我的方法放在widget的构建方法里面或外面,有什么区别吗?

Flutter Cubit 如何发出多个状态变化