J'utilise le fournisseur de initState() pour appeler l'API, mais si j'utilise listen:false, il ne met pas à jour l'interface utilisateur et il me montre toujours le chargeur, mais si j'utilise listen:true, l'application fonctionne bien mais dans le terminal, il me montre exception et me dit d'écrire listen:false.

Mon interface utilisateur,

class ChopperNewsCard extends StatefulWidget {
  @override
  _ChopperNewsCardState createState() => _ChopperNewsCardState();
}

class _ChopperNewsCardState extends State<ChopperNewsCard> {
  ScrollController scrollController = ScrollController();
  int currentPage = 5;
  ChopperApiStore _apiStore = ChopperApiStore();
  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
      _apiStore = Provider.of<ChopperApiStore>(context,);//<--- here it tells me to write listen:false
    });
    _apiStore.getResponse(currentPage);
    scrollController.addListener(() {
      if (scrollController.position.pixels ==
          scrollController.position.maxScrollExtent) {
        if (currentPage < 20) {
          currentPage = currentPage + 5;
          _apiStore.getResponse(currentPage);
        }
      }
    });
  }

  @override
  void dispose() {
    scrollController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    var height = MediaQuery.of(context).size.height;
    var width = MediaQuery.of(context).size.width;
    return Observer(builder: (context) {
      return Container(
        height: height * 0.37,
        width: double.infinity,
        child: _apiStore.res.articles == null
            ? CircularProgressIndicator()
            : ListView.builder(...),
      );
    });
  }
}

Classe d'appel api,

class ChopperApiStore extends _ChopperApiStore with _$ChopperApiStore{}

abstract class _ChopperApiStore with Store{
  ApiCall apiCall = ApiCall();
  @observable
  ChopperNews res = ChopperNews();

  @action
  Future<void> getResponse(int page) async {
     var data = await apiCall.getNews(page);
     res = data;
  }
}

L'erreur que je reçois,

======== Exception caught by scheduler library =====================================================
The following assertion was thrown during a scheduler callback:
Tried to listen to a value exposed with provider, from outside of the widget tree.

This is likely caused by an event handler (like a button's onPressed) that called
Provider.of without passing `listen: false`.

To fix, write:
Provider.of<ChopperApiStore>(context, listen: false);

It is unsupported because may pointlessly rebuild the widget associated to the
event handler, when the widget tree doesn't care about the value.

The context used was: ChopperNewsCard(dependencies: [MediaQuery], state: _ChopperNewsCardState#8f6cd)
'package:provider/src/provider.dart':
Failed assertion: line 262 pos 7: 'context.owner.debugBuilding ||
          listen == false ||
          debugIsInInheritedProviderUpdate'

When the exception was thrown, this was the stack: 
#2      Provider.of (package:provider/src/provider.dart:262:7)
#3      _ChopperNewsCardState.initState.<anonymous closure> (package:fruitley/week-5/bonus/chopper/widgets/chopper_news_card.dart:32:28)
#4      SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1117:15)
#5      SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1063:9)
#6      SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:971:5)
...
0
Pokaboom 1 mars 2021 à 08:20

2 réponses

Meilleure réponse

Ok je suis stupide. Je n'avais même pas besoin d'utiliser addPostFrameCallback. Je viens de le supprimer et si je veux utiliser un fournisseur en dehors de l'arborescence des widgets, je dois utiliser listen:false comme il le montrait dans l'exception alors maintenant tout a du sens.

0
Pokaboom 1 mars 2021 à 06:53

Je pense que si vous souhaitez utiliser listen:true pour appeler la méthode build, vous êtes censé remplacer didChangeDependencies plutôt que initState Consultez cet article, cela pourrait aider https://medium.com/swlh/flutter-provider-and-didchangedependencies-15678f502262

0
moneer alhashim 1 mars 2021 à 05:36