স্ট্রিমবিল্ডার ব্যবহার করে টেক্সটফিল্ডের মান কীভাবে আপডেট করবেন?


13

আমার একটি রয়েছে textfieldএবং আমি sqfliteআমার অ্যাপ্লিকেশনটিতে ডাটাবেস ব্যবহার করছি । sqfliteএকটি মান যা আমি দায়িত্ব অর্পণ করা প্রয়োজন আছে আমারtextfield

এখানে আমার textfieldকোড

 StreamBuilder<String>(
    stream: patientHealthFormBloc.doctorName,
    builder: (context, snapshot) {
      return TextFormField(
        initialValue: patientHealthFormBloc.doctorNameValue,
        onChanged: (value) {
          patientHealthFormBloc.doctorNameChanged(value);
        },
        ...

এখন initstateআমার ক্লাসের পদ্ধতিতে, আমি ডাটাবেস থেকে মান আনছি। এটি একটি অ্যাসিনক্রোনাস অপারেশন হচ্ছে তাই এটি সময় নেয়।

আমার ব্লক ক্লাসে নীচের মতো একটি কোড রয়েছে

Function(String) get doctorNameChanged => _doctorName.sink.add;

সুতরাং যত তাড়াতাড়ি আমি ডাটাবেস থেকে মান পেতে আমি নিম্নলিখিত কল

doctorNameChanged("valuefromdatabase");

তবে আমি আমার পাঠ্যক্ষেত্রের মান দেখতে পাচ্ছি না। এছাড়াও আমার ডাটাবেসে একটি মান উপস্থিত আছে। ব্যবহার TextEditingControllerবা ব্যবহার না করেই কি মান আপডেট করা সম্ভব setState? আমি আমার ক্লাসের chuncks এবং উপায় খুব ব্যবহারের উপরে আমি সঙ্গে একই পদ্ধতির ব্যবহার চেষ্টা করেছি জটিল এর অনেক ভাগে ভাগ করা হয় ঐ এড়ানোর চেষ্টা ma RadioButtonএবং CheckBoxতারা সঠিকভাবে আপডেট করতে বলে মনে হচ্ছে। মানটি আপডেট করা হয় _doctorName.stream.valueযা ডাটাবেসে উপস্থিত textfieldথাকে তবে কোনও ডেটা দেখায় না। এছাড়াও আমি রঙ পরিবর্তন করার চেষ্টা করেছি textfieldতাই সেখানে কোনও সমস্যা নেই পাশাপাশি আমি কী টাইপ করতে সক্ষম তাও দেখতে পাচ্ছি।

আমি অ্যাপ্লিকেশনটির একটি ছোট ডেমো তৈরি করেছি https://github.com/PritishSawant/demo/tree/master/lib

ব্যবহারের পরিবর্তে sqflite, আমি ব্যবহার করছি shared preferencesতবে সমস্যাটি অব্যাহত রয়েছে


"ইনিশিয়ালভ্যালু: রোগীহেলথফর্মব্লোক.ডোক্টরনামালভ" অপসারণ করে দেখুন এবং স্ট্রিমবিল্ডার থেকে "ইনিশিয়াল ডেটা" এ এটি শুরু করুন
স্টেল

@Stel ধন্যবাদ কিন্তু কাজ করে
ঠেলা

আপনি TextEditingController (পাঠ্য) ব্যবহার করতে পারেন

টেক্সটএডিটিংকন্ট্রোলার এড়াতে আমি চিনকিসাইটটি স্ট্রিম ব্যবহার করছি। অ্যাপ্লিকেশন জটিল এবং TextEditingController ব্যবহার সম্ভবপর নয়
ঠেলা

আপনার উদাহরণে আপনি স্ন্যাপশটটি মোটেই ব্যবহার করছেন না। আপনার টেক্সটফর্মফিল্ডে আপনি কী ডেটা ব্যবহার করার প্রত্যাশা করছেন? আপনি কেন কোনও পাঠ্য সম্পাদনা নিয়ন্ত্রণকারী ব্যবহার করতে পারবেন না?
জোও

উত্তর:


4

ঠিক আছে তাই আমি অবশেষে আমার সমস্যার সমাধান খুঁজে পেলাম।

নিম্নলিখিতটি আমার কোডটি দেওয়া হচ্ছে, আমি নীচের উদাহরণের SharedPreferencesপরিবর্তে স্রেফ ব্যবহার করেছি sqfliteame একই জিনিস দিয়ে কাজ করা যায়sqflite

class _MyHomePageState extends State<MyHomePage> {

  MyBloc myBloc = MyBloc();
  TextEditingController myController = TextEditingController();

  @override
  void dispose() {
    myBloc?.close();
    myController?.dispose();
    super.dispose();
  }

  @override
  void initState() {
    super.initState();
    AppPreferences.setString("data", "this is my data");
    AppPreferences.getString("data").then((value){
      myBloc.dataChanged(value);
    });
  }


  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: StreamBuilder(
          stream: myBloc.data,
           builder: (context,snapshot){

            debugPrint(snapshot.data);
            myController.value = myController.value.copyWith(text: myBloc.dataValue);

            return TextFormField(
              controller: myController,
              onChanged: (value){
                myBloc.dataChanged(value);
              },
            );
           },
        ),
      ),
    );
  }
}

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

