मैं इस स्पंदन कोड में प्रदाता 4.3.2 का उपयोग कर रहा हूं, यह एक साधारण स्पंदन ऐप है जिसमें एक टेक्स्ट फ़ाइल, फ्लैट बटन और एक सूची दृश्य निर्माता है जिसमें टेक्स्ट विजेट होता है। मैंने एक क्लास लिस्टडेटा बनाया है जिसमें सूची है और प्रदाता का उपयोग करके सूची दृश्य निर्माता में दिखाया गया है। यहाँ समस्या है, मैंने ListData वर्ग में एक addData विधि बनाई है। मैंने फ्लैट बटन की ऑनप्रेस विधि में प्रदाता का उपयोग करके सूची में डेटा जोड़ने के लिए इस विधि का उपयोग किया है, यह त्रुटि फेंक रहा है, खोजने में असमर्थ है। इस समस्या का समाधान। साथ ही यह मेरे मुख्य ऐप का संक्षिप्त रूप है

import 'dart:collection';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    String data;
    return ChangeNotifierProvider(
      create: (context) => ListData(),
      child: MaterialApp(
        home: Scaffold(
          appBar: AppBar(
            title: Text("list"),
          ),
          body: Column(
            children: [
              TextField(
                onChanged: (value) => data = value,
              ),
              FlatButton(
                child: Text("Add"),
                color: Colors.blue,
                onPressed: () {
                  Provider.of<ListData>(context).addData(data);
                },
              ),
              Expanded(
                child: MyListView(),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

class MyListView extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ListView.builder(
      itemBuilder: (context, index) {
        return Text(Provider.of<ListData>(context).listData[index]);
      },
      itemCount: Provider.of<ListData>(context).listCount,
    );
  }
}

class ListData extends ChangeNotifier {
  List _listData = [
    'Hello',
    "hi",
  ];

  UnmodifiableListView get listData {
    return UnmodifiableListView(_listData);
  }

  int get listCount {
    return _listData.length;
  }

  void addData(String data) {
    _listData.add(data);
    notifyListeners();
  }
}

1
venkatesh munaga 24 सितंबर 2020, 12:14

2 जवाब

सबसे बढ़िया उत्तर

आप नीचे पेस्ट रन पूरा कोड कॉपी कर सकते हैं
आपको चाहिए Builder और listen: false
सांकेतिक टुकड़ा

Builder(builder: (BuildContext context) {
        return FlatButton(
          child: Text("Add"),
          color: Colors.blue,
          onPressed: () {
            Provider.of<ListData>(context, listen: false).addData(data);
          },
        );
      }),

काम कर रहे डेमो

enter image description here

पूरा कोड

import 'dart:collection';

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    String data;
    return ChangeNotifierProvider(
      create: (context) => ListData(),
      child: MaterialApp(
        home: Scaffold(
          appBar: AppBar(
            title: Text("list"),
          ),
          body: Column(
            children: [
              TextField(
                onChanged: (value) => data = value,
              ),
              Builder(builder: (BuildContext context) {
                return FlatButton(
                  child: Text("Add"),
                  color: Colors.blue,
                  onPressed: () {
                    Provider.of<ListData>(context, listen: false).addData(data);
                  },
                );
              }),
              Expanded(
                child: MyListView(),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

class MyListView extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ListView.builder(
      itemBuilder: (context, index) {
        return Text(Provider.of<ListData>(context).listData[index]);
      },
      itemCount: Provider.of<ListData>(context).listCount,
    );
  }
}

class ListData extends ChangeNotifier {
  List _listData = [
    'Hello',
    "hi",
  ];

  UnmodifiableListView get listData {
    return UnmodifiableListView(_listData);
  }

  int get listCount {
    return _listData.length;
  }

  void addData(String data) {
    _listData.add(data);
    notifyListeners();
  }
}
1
chunhunghan 24 सितंबर 2020, 12:28

आपको अपने FlatButton को Consumer विजेट में लपेटने की आवश्यकता है क्योंकि Provider.of को BuildContext के साथ बुलाया जाता है जो प्रदाता का पूर्वज है।

return ChangeNotifierProvider(
    create: (_) => ListData(),
    child: Consumer<ListData>(
      builder: (_, listData, __) => FlatButton(onPressed: () => listData.addData(data)),
    },
  );

आपको त्रुटि क्यों मिलती है और इसका उपयोग कैसे करना है, यह समझने में आपकी सहायता के लिए सरल उदाहरणों के साथ अधिक जानने के लिए इसे देखें।

https://pub.dev/documentation/provider/latest/provider/Consumer-class.html

1
Er1 24 सितंबर 2020, 12:29