Flutter, Ошибка при переходе между страницами. «Поиск предка деактивированного виджета небезопасен». - PullRequest
0 голосов
/ 10 июля 2020

Я недавно начал работать с флаттером, и я не уверен, правильно ли я формулирую этот вопрос, любая помощь может помочь.

Я получаю некоторые данные из API и отображаю их на страница. И у меня есть несколько ссылок на одной странице. Поэтому, когда я пытаюсь открыть ссылку со страницы, она открывается на странице. Но когда я снова нажимаю и пытаюсь открыть другую ссылку с домашней страницы, я получаю эту ошибку.

The following assertion was thrown while handling a gesture:
Looking up a deactivated widget's ancestor is unsafe.

At this point the state of the widget's element tree is no longer stable.

To safely refer to a widget's ancestor in its dispose() method, save a reference to the ancestor by calling dependOnInheritedWidgetOfExactType() in the widget's didChangeDependencies() method.

When the exception was thrown, this was the stack: 
#0      Element._debugCheckStateIsActiveForAncestorLookup.<anonymous closure> (package:flutter/src/widgets/framework.dart:3790:9)
#1      _Closure.call (dart:core-patch/function.dart)
#2      Element._debugCheckStateIsActiveForAncestorLookup (package:flutter/src/widgets/framework.dart:3804:6)
#3      Element.findAncestorStateOfType (package:flutter/src/widgets/framework.dart:3923:12)
#4      Navigator.of (package:flutter/src/widgets/navigator.dart:2136:19)
...
Handler: "onTap"
Recognizer: TapGestureRecognizer#ba254
  state: ready
  won arena
  finalPosition: Offset(95.0, 627.0)
  finalLocalPosition: Offset(75.0, 2.0)
  button: 1
  sent tap down

вот код страницы, которую я использую для отображения данных пользовательского интерфейса. Gif, показывающий, что происходит

class ContentPage extends StatefulWidget {
  @override
  _ContentPageState createState() => _ContentPageState();
}

class _ContentPageState extends State<ContentPage> {
  String content = '';

  final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();

  void getData() async {
    String pageId = Provider.of<PageProvider>(context, listen: false).selectedPage;
    final searchProvider = Provider.of<SearchProvider>(context, listen: false);
    if (searchProvider.isConnected) {
      String data = await Provider.of<PageProvider>(context, listen: false).getPageData(pageId);
      setState(() {
        content = data;
      });
    } else {
      final offlineDataProvider = Provider.of<OfflineDataProvider>(context, listen: false);
      String data = await offlineDataProvider.readFromFile(pageId);
      setState(() {
        content = data;
      });
    }
  }

  @override
  void initState() {
    Future.delayed(Duration.zero, () {
      getData();
    });
    super.initState();
  }

  @override
  void dispose() {
    // TODO: implement dispose
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    final indexProvider = Provider.of<IndexProvider>(context);
    final pageProvider = Provider.of<PageProvider>(context);
    final searchProvider = Provider.of<SearchProvider>(context);
    final offlineProvider = Provider.of<OfflineDataProvider>(context);
    final isLoading = Provider.of<PageProvider>(context).loading;
    String title = '';
    if (searchProvider.isConnected) {
      title = pageProvider.selectedPageTitle;
    } else {
      indexProvider.indexes = offlineProvider.offlineIndexList;
      title = offlineProvider.returnIndexTitle(pageProvider.selectedPage);
    }
    return WillPopScope(
      onWillPop: () async => false,
      child: Scaffold(
        key: _scaffoldKey,
        appBar: ContentAppBar(),]
        body: ModalProgressHUD(
          inAsyncCall: searchProvider.isConnected ? isLoading : false,
          child: Container(
            padding: EdgeInsets.symmetric(
              horizontal: 20,
              vertical: 0,
            ),
            child: Column(
              mainAxisAlignment: MainAxisAlignment.start,
              children: [
                Expanded(
                  flex: 12,
                  child: Column(
                    children: [
                      title != ''
                          ? Container(
                              color: Color(0xFF3e559f),
                              padding: EdgeInsets.symmetric(
                                vertical: 10,
                                horizontal: 20,
                              ),
                              width: MediaQuery.of(context).size.width,
                              child: Text(
                                title,
                                style: TextStyle(
                                  color: Colors.white,
                                  fontWeight: FontWeight.w500,
                                  fontSize: 16,
                                ),
                                textAlign: TextAlign.left,
                              ),
                            )
                          : Container(),
                      SizedBox(height: 10),
                      Expanded(
                        child: SingleChildScrollView(
                          child: HtmlWidget(
                            content,
                            onTapUrl: (url) {
                              if (url.contains('api')) {
                                int index = url.lastIndexOf('/');
                                String pageID = url.substring(index + 1);
                                pageProvider.selectedPage = pageID;
                                Navigator.pushNamed(context, 'content');
                              } else {
                                Navigator.push(
                                  context,
                                  MaterialPageRoute(
                                    builder: (context) => WebPage(url),
                                  ),
                                );
                              }
                            },
                          ),
                        ),
                      ),
                    ],
                  ),
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...