@ জোওসোয়ারেস আপনি কি নিজের সমাধান পোস্ট করতে পারেন? আমি অনুগ্রহটি প্রদান করে বেশি খুশি এবং আপনার সমাধানটি যদি আমার চেয়ে ভাল হয় তবে তা গ্রহণ করি। আমি শুধু একটি সহজ সমাধান পোস্ট করেছেন যাতে সবাই বুঝতে পারেন কিন্তু বাস্তবে আমার অ্যাপ্লিকেশানের sqflite সেইসাথে firestore সঙ্গে সিঙ্ক প্রয়োজন তাই এটি বেশি আপনাকে engineered মনে হতে পারে
ঠেলা

আপনি যদি ব্যাখ্যা করতে পারেন যে আপনি কেন একই সময়ে পাঠ্যফিল্ডফর্মটির মান স্ট্রিম করতে চান (আপডেট করতে) ব্যবহারকারী এটি ব্যবহার করতে পারে তবে আমি আপনাকে সহায়তা করতে সক্ষম হতে পারি। এসকিউফ্লাইট এবং ফায়ার স্টোরের সাথে সিঙ্ক করার ক্ষেত্রে আমার দাবির সাথে কোনও সম্পৃক্ততা নেই যে আপনি যে সমাধানটি উপস্থাপন করেছেন তা অতি ইঞ্জিনিয়ারড।
জোও সোরেস

@ জোওসোয়ারেস দয়া করে আবার প্রশ্নটি পড়ুন।
ঠেলা

আমি প্রশ্নটি ইতিমধ্যে একাধিকবার পড়েছি এবং গিটহাবের সাথে ভাগ করা কোডটি দেখেছি। আপনার ব্যাখ্যায় আপনি কী করতে চান এবং কোডটি কীভাবে চান তা বোঝায় speaks আপনি কেন কোনও স্ট্রিমিং ডেটা স্ট্রিমিং বা সেই আচরণের ভিত্তি দিয়ে কোনও টেক্সটফর্মফিল্ড পূরণ করতে চান তা ব্যাখ্যা করে না।
জোও সোরেস

2

নিম্নলিখিত পদ্ধতির চেষ্টা করুন:

StreamBuilder<String>(
  stream: patientHealthFormBloc.doctorName,
  builder: (context, snapshot) {
    String doctorName = patientHealthFormBloc.doctorNameValue;
    if(snapshot.hasData){
      doctorName = snapshot.data/*(your name string from the stream)*/;
    } 
    return TextFormField(
      initialValue: doctorName,
      onChanged: (value) {
        patientHealthFormBloc.doctorNameChanged(value);
      },
    ...

আপনার আরও সাহায্যের প্রয়োজন হলে আমাকে জানান।


কাজ করে না ...
ঠেলা

আপনি কি স্রোতে নতুন নাম পাচ্ছেন?
হর্ষবর্ধন জোশী

হ্যাঁ কিন্তু মান আপডেট পাচ্ছেন না
ঠেলা

আপনি কি একই নতুন নাম পেয়ে যাচ্ছেন builder: (context, snapshot)?
হর্ষবর্ধন জোশী

আমি যখন কোনও পাঠ্য টাইপ করি, আমি টাইপ করা পাঠ্যটি পাই। প্রাথমিক পর্যায়ে যখন আমি ডিবি থেকে আনার সময় তারপর এটি ডিবি মুদ্রণ করা হয় value.The StreamBuilder সূক্ষ্ম এবং যখন আমি নিজে টাইপ মান আপডেট কাজ করছে কিন্তু এটি আপডেট নেই যখন এটি ডাটাবেস থেকে সংগৃহীত এ
ঠেলা

1

আমার মন্তব্যে যা বোঝাচ্ছিল তা এরকম কিছু ছিল:

TextEditingController _textEditingController = TextEditingController();

@override
void initState() {
  patientHealthFormBloc.doctorName.listen((snapshot){
    setState((){
      _textEditingController.text = snapshot;
    });
  });
  super.initState();
}

@override
Widget build(BuildContext context) {
  return Scaffold(
    body: Column(
      children: <Widget>[
      TextFormField(
        controller: _textEditingController,
        onChanged: (value) {
          patientHealthFormBloc.doctorNameChanged(value);
        },
      ],
    ),
  );
}

আপনি কেন কোনও পাঠ্য সম্পাদনা নিয়ন্ত্রণকারী বা সেটস্টেট ব্যবহার করতে চান না তা বুঝতে পেরে আমি এই উত্তরটি লিখতে চাইনি। তবে এটি ব্লক প্যাটার্নটি ব্যবহার করার সময় আপনি যা চান তা অর্জন করা উচিত।


শুরুতে আমার এই চিন্তাভাবনা ছিল, তবে যেহেতু প্রশ্নটি উদ্ধৃত হয়েছে এবং @ নুড ব্যবহার না করার জন্য জোর দিয়েছিলেন TextEditController, তাই আমি সেই আইডিয়াটি স্ক্র্যাপ করেছিলাম। এটি দুর্দান্ত যে কেবলমাত্র নিয়ামক ব্যবহার করে সমাধানটি নির্ভুলভাবে কাজ করা সহজ এবং ছোট হয়ে যায়। দারূন কাজ.
হর্ষবর্ধন যোশি

1
আমি এটা প্রশংসা করি আপনাকে ধন্যবাদ. দুর্ভাগ্যক্রমে ব্যবহারকারী তার নিজের ধারণাকে আঁকড়ে ধরেছে এবং সঠিক সমাধান লেখার প্রয়াসে অবিচল বলে মনে হয়েছিল, যেমন তারা সঠিক প্রতিক্রিয়া বা অনুগ্রহকে বিশিষ্ট না করার সিদ্ধান্ত নিয়েছে।
জোও সোয়রেস

ওহ ঠিক আছে. তাহলে কখনো কিছু মনে করো না.
হর্ষবর্ধন জোশী
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.