পুনরায় ব্যবহারযোগ্য উইজেট তৈরি করতে ফাংশন এবং শ্রেণীর মধ্যে পার্থক্য কী?


125

আমি বুঝতে পেরেছি যে স্টেটলেস উইজেট সাবক্লাসিংয়ের পরিবর্তে প্লেইন ফাংশন ব্যবহার করে উইজেট তৈরি করা সম্ভব । একটি উদাহরণ এটি হবে:

Widget function({ String title, VoidCallback callback }) {
  return GestureDetector(
    onTap: callback,
    child: // some widget
  );
}

এটি আকর্ষণীয় কারণ এটির জন্য পূর্ণ বিকাশের শ্রেণীর চেয়ে অনেক কম কোড দরকার requires উদাহরণ:

class SomeWidget extends StatelessWidget {
  final VoidCallback callback;
  final String title;

  const SomeWidget({Key key, this.callback, this.title}) : super(key: key);

  @override
  Widget build(BuildContext context) {
      return GestureDetector(
        onTap: callback,
        child: // some widget
      );
  }
}

সুতরাং আমি ভাবছিলাম: উইজেট তৈরির জন্য ফাংশন এবং ক্লাসগুলির মধ্যে সিনট্যাক্স ছাড়াও কি কোনও পার্থক্য রয়েছে? এবং ফাংশন ব্যবহার করা কি একটি ভাল অনুশীলন?


বিষয়টি আমার বোঝার জন্য এই থ্রেডটি খুব দরকারী বলে মনে করেছি। reddit.com/r/FlutterDev/comments/avhvco/…
রকেটআর

উত্তর:


171

টিএল; ডিআর: পুনরায় ব্যবহারযোগ্য উইজেট-ট্রি তৈরির জন্য ফাংশনগুলির উপর ক্লাস ব্যবহারকে পছন্দ করুন ।


সম্পাদনা : কিছু ভুল বোঝাবুঝির সমাধান করতে: এটি সমস্যাগুলি সৃষ্টিকারী কার্যাবলী সম্পর্কে নয়, কিছু শ্রেণি সমাধান করছে।

কোনও ফাংশন একই জিনিস করতে পারলে তোড়জোড়ের স্টেটলেস উইজেট থাকত না ।

একইভাবে, এটি প্রধানত সার্বজনীন উইজেটগুলিতে পুনরায় ব্যবহারের জন্য পরিচালিত। শুধুমাত্র একবার ব্যবহার করার জন্য ব্যক্তিগত ফাংশনগুলির জন্য এটি এতটা গুরুত্বপূর্ণ নয় - যদিও এই আচরণ সম্পর্কে সচেতন হওয়া এখনও ভাল।


ক্লাসের পরিবর্তে ফাংশন ব্যবহারের মধ্যে একটি গুরুত্বপূর্ণ পার্থক্য রয়েছে, তা হল: কাঠামোটি ফাংশন সম্পর্কে অজানা, তবে ক্লাসগুলি দেখতে পারে।

নিম্নলিখিত "উইজেট" ফাংশনটি বিবেচনা করুন:

Widget functionWidget({ Widget child}) {
  return Container(child: child);
}

এইভাবে ব্যবহৃত:

functionWidget(
  child: functionWidget(),
);

এবং এটি শ্রেণীর সমতুল্য:

class ClassWidget extends StatelessWidget {
  final Widget child;

  const ClassWidget({Key key, this.child}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      child: child,
    );
  }
}

এর মতো ব্যবহৃত:

new ClassWidget(
  child: new ClassWidget(),
);

কাগজে, উভয়ই ঠিক একই জিনিসটি করছে বলে মনে হচ্ছে: একটি তৈরি করে Containerঅন্যটির সাথে 2 তৈরি করুন । তবে বাস্তবতা কিছুটা আলাদা।

ফাংশনগুলির ক্ষেত্রে, উত্পন্ন উইজেট গাছটি দেখতে এরকম দেখাচ্ছে:

Container
  Container

ক্লাস সহ, উইজেট গাছটি হ'ল:

ClassWidget
  Container
    ClassWidget
      Container

এটি গুরুত্বপূর্ণ কারণ এটি উইজেট আপডেট করার সময় ফ্রেমওয়ার্কটি কেমন আচরণ করে তা পরিবর্তন করে।

কেন এটি গুরুত্বপূর্ণ

