স্টেটফুল উইজেটে ডেটা পাঠানো


113

আমি ভাবছি যে কোনও স্টেটফুল উইজেটের ডেটা তৈরি করার সময় এটির প্রস্তাবিত উপায়টি কী while

দুটি স্টাইল আমি দেখেছি:

class ServerInfo extends StatefulWidget {

  Server _server;

  ServerInfo(Server server) {
    this._server = server;
  }

  @override
    State<StatefulWidget> createState() => new _ServerInfoState(_server);
}

class _ServerInfoState extends State<ServerInfo> {
  Server _server;

  _ServerInfoState(Server server) {
    this._server = server;
  }
}

এই পদ্ধতিতে ServerInfoএবং উভয়ই একটি মান রাখে _ServerInfoStateযা কিছুটা অপব্যয় বলে মনে হয়।

অন্য পদ্ধতিটি হ'ল widget._server:

class ServerInfo extends StatefulWidget {

  Server _server;

  ServerInfo(Server server) {
    this._server = server;
  }

  @override
    State<StatefulWidget> createState() => new _ServerInfoState();
}

class _ServerInfoState extends State<ServerInfo> {
  @override
    Widget build(BuildContext context) {
      widget._server = "10"; // Do something we the server value
      return null;
    }
}

এটি কিছুটা পিছনের দিকে বলে মনে হচ্ছে কারণ রাজ্যটি আর সঞ্চিত _ServerInfoSateনয় বরং পরিবর্তিত উইজেটে।

এর জন্য কি সেরা অনুশীলন আছে?


3
কনস্ট্রাক্টর হ্রাস করা যেতে পারেServerInfo(this._server);
Günter Zöchbauer

এই নিয়ে প্রশ্ন আগে বলা হয়েছে stackoverflow.com/questions/50428708/...
Blasanka

এটা কি তোমার প্রশ্নের উত্তর? স্টেটফুল
উইজেটে ডেটা প্রেরণ করা

এই উত্তর আগে এই এক এক মাসের যোগ করা হয় stackoverflow.com/questions/50428708/...
Blasanka

এটা কি তোমার প্রশ্নের উত্তর?
কনস্ট্রাক্টর

উত্তর:


230

Stateএটির কনস্ট্রাক্টর ব্যবহার করে প্যারামিটারগুলি পাস করবেন না । আপনার কেবল এগুলি ব্যবহার করে অ্যাক্সেস করা উচিত this.widget.myField

কেবল কনস্ট্রাক্টরকে সম্পাদনা করার জন্য অনেকগুলি ম্যানুয়াল কাজ প্রয়োজন; এটা কিছুই এনে দেয় না। এর সমস্ত ক্ষেত্রের সদৃশ করার কোনও কারণ নেই Widget

সম্পাদনা:

এখানে একটি উদাহরণ:

class ServerIpText extends StatefulWidget {
  final String serverIP;

  const ServerIpText ({ Key key, this.serverIP }): super(key: key);

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

class _ServerIpTextState extends State<ServerIpText> {
  @override
  Widget build(BuildContext context) {
    return Text(widget.serverIP);
  }
}

class AnotherClass extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: ServerIpText(serverIP: "127.0.0.1")
    );
  }
}

23
আরও একটি মন্তব্য, আপনি কন্সট্রাক্টরের মাধ্যমে কোনও স্টেট অবজেক্টে যা কিছু পাস করেন তা কখনই আপডেট হবে না!
জোনা উইলিয়ামস

4
এবং আমি এখানে আছি এবং মন্তব্য বুঝতে পারি না। "এটির কনস্ট্রাক্টর ব্যবহার করে স্টেটে পরামিতিগুলি পাস করবেন না"। সুতরাং আমি কীভাবে রাজ্যে পরামিতিগুলি পাস করব?
খোফি

6
@ রেক্সফোর্ড Stateইতিমধ্যে ক্ষেত্রটি Statefulব্যবহার করে সমস্ত বৈশিষ্ট্যে অ্যাক্সেস হিসাবে রয়েছে widget
রুমি রাউসলেট

4
@ রমিআরসলেট যদি আমি কোনও পাঠ্যক্ষেত্র প্রাক-পূরণের জন্য ফু ব্যবহার করতে চাই এবং এখনও ব্যবহারকারীকে এটি সম্পাদনা করার অনুমতি দেয় তবে কী হবে। আমি কি রাজ্যে আরও একটি foo সম্পত্তি যুক্ত করা উচিত?
সাইফি

