Я недавно начал работать с флаттером, и я не уверен, правильно ли я формулирую этот вопрос, любая помощь может помочь.
Я получаю некоторые данные из 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),
),
);
}
},
),
),
),
],
),
),
],
),
),
),
),
);
}
}