আপনার উইজেট গাছটিকে একাধিক উইজেটে বিভক্ত করার জন্য ফাংশনগুলি ব্যবহার করে আপনি নিজেকে বাগের সামনে তুলে ধরেন এবং কিছু কার্য সম্পাদন অপ্টিমাইজেশন মিস করেন।

যে কোন গ্যারান্টি তুমি হবে ফাংশন ব্যবহার করে, কিন্তু শ্রেণীর ব্যবহার করার মাধ্যমে, আপনি হয় দ্বারা বাগ আছে নিশ্চিত এই বিষয়গুলো মুখোমুখি না।

এখানে ডার্টপ্যাডের কয়েকটি ইন্টারেক্টিভ উদাহরণ রয়েছে যা আপনি সমস্যাগুলি আরও ভালভাবে বোঝার জন্য চালাতে পারেন:

  • https://dartpad.dev/1870e726d7e04699bc8f9d78ba71da35
    এই উদাহরণটি কীভাবে আপনার অ্যাপ্লিকেশনকে ফাংশনগুলিতে বিভক্ত করে দেখায় যে আপনি দুর্ঘটনাক্রমে জিনিসগুলি ভেঙে ফেলতে পারেনAnimatedSwitcher

  • https://dartpad.dev/a869b21a2ebd2466b876a5997c9cf3f1
    এই উদাহরণটি দেখায় যে ক্লাসগুলি কীভাবে উইজেট গাছের আরও দানাদার পুনর্নির্মাণের অনুমতি দেয়, পারফরম্যান্সকে উন্নত করে

  • https://dartpad.dev/06842ae9e4b82fad917acb88da108eee
    উদাহরণ উদাহরণস্বরূপ, ফাংশনগুলি ব্যবহার করে, আপনি কীভাবে বিল্ডকন্টেক্সটকে অপব্যবহার করতে এবং বাগের মুখোমুখি উইন্ডোজ (যেমন থিম বা সরবরাহকারী) ব্যবহার করার সময় নিজেকে উন্মুক্ত করে তুলে ধরেন

উপসংহার

ফাংশন এবং ক্লাস ব্যবহারের মধ্যে পার্থক্যের একটি সংক্ষিপ্ত তালিকা এখানে রয়েছে:

  1. ক্লাস:
  • পারফরম্যান্স অপটিমাইজেশন (কনস্ট্রাক্টর কনস্ট্রাক্টর, আরও দানাদার পুনর্নির্মাণ) অনুমতি দিন
  • দুটি পৃথক বিন্যাসের মধ্যে স্যুইচিং সঠিকভাবে সম্পদগুলি নিষ্পত্তি করে তা নিশ্চিত করুন (ফাংশনগুলি কিছু আগের অবস্থা পুনরায় ব্যবহার করতে পারে)
  • হট-রিলোড পুনরুদ্ধার সঠিকভাবে কাজ করে তা নিশ্চিত করে (ফাংশনগুলি হট-লোডকে showDialogsঅনুরূপ জন্য বিরতি দিতে পারে )
  • উইজেট পরিদর্শক একীভূত হয়।
    • আমরা ClassWidgetডিভটোল দ্বারা দেখানো উইজেট-ট্রিতে দেখতে পাচ্ছি , যা স্ক্রিনে রয়েছে তা বুঝতে সহায়তা করে
    • উইজেটের কাছে পরামিতিগুলি কী কী তা মুদ্রণ করতে আমরা ডিবাগফিলপ্রপার্টিগুলি ওভাররাইড করতে পারি
  • আরও ভাল ত্রুটির বার্তা
    যদি কোনও ব্যতিক্রম ঘটে (যেমন প্রোভাইডার নটফাউন্ড), ফ্রেমওয়ার্কটি আপনাকে বর্তমানে বিল্ডিং উইজেটের নাম দেবে। আপনি যদি আপনার উইজেট গাছটি কেবলমাত্র ফাংশন + এ বিভক্ত করেন তবে আপনার Builderত্রুটির কোনও সহায়ক নাম থাকবে না
  • কী সংজ্ঞায়িত করতে পারেন
  • প্রসঙ্গ API ব্যবহার করতে পারেন
  1. কার্যাবলী:
  • কম কোড আছে (কোড প্রজন্মের ব্যবহার সমাধান করা যেতে পারে যা functional_widget )

