Объедините Provider (Pad) и ChangeNotifier (Provider) в main.dart и PageView Controller ошибка нескольких представлений прокрутки - PullRequest
0 голосов
/ 11 июля 2020

Кто-то мог быть в подобном случае.

Я использую Blo c Pattern Provider (singleton), а также ChangeNotifierProvider. Когда вы создаете их экземпляры из разных дочерних виджетов, они хорошо работают по отдельности. Но я хотел бы создать их экземпляры из root main.dart.

Я пытаюсь это сделать, и, похоже, все идет хорошо

//Provider Bloc Patern myapp1/blocs/provider_bloc.dart
//This Provider is used to manage other widgets
    import 'package:flutter/material.dart';
    import 'package:provider/single_child_widget.dart';
    
    class ProviderBloc extends InheritedWidget{        
      //Singleton
      static ProviderBloc _instancia;
      factory ProviderBloc({Key key, SingleChildWidget child}){
        if (_instancia==null){
          _instancia = new ProviderBloc._internal(key: key, child: child);
        }
        return _instancia;
      }
      ProviderBloc._internal({ Key key, SingleChildWidget child})
        : super(key: key, child: child);
    
      @override
      bool updateShouldNotify(InheritedWidget oldWidget) => true;        
    }

в моем основном классе

import 'package:flutter/material.dart';
import 'package:myapp1/blocs/provider_bloc.dart';
import 'package:provider/provider.dart';
class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return ProviderBloc(
            child: ChangeNotifierProvider(
           create: (_) => new MainProvider(),
           child: MaterialApp(
           ...*rest of the code*

Мой класс MainProvider

//This Provider is used to mainly manage the PageController, and other widgets
    class MainProvider with ChangeNotifier{
      int _currentPage = 1;
      PageController _pageController = new PageController();
      PageController get pageController => this._pageController;
    
      int get currentPage => this._currentPage;  
      set currentPage( int val ) {
        this._currentPage = val;
        _pageController.animateToPage(val, duration: Duration(milliseconds: 1), curve: Curves.easeOut );
        notifyListeners(); 
     }

Наконец, проблема в моем виджете Home, где у меня есть PageView, управляемый pageController класса MainProvider

class HomePage extends StatelessWidget {
    MainProvider mainProvider;
      @override
      Widget build(BuildContext context) {
        mainProvider = Provider.of<MainProvider>(context);
    
        return Scaffold(
                    resizeToAvoidBottomInset : true,        
                    resizeToAvoidBottomPadding: false,
                    body: PageView(
                      controller: mainProvider.pageController,      
                      children: <Widget>[
                        Container(),
                        Container(),
                        Container(),
    
                      ],
                    ),
                    floatingActionButton: FloatingActionButton(
                        child: Icon(
                            Icons.search,
                          ),
                          onPressed: (){
                                    mainProvider.currentPage = 0;
                          }
                      ),
           ...*rest of the code*

Когда я нажимаю FloatingActionButton для изменения currentPage PageView, он выдает ошибку

════════ Exception caught by gesture ═══════════════════════════════════════════
The following assertion was thrown while handling a gesture:
ScrollController attached to multiple scroll views.
'package:flutter/src/widgets/scroll_controller.dart':
Failed assertion: line 111 pos 12: '_positions.length == 1'

И я не понимаю, почему, если у меня нет этого pageController, используемого в любом другом дополнительном виджете

1 Ответ

0 голосов
/ 11 июля 2020

PageController уже является ChangeNotifier, нет необходимости заключать его в другой класс ChangeNotifier, почему бы не попробовать создать его и передать в значение ChangeNotifierProvider.value?

  class MyApp extends StatelessWidget {
  PageController _pageController = PageController();

  @override
  Widget build(BuildContext context) {
    return ProviderBloc(
        child: ChangeNotifierProvider.value(
       value: _pageController,
       child: MaterialApp(
       ...*rest of the code*

На домашней странице

class HomePage extends StatelessWidget {
PageController pageController;
  @override
  Widget build(BuildContext context) {
    pageController = Provider.of<PageController>(context, listen: false);

    return Scaffold(
                resizeToAvoidBottomInset : true,        
                resizeToAvoidBottomPadding: false,
                body: PageView(
                  controller: pageController,      
                  children: <Widget>[
                    Container(),
                    Container(),
                    Container(),

                  ],
                ),
                floatingActionButton: FloatingActionButton(
                    child: Icon(
                        Icons.search,
                      ),
                      onPressed: (){
                                pageController.animateToPage(0, duration: Duration(milliseconds: 1), curve: Curves.easeOut );
    
                      }
                  ),
       ...*rest of the code*
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...