在flutter中使用uni_links时如何导航到特定页面

时间:2020-03-03 09:58:10

标签: flutter deep-linking

我正在使用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();
  }

0 个答案:

没有答案