সামগ্রিকভাবে, এই কারণগুলির কারণে উইজেটগুলি পুনরায় ব্যবহারের জন্য ক্লাসের উপর ফাংশনগুলি ব্যবহার করা একটি খারাপ অনুশীলন হিসাবে বিবেচিত হয়।
আপনি পারেন তবে ভবিষ্যতে এটি আপনাকে কামড় দিতে পারে।


মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
স্যামুয়েল লিউ

10

আমি গত 2 দিন ধরে এই বিষয়ে গবেষণা করছি। আমি নিম্নলিখিত সিদ্ধান্তে পৌঁছেছি: অ্যাপ্লিকেশনটির টুকরো টুকরো টুকরো করে ফাংশন করে ফেলা ঠিক হবে। এটি ঠিক আদর্শ যে এই ফাংশনগুলি একটি ফেরত দেয় StatelessWidget, সুতরাং অপ্টিমাইজেশন করা যেতে পারে যেমন তৈরি করা StatelessWidget const, তাই যদি এটি না করতে হয় তবে এটি পুনর্নির্মাণ করে না। উদাহরণস্বরূপ, কোডের এই অংশটি পুরোপুরি বৈধ:

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

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

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      ++_counter;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.display1,
            ),
            const MyWidgetClass(key: const Key('const')),
            MyWidgetClass(key: Key('non-const')),
            _buildSomeWidgets(_counter),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }

  Widget _buildSomeWidgets(int val) {
    print('${DateTime.now()} Rebuild _buildSomeWidgets');
    return const MyWidgetClass(key: Key('function'));

    // This is bad, because it would rebuild this every time
    // return Container(
    //   child: Text("hi"),
    // );
  }
}

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

  @override
  Widget build(BuildContext context) {
    print('${DateTime.now()} Rebuild MyWidgetClass $key');

    return Container(
      child: Text("hi"),
    );
  }
}

ফাংশনটির ব্যবহার পুরোপুরি সূক্ষ্ম, কারণ এটি a const StatelessWidget। আমি ভুল হলে আমাকে সংশোধন করুন।


কেউ কি ব্যাখ্যা করতে পারে যে আমি যা বলেছিলাম তা কেন ভুল? আমি বোঝাতে চাইছি, অনুমানের লোকেরা যদি ভুল মনে করে তবে।
সের্গিউ আইকাব

আমি আসলে আপনার সাথে একমত আমি পার্থক্যগুলির আরও বিশদ ভাঙ্গন লিখতে চাইছি, তবে এটির সন্ধান করতে পারিনি। আপনার যুক্তিটি নির্দ্বিধায় নির্দ্বিধায় বোধ করুন কারণ আমি মনে করি যে উইজেটগুলির ভি পদ্ধতিগুলির পক্ষে ও মতামতগুলি বোঝা গুরুত্বপূর্ণ।
TheIT

@ সেরগিউআইকোব আমরা কি constপ্রতিটি ক্ষেত্রে রাজ্যহীন শ্রেণির সামনে ব্যবহার করতে পারি ? বা এটি নির্দিষ্ট কিছু ক্ষেত্রে থাকতে হবে? যদি হ্যাঁ, তারা কি হয়?
আয়ুঞ্চ

1
@ ইয়ুনচুন আপনি যে কোনও constজায়গায় ব্যবহার করতে পারবেন বলে আমি মনে করি না । উদাহরণস্বরূপ, যদি আপনার এমন একটি StatelessWidgetশ্রেণি থাকে যা Textএকটি ভেরিয়েবলের মান সমেত একটি ফেরত দেয় এবং সেই পরিবর্তনশীলটি কোথাও পরিবর্তিত হয়, আপনার StatelessWidgetপুনর্নির্মাণের চেয়ে তাই এটি পৃথক মানটি প্রদর্শন করতে পারে, সুতরাং এটি হতে পারে না const। আমি মনে করি এটি রাখার নিরাপদ উপায় এটি: আপনি যেখানেই পারেন, ব্যবহার করতে পারেন const, যদি এটি করা নিরাপদ হয়।
সের্গিউ আইকাব

