Как мы можем запустить url-адрес из нижней панели навигации во флаттере
Я добавил нижнюю панель навигации, используя пакет 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 ответа
В _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;
});
}
},
Проблема в том, что он открывает url
. Но по-прежнему нуженWidget
чтобы сдержать это. ТвойbottomNavigationBar
ожидает страницу из.
Решение: завернитеurl_launcher
внутри твоего Container()
, а также не забудьте установить forceWebView: true
внутри тебя _urlLauncher()
.
Теперь давайте перейдем к коду и посмотрим, как этого добиться.
final List<Widget> _children = [
HomePage(),
Contact(),
Container()
];
И тебе будет хорошо. Кроме того, сейчас делаем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();
});
}