1
@ user6638204 আপনি রাজ্যে অন্য একটি foo সম্পত্তি তৈরি করতে পারেন এবং void initState()প্রাথমিক মান সেট করতে রাজ্যে ওভাররাইড করতে পারেন। উদাহরণস্বরূপ এই থ্রেড বিকল্পটি চেক করুন ।
জোসেফ চেং

30

সর্বোত্তম উপায় এটি নির্মাণকারীর ব্যবহার করে স্টেট ক্লাসে প্যারামিটারগুলি পাস না। আপনি স্টেট ক্লাসে সহজেই অ্যাক্সেস করতে পারবেন widget.myField

উদাহরণ স্বরূপ

class UserData extends StatefulWidget {
  final String clientName;
  final int clientID;
  const UserData(this.clientName,this.clientID);

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

class UserDataState extends State<UserData> {
  @override
  Widget build(BuildContext context) {
    // Here you direct access using widget
    return Text(widget.clientName); 
  }
}

আপনি যখন স্ক্রিন নেভিগেট করবেন তখন আপনার ডেটা পাস করুন:

 Navigator.of(context).push(MaterialPageRoute(builder: (context) => UserData("WonderClientName",132)));

8

@ RémiRousselet এর anwser এবং @ ব্যবহারকারী6638204 এর প্রশ্নের জন্য অন্য একটি উত্তর, আপনি যদি প্রাথমিক মানগুলি পাস করতে চান এবং এখনও এটিকে রাজ্যে পরে আপডেট করতে সক্ষম হন তবে:

class MyStateful extends StatefulWidget {
  final String foo;

  const MyStateful({Key key, this.foo}): super(key: key);

  @override
  _MyStatefulState createState() => _MyStatefulState(foo: this.foo);
}

class _MyStatefulState extends State<MyStateful> {
  String foo;

  _MyStatefulState({this.foo});

  @override
  Widget build(BuildContext context) {
    return Text(foo);
  }
}

7
আমরা সরাসরি স্টু স্টেট ব্যবহার করতে পারি যেমন foo = ਵਿਦজেট.ফুর মতো কিছু করার জন্য, কন্সট্রাক্টরের কোনও পাস করার প্রয়োজন নেই
আকিব

কিভাবে এই যুক্তি পাস?
স্টিভ জেমস 17'19

@ স্টিভ জেমস উইজেটের MyStatefulএকটি alচ্ছিক নামক প্যারামিটার রয়েছে (সম্পত্তি) আপনি কল করে এই উইজেটটি তৈরি করতে পারবেনMyStateful(foo: "my string",)
কিরিল কারমাজিন

@ আকিব নীচের দৃশ্যে initStateকোনও সমস্যার সমাধান করে না: উদাহরণস্বরূপ, আপনি খালি পরামিতি সহ আপনার স্টেটফুল উইজেট তৈরি করেছেন এবং আপনি আপনার ডেটা লোড হওয়ার অপেক্ষায় রয়েছেন। ডেটা লোড হয়ে গেলে আপনি তাজা তথ্য দিয়ে আপনার স্টেটফুল উইজেট আপডেট করতে চান এবং এই ক্ষেত্রে যখন আপনি মাইস্টেটফুলকে (নতুন ডেটা) কল করবেন তখন এটি initState()বলা হবে না! এই ক্ষেত্রে didUpdateWidget(MyStatefull oldWidget)বলা হবে এবং আপনার যুক্তি থেকে আপনার ডেটা তুলনা করতে হবে oldWidget.getData()সঙ্গে widget.dataএবং এটি যদি একই নয় - কল setState()উইজেট পুনর্নির্মাণের।
কিরিল কারমাজিন

1
@ কিরিল-করমজিন আপনি কি স্টেটলেস উইজেট সমাধান সম্পর্কে আরও বিস্তারিত বলতে পারবেন? পরিবর্তে আপনি কি ব্যবহার করবেন? এটি কি ফ্লাটার দল থেকে সেরা অনুশীলন? ধন্যবাদ
camillo777

4

প্রাথমিক মান পাস করার জন্য (কনস্ট্রাক্টরের কাছে কিছু না দিয়ে)

class MyStateful extends StatefulWidget {
  final String foo;

  const MyStateful({Key key, this.foo}): super(key: key);

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

class _MyStatefulState extends State<MyStateful> {
  @override
  void initState(){
    super.initState();
    // you can use this.widget.foo here
  }

  @override
  Widget build(BuildContext context) {
    return Text(foo);
  }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.