Кто-то мог быть в подобном случае.
Я использую 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, используемого в любом другом дополнительном виджете