У меня была еще одна проблема до использования пакета «Provider» с пакетом «PersistentBottomNavBar» в моем приложении флаттера. Поэтому, решив эту проблему, я сразу же получил другую. Есть мой исходный код. Когда я запускаю этот код, мой эмулятор Android падает. Со следующим сообщением об ошибке: Метод «карта» был вызван при нулевом значении. Получатель: ноль. Пробовал вызывать: map(Closure: (PersistentBottomNavBarItem) => Flexible)
import 'package:flutter/cupertino.dart';
import 'package:flutter/services.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:persistent_bottom_nav_bar/persistent-tab-view.dart';
import './screens/products_list_screen.dart';
import './screens/add_product_screen.dart';
import './screens/profile_screen.dart';
import './providers/products.dart';
void main() {
WidgetsFlutterBinding.ensureInitialized();
SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown,
]);
runApp(
MultiProvider(
providers: [
ChangeNotifierProvider(
create: (_) => Products(),
),
],
child: MaterialApp(
title: 'Sample App',
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.blueGrey,
accentColor: Colors.grey[700],
),
home: MyApp(),
),
),
);
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
PersistentTabController _tabController =
PersistentTabController(initialIndex: 0);
bool _hideNavBar = false;
@override
void dispose() {
// TODO: implement dispose
super.dispose();
_tabController.dispose();
}
List<Widget> _buildScreens() {
return [ProductsListScreen(), AddProductScreen(), ProfileScreen()];
}
List<PersistentBottomNavBarItem> _navBarItems() {
return [
PersistentBottomNavBarItem(
icon: Icon(CupertinoIcons.list_bullet),
title: 'Products',
activeColor: CupertinoColors.activeBlue,
inactiveColor: CupertinoColors.systemGrey,
),
PersistentBottomNavBarItem(
icon: Icon(CupertinoIcons.add),
title: 'Add',
activeColor: CupertinoColors.activeBlue,
inactiveColor: CupertinoColors.systemGrey,
),
PersistentBottomNavBarItem(
icon: Icon(CupertinoIcons.profile_circled),
title: 'Profile',
activeColor: CupertinoColors.activeBlue,
inactiveColor: CupertinoColors.systemGrey,
),
];
}
@override
Widget build(BuildContext context) {
return PersistentTabView(
context,
controller: _tabController,
screens: _buildScreens(),
items: _navBarItems(),
);
}
}
В моем эмуляторе Android есть ошибка:
И ошибка консоли отладки в моем VCode:
Похоже, проблема в том, что вы не передаете navBarStyle в PersistentTabView. Существуют различные стили NavBarStyle для выбора, и каждый из них имеет другие значения, которые им требуются. Пожалуйста, обратитесь к документации «persist_bottom_nav_bar» для получения дополнительной информации. Пожалуйста, внесите следующие изменения в свой код и проверьте. Примечание NavBarStyle.style7 может быть не тем navBarStyle, который вы искали, поэтому попробуйте другие.
.....
return Scaffold(
body: PersistentTabView(
context,
controller: _tabController,
screens: _buildScreens(),
items: _navBarsItems(),
navBarStyle: NavBarStyle.style7,
),
....