我的目标是制作一个WebView
应用程序,其中有几个CupertinoTabViews
在单击每个BottomNavigationBarItem
时会CupertinoTabScaffold
显示不同WebView
的包含小部件;pageA
和pageB
。
随着应用程序的启动,第一个 WebView 成功显示了初始 URL 网页。但是,当单击另一个 Tab 按钮(试图显示另一个 WebView)时,会抛出未处理的异常:错误状态:未来已完成。
主要.dart
class _MyHomePageState extends State<MyHomePage> {
int _currentTabIndex = 0;
PageWeb pageA;
PageWeb pageB;
@override
void initState() {
super.initState();
pageA = new PageWeb(this, ObjectKey(0), "A");
pageB = new PageWeb(this, ObjectKey(1), "B");
}
@override
Widget build(BuildContext context) {
final Widget scaffold = CupertinoTabScaffold(
tabBar: CupertinoTabBar(
currentIndex: _currentTabIndex,
items: const <BottomNavigationBarItem>[
BottomNavigationBarItem(
icon: Icon(Icons.home), title: Text('A')),
BottomNavigationBarItem(
icon: Icon(Icons.photo), title: Text('B')),
],
),
tabBuilder: (context, index) {
CupertinoTabView returnValue;
switch (index) {
case 0:
returnValue = CupertinoTabView(
builder: (context) {
return pageA;
},
);
break;
case 1:
returnValue = CupertinoTabView(
builder: (context) {
return pageB;
},
);
break;
}
return returnValue;
},
);
return scaffold;
}
}
pageweb.dart(PageWeb 类)
final Completer<WebViewController> _controller = Completer<WebViewController>();
class PageWeb extends StatefulWidget {
final delegate;
final ObjectKey key;
final String navTitle;
PageWeb(this.delegate, this.key, this.navTitle);
@override
_PageWebState createState() {
return _PageWebState();
}
}
class _PageWebState extends State<PageWeb> {
bool _isLoading = true;
final cookieManager = WebviewCookieManager();
@override
Widget build(BuildContext context) {
return CupertinoPageScaffold(
navigationBar: CupertinoNavigationBar(
middle: Text(widget.navTitle),
),
child: SafeArea(
child: Container(
child: new WebView(
key: widget.key,
initialUrl: "https://www.google.com/search?q=${widget.navTitle}",
javascriptMode: JavascriptMode.unrestricted,
onWebViewCreated: (WebViewController webViewController) {
_controller.complete(webViewController);
// Here is the error occurring part.
},
onPageStarted: (String pageUrl) {
setState(() {
_isLoading = true;
});
},
onPageFinished: (String pageUrl) {
setState(() {
_isLoading = false;
});
},
))));
}
}
Unhandled Exception: Bad state: Future already completed错误位于以下行:
_controller.complete(webViewController);