Не удалось найти правильного поставщика <Список> над этим виджетом myorder

# #flutter #dart #google-cloud-firestore #provider

Вопрос:

Я пытаюсь прочитать данные с помощью поставщика потоков, но получаю сообщение об ошибке:

Ошибка: не удалось найти правильного поставщика <Список> над этим виджетом myorder

Это происходит потому, что вы использовали BuildContext , который не включает поставщика по вашему выбору. Существует несколько распространенных сценариев:

  • Вы добавили нового поставщика в свой main.dart и выполнили горячую перезагрузку. Чтобы исправить, выполните горячий перезапуск.
  • Поставщик, которого вы пытаетесь прочитать, находится на другом маршруте.

Поставщики «ограничены». Поэтому, если вы вставите поставщика внутри маршрута, другие маршруты не смогут получить доступ к этому поставщику.

  • Вы использовали a BuildContext , который является предком поставщика, которого вы пытаетесь прочитать.

Убедитесь, что myorder находится под вашим мультипровайдером / поставщиком<Список>. Обычно это происходит, когда вы создаете поставщика и пытаетесь его немедленно прочитать.

Например, вместо:

 void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
final firestoreservice _db= firestoreservice();
runApp(
  MultiProvider (
  providers:[
ChangeNotifierProvider(
create:(context)=>productstore(),),
    ChangeNotifierProvider(
      create:(context)=>selectedDropdownItems(),),
    ChangeNotifierProvider(
      create:(context)=>userprovider(),),
    ChangeNotifierProvider(
      create:(context)=>uploadProd()),
     StreamProvider(create: (BuildContext context)=>_db.getUserList(), initialData: null,)
],
  //ChangeNotifierProvider(
  //create:(context)=>productstore(),
  child: MaterialApp(
    debugShowCheckedModeBanner: false,
    title: 'ROW',
    theme: ThemeData(

      primarySwatch: Colors.red,
    ),
    home:users(),
  ),

),
);
}

class UserData {
UserData ({ this.email,this.id,this.password,this.name});
String? email;
String? id;
String? password;
String? name;


UserData.fromJson(Map<String, dynamic> parsedJSON)
        :name = parsedJSON['name'],
         email = parsedJSON['email'];
}

class firestoreservice {
FirebaseFirestore _db = FirebaseFirestore.instance;
Stream<List<UserData>> getUserList() {
 return _db.collection('users')
     .snapshots()
     .map((snapshot) =>
     snapshot.docs
         .map((document) => UserData.fromJson(document.data())).toList()
 );
}


}

class users extends StatelessWidget{
@override
Widget build(BuildContext context) {
  var store = Provider.of<List<UserData>>(context,listen:false);
 

  return  Container(
    width: MediaQuery.of(context).size.width,
    height: MediaQuery.of(context).size.height,
    decoration: BoxDecoration( color: Colors.white,
      // border: Border.all(color: Colors.red)
    ),
    child:
    ListView(
      children: [
        Column(
          children: [
            Padding(
              padding: const EdgeInsets.only(top: 4.0,bottom: 4.0),
            ),
            ListView.builder(
                shrinkWrap: true,
                physics: ScrollPhysics(),
                
                itemCount:store.length,
                itemBuilder:(context, index)
                {UserData userdata= store[index];

                  return Padding(
                    padding: const EdgeInsets.only(top: 4.0,bottom: 4.0),
                    child: Container(
                      height: 220,
                      width: MediaQuery.of(context).size.width,
                      decoration: BoxDecoration(
                        boxShadow: [
                          BoxShadow(
                            color: Colors.black,
                            blurRadius: 2.0,
                            spreadRadius: 0.0,
                            offset: Offset(2.0, 2.0),
                          )
                        ],
                        color: Colors.white,
                        //border: Border.all(color: Colors.red)
                      ),
                      child: Column(
                        children: [
                          Row(
                            //mainAxisAlignment: MainAxisAlignment.center,
                            children: [
                              Padding(
                                padding: const EdgeInsets.only(top: 4.0,bottom: 4.0,left: 10.0),
                               
                                child: Text(userdata.name.toString(),style: TextStyle(color: Colors.red,fontSize: 10, fontWeight: FontWeight.bold),),
                              ),
                              Padding(
                                padding: const EdgeInsets.only(top: 4.0,bottom: 4.0,left: 10.0),
                                
                                child: Text(userdata.email.toString(),style: TextStyle(color: Colors.red,fontSize: 10, fontWeight: FontWeight.bold),),
                              ),


                            ],
                          ),


                        ],
                      ),

                    ),
                  );
                }
            ),
          ],
        ),
      ],
    )
    ,
  );


}
}

 

Комментарии:

1. api.flutter.dev/flutter/widgets/StreamBuilder-class.html

Ответ №1:

Проверьте этот пример, это UI файл :

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

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

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [ChangeNotifierProvider(create: (context) => UserProvider())],
      child: MaterialApp(
        title: 'Flutter Demo',
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        home: MyHomePage(title: 'Flutter Demo Home Page'),
      ),
    );
  }
}

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

  final String title;

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

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: ListView.builder(
          itemCount: context.watch<UserProvider>().list.length,
          itemBuilder: (context, index) => ListTile(
                title:
                    Text("${context.watch<UserProvider>().list[index].name}"),
                subtitle:
                    Text("${context.watch<UserProvider>().list[index].email}"),
              )),
      floatingActionButton: FloatingActionButton(
        onPressed: () => context
            .read<UserProvider>()
            .setUser(User("demo2", "Demo@demo.com")),
        child: Icon(Icons.add),
      ),
    );
  }
}
 

и это Provider файл для этого списка

 import 'package:flutter/cupertino.dart';

class UserProvider extends ChangeNotifier {
  List<User> _list = [User("User", "user@demo.com")];

  List<User> get list => _list;

  setUser(User value) {
    _list.add(value);
    notifyListeners();
  }
}

class User {
  String name;
  String email;

  User(this.name, this.email);
}
 

Комментарии:

1. Я завернул Multiprovider в конструктор, но все равно получаю ту же ошибку. Дополнительная помощь, пожалуйста

2. В этой строке Provider.of<List<UserData>> вам нужно передать только класс, который расширяет ChangeNotifier, например Provider.of<UserData>, и в этом классе вы можете создать Getter и Setter для List

3. Пожалуйста, вы можете переписать простой пример. это было бы более полезно

4. хорошо, я опубликую пример кода, в котором я получу список чего-либо и передам его в пользовательский интерфейс

5. все еще жду сообщения. надеюсь, это будет скоро