我正在使用uni_links从其他应用程序获取深层链接,并尝试使用flutter_web_browser在应用程序中打开url,但是当我通过Deeplink打开应用程序时,它不会打开url而是抛出错误名为“ dependOnInheritedWidgetOfExactType <_InheritedTheme>()或DependOnInheritedElement()在_HomeState.initState()完成之前被调用。” 以下是我的 main.dart 和 homepage.dart
main.dart
import 'package:flutter/material.dart';
import 'home_widget.dart';
void main(){
runApp(new MaterialApp(
debugShowCheckedModeBanner: false,
title: 'title',
theme: ThemeData(
// Define the default Brightness and Colors
brightness: Brightness.light,
primaryColor: Colors.deepOrange[800],
accentColor: Colors.orange[600],
),
home: Home(),
));
}
Homepage.dart
class Home extends StatefulWidget {
const Home({
Key key,
}) : super(key: key);
@override
State<StatefulWidget> createState() {
return _HomeState();
}
}
class _HomeState extends State<Home> {
String _latestLink = 'Unknown';
Uri _latestUri;
StreamSubscription _sub;
UniLinksType _type = UniLinksType.string;
@override
void initState(){
super.initState();
initPlatformState();
}
initPlatformState() async {
if (_type == UniLinksType.string) {
await initPlatformStateForStringUniLinks();
} else {
await initPlatformStateForUriUniLinks();
}
}
initPlatformStateForStringUniLinks() async {
// Attach a listener to the links stream
_sub = getLinksStream().listen((String link) {
if (!mounted) return;
setState(() {
_latestLink = link ?? 'Unknown';
_latestUri = null;
try {
if (link != null) _latestUri = Uri.parse(link);
} on FormatException {}
});
}, onError: (err) {
if (!mounted) return;
setState(() {
_latestLink = 'Failed to get latest link: $err.';
_latestUri = null;
});
});
// Attach a second listener to the stream
getLinksStream().listen((String link) {
print('got link: $link');
// launchURL(link);
}, onError: (err) {
print('got err: $err');
});
// Get the latest link
String initialLink;
Uri initialUri;
launchURL(initialLink);
// Platform messages may fail, so we use a try/catch PlatformException.
try {
initialLink = await getInitialLink();
if (initialLink != null) initialUri = Uri.parse(initialLink);
print('initial link: $initialLink');
} on PlatformException {
initialLink = 'Failed to get initial link.';
initialUri = null;
print(initialLink);
} on FormatException {
initialLink = 'Failed to parse the initial link as Uri.';
initialUri = null;
print(initialLink);
}
// If the widget was removed from the tree while the asynchronous platform
// message was in flight, we want to discard the reply rather than calling
// setState to update our non-existent appearance.
if (!mounted) return;
setState(() {
_latestLink = initialLink;
_latestUri = initialUri;
});
}
initPlatformStateForUriUniLinks() async {
// Attach a listener to the Uri links stream
_sub = getUriLinksStream().listen((Uri uri) {
if (!mounted) return;
setState(() {
_latestUri = uri;
_latestLink = uri?.toString() ?? 'Unknown';
});
}, onError: (err) {
if (!mounted) return;
setState(() {
_latestUri = null;
_latestLink = 'Failed to get latest link: $err.';
});
});
// Attach a second listener to the stream
getUriLinksStream().listen((Uri uri) {
print('got uri: ${uri?.path} ${uri?.queryParametersAll}');
}, onError: (err) {
print('got err: $err');
});
// Get the latest Uri
Uri initialUri;
String initialLink;
// Platform messages may fail, so we use a try/catch PlatformException.
try {
initialUri = await getInitialUri();
print('initial uri: ${initialUri?.path}'
' ${initialUri?.queryParametersAll}');
initialLink = initialUri?.toString();
} on PlatformException {
initialUri = null;
initialLink = 'Failed to get initial uri.';
} on FormatException {
initialUri = null;
initialLink = 'Bad parse the initial link as Uri.';
}
// If the widget was removed from the tree while the asynchronous platform
// message was in flight, we want to discard the reply rather than calling
// setState to update our non-existent appearance.
if (!mounted) return;
setState(() {
_latestUri = initialUri;
print("latestUri : $_latestUri");
_latestLink = initialLink;
print("latestLink: $_latestLink");
});
}
launchURL(link) async {
await FlutterWebBrowser.openWebPage(url: link,androidToolbarColor: Theme.of(context).primaryColor);
}
@override
Widget build(BuildContext context){
return Scaffold(...)
}
@override
void dispose() {
// _bannerAd?.dispose();
super.dispose();
}