3
আমি নিজেই এই প্রশ্নের উত্তর দেবো কিনা তা নিয়ে আমি বিতর্ক করছি। গৃহীত উত্তরগুলি সরল ভুল, কিন্তু রুমি বিড়বিড় সম্প্রদায়ের চেষ্টা ও সহায়তা করার জন্য অনেক কিছু করেছেন, তাই লোকেরা সম্ভবত তার উত্তরগুলি অন্য কারোর মতো তদন্ত করে না। এটি সম্ভবত সমস্ত উত্স থেকে স্পষ্ট হয়। লোকেরা কেবল তাদের "সত্যের একক উত্স" চায়। :-)
ডার্কনিউরন

4

কোন ফাংশনগুলি করে এবং কোন শ্রেণিতে কী করে তার মধ্যে একটি বড় পার্থক্য ছিল।


আসুন আমি এটি খুব স্ক্র্যাচ থেকে ব্যাখ্যা করব 🙂 (কেবলমাত্র আবশ্যক সম্পর্কে)

  • প্রোগ্রামিং ইতিহাস, আমরা সবাই জানি স্ট্রেট বেসিক কমান্ড (যেমন- অ্যাসেম্বলি) দিয়ে শুরু করেছি।

  • পরবর্তী স্ট্রাকচার্ড প্রোগ্রামিং ফ্লো কন্ট্রোল নিয়ে আসে (উদা:: যদি, স্যুইচ করুন, যখন, ইত্যাদি) এই দৃষ্টান্তটি প্রোগ্রামারগুলিকে কার্যকরভাবে প্রোগ্রামের প্রবাহ নিয়ন্ত্রণ করতে এবং লুপ দ্বারা কোড লাইনগুলির সংক্ষিপ্তকরণের সংখ্যা দেয়।

  • পরবর্তী কার্যনির্বাহী প্রোগ্রামিং এসেছিল এবং প্রক্রিয়াগুলিতে কোন দলকে নির্দেশ দেয় (ফানকিশন)। এটি প্রোগ্রামারদের জন্য দুটি বড় সুবিধা দিয়েছে।

    1. গোষ্ঠী বিবৃতি (অপারেশন) পৃথক ব্লক।

    ২.এই ব্লকগুলি পুনরায় ব্যবহার করতে পারেন functions

কিন্তু সব পারাদিগ্ম্স উপরে হয়নি না অ্যাপ্লিকেশনের ম্যানেজিং জন্য একটি সমাধান দিতে। পদ্ধতিগত প্রোগ্রামিং কেবলমাত্র ছোট স্কেল অ্যাপ্লিকেশনগুলির জন্যও ব্যবহার করতে পারে। এটি বৃহত্তর ওয়েব অ্যাপ্লিকেশনগুলির বিকাশের জন্য ব্যবহার করা যাবে না (যেমন: ব্যাংকিং, গুগল, ইউটিউব, ফেসবুক, স্ট্যাকওভারফ্লো ইত্যাদি), অ্যান্ড্রয়েড এসডিকে, ফ্লাটার এসডিকে এবং আরও অনেক কিছুর ফ্রেমওয়ার্ক তৈরি করতে পারে না ......

