Как мы можем запустить url-адрес из нижней панели навигации во флаттере - PullRequest
0 голосов
/ 06 августа 2020

Я добавил нижнюю панель навигации, используя пакет CubertoBottomBar. Я хочу запустить новый URL-адрес в другом браузере с помощью пакета url_launcher, когда я реализую то же самое, он выдает мне ошибку, так как тип «Future» не является подтипом типа «Widget», пожалуйста, помогите мне исправить проблему.

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _currentIndex = 0;
  Color inactiveColor = Colors.white;
  String currentTitle = "Home";
  Color currentColor = Colors.white;

  final List<Widget> _children = [
    HomePage(),
    Contact(),
    _urlLauncher()
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: _children[_currentIndex],
      bottomNavigationBar: CubertoBottomBar(
        barBackgroundColor: Colors.orange,
        inactiveIconColor: inactiveColor,
        tabStyle: CubertoTabStyle.STYLE_FADED_BACKGROUND,
        selectedTab: _currentIndex,
        tabs: [
          TabData(iconData: Icons.home, title: "Home", tabColor: Colors.white),
          TabData(iconData: Icons.phone, title: "Contact", tabColor: Colors.white),
          TabData(iconData: Icons.person_outline, title: "Register", tabColor: Colors.white),
        ],
        onTabChangedListener: (position, title, color) {
          setState(() {
            _currentIndex = position;
            currentTitle = title;
            currentColor = color;
          });
        },
      ),
    );
  }
  void onTabTapped(int index) {
    setState(() {
      _currentIndex = index;
    });
  }

  static _urlLauncher() async{
    const url = 'https://flutter.dev';
    if (await canLaunch(url)) {
      await launch(url);
    } else {
      throw 'Could not launch $url';
    }
  }
}

Ответы [ 2 ]

1 голос
/ 06 августа 2020

_urlLauncher() - это будущее, поэтому вы не можете добавить его в список виджетов List<Widget> или отобразить его как виджет

final List<Widget> _children = [
    HomePage(),
    Contact(),
    _urlLauncher()
  ];

Вместо этого вы можете сделать это:

Измените _urlLauncher() в списке виджетов на Container, затем вызовите функцию в onTabChangedListener:, как это

final List<Widget> _children = [
    HomePage(),
    Contact(),
    Container()
  ];
onTabChangedListener: (position, title, color) {
   if(position == 2){
     _urlLauncher(); // open in browser if the position is 2
   }else{
     setState(() {
       _currentIndex = position;
       currentTitle = title;
       currentColor = color;
     });
  }   
},
0 голосов
/ 06 августа 2020

Проблема в том, что он открывает url. Но по-прежнему требуется Widget, чтобы содержать его. Ваш bottomNavigationBar ожидает страницу из.

Решение: Оберните url_launcher внутри Container(), а также не забудьте установить forceWebView: true внутри себя _urlLauncher().

Теперь давайте перейдем к коду и посмотрим, как мы можем этого добиться

final List<Widget> _children = [
    HomePage(),
    Contact(),
    Container()
];

И вам будет хорошо go. Кроме того, теперь выполняем forceWebView

static _urlLauncher() async{
    const url = 'https://flutter.dev';
    if (await canLaunch(url)) {
      await launch(url, forceWebView: true);
    } else {
      throw 'Could not launch $url';
    }
  }

И пусть onTabTapped() знает, что при нажатии позиции 2 мы должны вызвать метод _urlLauncher()

void onTabTapped(int index) {
    setState(() {
      _currentIndex = index;

      // here you do the thing
      if (_currentIndex == 2) _urlLauncher();
    });
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...