তাই ইঞ্জিনিয়াররা প্রোগ্রামগুলি সঠিকভাবে পরিচালনা করতে আরও অনেক গবেষণা করে।

  • অবশেষে অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিংটি যে কোনও স্কেল অ্যাপ্লিকেশন পরিচালনার জন্য সমস্ত সমাধান নিয়ে আসে (

  • ওপতে সমস্ত অ্যাপ্লিকেশন হ'ল অবজেক্টের চারপাশে নির্মিত হয় t এর অর্থ হল অ্যাপ্লিকেশনটি এই বিষয়গুলির একটি সংগ্রহ।

সুতরাং অবজেক্টগুলি যে কোনও অ্যাপ্লিকেশনের জন্য প্রাথমিক বিল্ডিং।

শ্রেণি (রানটাইম এ অবজেক্ট) গ্রুপ ডেটা এবং সেই ভেরিয়েবলগুলির সাথে সম্পর্কিত ফাংশন (ডেটা)। সুতরাং তথ্য রচনা এবং তাদের সম্পর্কিত ক্রিয়াকলাপ আপত্তি।

[এখানে আমি ওওপ সম্পর্কে ব্যাখ্যা করব না]


Kআক নাউ আসুন বিড়বিড় করে কাঠামোয় আসুন 👈👈👈

-ডার্ট প্রক্রিয়াজাতীয় এবং ওও উভয় সমর্থন করে তবে, বিড়বিড় করে কাঠামো সম্পূর্ণরূপে ক্লাস (ওওপ) ব্যবহার করে তৈরি করে। (কারণ বৃহত পরিচালনাযোগ্য কাঠামো প্রক্রিয়াগত ব্যবহার করে তৈরি করতে পারে না)

এখানে আমি উইজেটগুলি তৈরি করার জন্য ক্লাসের পরিবর্তে ফাংশনগুলি ব্যবহার করার কারণগুলির তালিকা তৈরি করব 👇👇👇


1 - বেশিরভাগ সময় বিল্ডিং মেথড (চাইল্ড উইজেট) সিঙ্ক্রোনাস এবং অ্যাসিনক্রোনাস ফাংশনের কল নম্বর।

উদা:

  • নেটওয়ার্ক ইমেজ ডাউনলোড করতে
  • ব্যবহারকারীর কাছ থেকে ইনপুট পান ইত্যাদি

সুতরাং বিল্ড পদ্ধতিতে পৃথক শ্রেণীর উইজেট রাখা দরকার (কারণ বিল্ড দ্বারা কল করা সমস্ত অন্যান্য পদ্ধতি () পদ্ধতিটি একটি শ্রেণিতে রাখতে পারে)


2 - উইজেট শ্রেণীর ব্যবহার করে আপনি বার বার একই কোড না লিখে অন্য শ্রেণীর সংখ্যা তৈরি করতে পারেন (** উত্তরাধিকারের ব্যবহার ** (প্রসারিত))।

এবং উত্তরাধিকার (প্রসারিত) এবং পলিমারফিজম (ওভাররাইড) ব্যবহার করে আপনি নিজস্ব কাস্টম শ্রেণি তৈরি করতে পারেন। (নীচে উদাহরণস্বরূপ, সেখানে আমি মেটেরিয়ালপেজরোট বাড়িয়ে অ্যানিমেশনটি কাস্টমাইজ করব (ওভাররাইড) করব (কারণ এর ডিফল্ট রূপান্তরটি আমি কাস্টমাইজ করতে চাই) 👇

class MyCustomRoute<T> extends MaterialPageRoute<T> {
  MyCustomRoute({ WidgetBuilder builder, RouteSettings settings })
      : super(builder: builder, settings: settings);

  @override                                      //Customize transition
  Widget buildTransitions(BuildContext context,
      Animation<double> animation,
      Animation<double> secondaryAnimation,
      Widget child) {
    if (settings.isInitialRoute)
      return child;
    // Fades between routes. (If you don't want any animation, 
    // just return child.)
    return new FadeTransition(opacity: animation, child: child);
  }
}

3 - ফাংশনগুলি তাদের পরামিতিগুলির জন্য শর্ত যোগ করতে পারে না, তবে শ্রেণি উইজেটের কনস্ট্রাক্টর ব্যবহার করে আপনি এটি করতে পারেন।

নীচে কোড উদাহরণের নীচে - (এই বৈশিষ্ট্যটি ফ্রেমওয়ার্ক উইজেটগুলি দ্বারা প্রচুর পরিমাণে ব্যবহৃত হয়)

const Scaffold({
    Key key,
    this.bottomNavigationBar,
    this.bottomSheet,
    this.backgroundColor,
    this.resizeToAvoidBottomPadding,
    this.resizeToAvoidBottomInset,
    this.primary = true,
    this.drawerDragStartBehavior = DragStartBehavior.start,
    this.extendBody = false,
    this.extendBodyBehindAppBar = false,
    this.drawerScrimColor,
    this.drawerEdgeDragWidth,
  }) : assert(primary != null),
       assert(extendBody != null),
       assert(extendBodyBehindAppBar != null),
       assert(drawerDragStartBehavior != null),
       super(key: key);

4 - ফাংশনগুলি কনস্ট ব্যবহার করতে পারে না এবং শ্রেণি উইজেট তাদের নির্মাতাদের জন্য কনস্ট ব্যবহার করতে পারে। (এটি মূল থ্রেডের কার্যকারিতা প্রভাবিত করে)


5 - আপনি একই শ্রেণীর ব্যবহার করে যে কোনও স্বতন্ত্র উইজেট তৈরি করতে পারেন (শ্রেণি / বস্তুর উদাহরণ) তবে ফাংশন স্বতন্ত্র উইজেট তৈরি করতে পারে না (উদাহরণস্বরূপ), তবে পুনরায় ব্যবহার করতে পারে using

[প্রতিটি উদাহরণের নিজস্ব উদাহরণ পরিবর্তনশীল রয়েছে এবং এটি অন্যান্য উইজেট (বস্তু) থেকে সম্পূর্ণ স্বতন্ত্র, তবে ফাংশনের স্থানীয় পরিবর্তনশীল প্রতিটি ফাংশন কলের উপর নির্ভরশীল * (যার অর্থ আপনি যখন স্থানীয় ভেরিয়েবলের মান পরিবর্তন করেন এটি অন্যান্য সমস্ত অংশের জন্য প্রভাবিত করে অ্যাপ্লিকেশন যা এই ফাংশনটি ব্যবহার করে)]


ক্লাস ওভার ফাংশনে অনেক সুবিধা ছিল .. (উপরের কয়েকটি ব্যবহারের ক্ষেত্রে কেবলমাত্র)


আমার চূড়ান্ত চিন্তা

সুতরাং আপনার অ্যাপ্লিকেশনটির বিল্ডিং ব্লক হিসাবে ফাংশনগুলি ব্যবহার করবেন না, কেবল অপারেশনগুলি করার জন্য সেগুলি ব্যবহার করুন। অন্যথায় এটি যখন আপনার অ্যাপ্লিকেশনটি স্কেলযোগ্য হয় তখন এটি অবিরাম সমস্যার সৃষ্টি করে ।

  • কাজের ছোট অংশ করার জন্য ফাংশন ব্যবহার করুন
  • অ্যাপ্লিকেশনটির বিল্ডিং ব্লক হিসাবে শ্রেণি ব্যবহার করুন (অ্যাপ্লিকেশন পরিচালনা করা)

📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍 📍📍📍📍📍📍📍

আপনি পরিসংখ্যান সংখ্যার (বা লাইন) দ্বারা প্রোগ্রামের মান পরিমাপ করতে পারবেন না এটির মাধ্যমে

📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍 📍📍📍📍📍📍📍

পড়ার জন্য ধন্যবাদ


স্ট্যাকওভারফ্লোতে স্বাগতম! আপনি নিজের উত্তর দিয়ে কী প্রকাশ করার চেষ্টা করছেন তা আমি সত্যই নিশ্চিত নই। উইজেট তৈরির জন্য আপনি ঠিক একটি ফাংশন ব্যবহার করতে পারেন। আপনার উইজেট ট্রিতে ইনলাইন shrinkHelper() { return const SizedBox.shrink(); }ব্যবহার করার মতো const SizedBox.shrink()এবং হেল্পার ফাংশনগুলি ব্যবহার করে আপনি এক জায়গায় বাসা বাঁধার পরিমাণ সীমাবদ্ধ করতে পারেন।
ডার্কনিউরন

@ ডার্কনিউরন ভাগ করে নেওয়ার জন্য ধন্যবাদ। আমি সাহায্যকারী ফাংশন ব্যবহার করার চেষ্টা করব।
টিডিএম

2

আপনি যখন ফ্লটার উইজেটকে কল দিচ্ছেন আপনি কনস্ট কীওয়ার্ডটি ব্যবহার করেছেন তা নিশ্চিত করুন। উদাহরণ স্বরূপconst MyListWidget();


9
আমি জানতে পারি কীভাবে এটি ওপি প্রশ্নের উত্তর দেয়?
কক্সঅনরোড করুন

2
দেখে মনে হচ্ছে আমি ভুল বিভাগটি জবাব দিয়েছি। আমি ড্যানিয়েলের প্রশ্নের উত্তর দেওয়ার চেষ্টা করছিলাম যে রিফ্যাক্টর স্টেটলেস উইজেট বিল্ড পদ্ধতিটি এখনও ডাকা হচ্ছে। constরিফ্যাক্টর স্টেটলেস উইজেট কল করার সময় কীওয়ার্ডটি যুক্ত করে এটি কেবল একবার কল করা উচিত।
user4761410

1
ঠিক আছে. বুঝেছি. লোকেরা এই উত্তরটিকে নীচে নামাতে পারে কারণ ওপি প্রশ্নের সাথে এর কোনও যোগসূত্র নেই। সুতরাং আপনি এটি মুছে ফেলা উচিত। যাইহোক পছন্দ আপনার হয়।
কপসঅনরোড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.