首先解释一下,图片和源代码中之所以显示日语是因为我是日本开发者。
在模拟器中,图标显示如第一张图片所示,但是当我在实际设备上安装应用程序(通过 TestFlight)时,屏幕变成灰色,如第二张图片所示。
相关源码如下:
class HomePage extends StatefulWidget {
final Region selectedRegion;
final void Function(bool) onOffensiveFilterChanged;
const HomePage({
Key? key,
required this.selectedRegion,
required this.onOffensiveFilterChanged,
}) : super(key: key);
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
int _selectedIndex = 0;
late Region _selectedRegion;
bool _isFiltered = false;
bool _isOffensiveFiltered = false;
late BannerAd _bannerAd;
void _onOffensiveFilterChanged(bool value) {
setState(() {
_isOffensiveFiltered = value;
});
}
final List<String> _categoryList = [
'成人',
'ギャンブル',
];
@override
void initState() {
super.initState();
_selectedRegion = widget.selectedRegion;
_loadFilterState();
_initBannerAd();
}
@override
void dispose() {
_bannerAd.dispose();
super.dispose();
}
void _initBannerAd() {
_bannerAd = AdMobService.createBannerAd()..load();
}
void _onItemTapped(int index) {
setState(() {
_selectedIndex = index;
});
}
void _onRegionChanged(Region newRegion) {
setState(() {
_selectedRegion = newRegion;
});
}
void _onFilterChanged(bool value) {
setState(() {
_isFiltered = value;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: _selectedIndex == 0
? AppBar(
title: Text(
'${_selectedRegion.name}新着掲示板',
style: TextStyle(
fontFamily: 'Roboto',
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
elevation: 0,
backgroundColor: Colors.blue,
)
: null,
body: _selectedIndex == 0
? SingleChildScrollView(
child: Column(
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: GridView.count(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
crossAxisCount: 4,
children: [
IconTile(
title: 'ニュース速報',
icon: Image.asset('assets/icon/newsflash.jpeg'),
destination: NewsflashSubCategoryPage(
region: _selectedRegion,
),
isFiltered: _isFiltered,
),
IconTile(
title: 'ニュース',
icon: Image.asset('assets/icon/news.png'),
destination: NewsSubCategoryPage(
region: _selectedRegion,
),
isFiltered: _isFiltered,
),
IconTile(
title: '政治・経済',
icon: Image.asset('assets/icon/politics.jpeg'),
destination: PoliticseconomySubcategoryPage(
region: _selectedRegion,
),
isFiltered: _isFiltered,
),
IconTile(
title: '災害',
icon: Image.asset('assets/icon/news.png'),
destination: DisasterSubCategoryPage(
region: _selectedRegion,
),
isFiltered: _isFiltered,
),
IconTile(
title: 'スポーツ',
icon: Image.asset('assets/icon/news.png'),
destination: SportsSubCategoryPage(
region: _selectedRegion,
),
isFiltered: _isFiltered,
),
IconTile(
title: '雑談',
icon: Image.asset('assets/icon/news.png'),
destination: ChatSubCategoryPage(
region: _selectedRegion,
),
isFiltered: _isFiltered,
),
IconTile(
title: 'グルメ・飲食',
icon: Image.asset('assets/icon/news.png'),
destination: FoodSubCategoryPage(
region: _selectedRegion,
),
isFiltered: _isFiltered,
),
IconTile(
title: 'サークル',
icon: Image.asset('assets/icon/news.png'),
destination: CircleSubCategoryPage(
region: _selectedRegion,
),
isFiltered: _isFiltered,
),
IconTile(
title: 'ママ・育児',
icon: Image.asset('assets/icon/news.png'),
destination: ParentingSubCategoryPage(
region: _selectedRegion,
),
isFiltered: _isFiltered,
),
IconTile(
title: 'ペット',
icon: Image.asset('assets/icon/news.png'),
destination: PetSubCategoryPage(
region: _selectedRegion,
),
isFiltered: _isFiltered,
),
IconTile(
title: '釣り・漁',
icon: Image.asset('assets/icon/news.png'),
destination: FishingSubCategoryPage(
region: _selectedRegion,
),
isFiltered: _isFiltered,
),
IconTile(
title: '祭・レジャー',
icon: Image.asset('assets/icon/news.png'),
destination: FestivalleisureSubCategoryPage(
region: _selectedRegion,
),
isFiltered: _isFiltered,
),
IconTile(
title: 'サロン',
icon: Image.asset('assets/icon/news.png'),
destination: BeautysalonSubcategoryPage(
region: _selectedRegion,
),
isFiltered: _isFiltered,
),
IconTile(
title: '美容',
icon: Image.asset('assets/icon/news.png'),
destination: BeautytipsSubCategoryPage(
region: _selectedRegion,
),
isFiltered: _isFiltered,
),
IconTile(
title: '恋愛',
icon: Image.asset('assets/icon/news.png'),
destination: LoveSubCategoryPage(
region: _selectedRegion,
),
isFiltered: _isFiltered,
),
IconTile(
title: '芸能',
icon: Image.asset('assets/icon/news.png'),
destination: EntertainmentSubCategoryPage(
region: _selectedRegion,
),
isFiltered: _isFiltered,
),
IconTile(
title: 'アイドル',
icon: Image.asset('assets/icon/news.png'),
destination: IdolSubCategoryPage(
region: _selectedRegion,
),
isFiltered: _isFiltered,
),
IconTile(
title: '病院・病気',
icon: Image.asset('assets/icon/news.png'),
destination: HealthwelfareSubCategoryPage(
region: _selectedRegion,
),
isFiltered: _isFiltered,
),
IconTile(
title: 'その他',
icon: Image.asset('assets/icon/news.png'),
destination: OtherSubCategoryPage(
region: _selectedRegion,
),
isFiltered: _isFiltered,
),
],
),
),
const SizedBox(height: 16.0),
const Text(
'成人向けカテゴリ',
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: GridView.count(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
crossAxisCount: 4,
children: List.generate(_categoryList.length, (index) {
if (_categoryList[index] == '成人') {
return IconTile(
title: _categoryList[index],
icon: Image.asset('assets/icon/news.png'),
destination: AdultSubcategoryPage(
region: _selectedRegion,
),
isFiltered: _isFiltered,
);
} else if (_categoryList[index] == 'ギャンブル') {
return IconTile(
title: _categoryList[index],
icon: Image.asset('assets/icon/news.png'),
destination: GamblingCategoryPage(
region: _selectedRegion,
),
isFiltered: _isFiltered,
);
} else {
return IconTile(
title: _categoryList[index],
icon: Image.asset('assets/icon/news.png'),
destination: OtherPage(
region: _selectedRegion,
),
isFiltered: _isFiltered,
);
}
}),
),
),
SizedBox(
height: 50,
child: AdWidget(ad: _bannerAd),
),
],
),
)
: MyPage(
initialRegion: _selectedRegion,
onRegionChanged: _onRegionChanged,
onFilterChanged: _onFilterChanged,
onOffensiveFilterChanged: _onOffensiveFilterChanged,
),
bottomNavigationBar: BottomNavigationBar(
items: const <BottomNavigationBarItem>[
BottomNavigationBarItem(
icon: Icon(Icons.home),
label: 'ホーム',
),
BottomNavigationBarItem(
icon: Icon(Icons.person),
label: 'マイページ',
),
],
currentIndex: _selectedIndex,
onTap: _onItemTapped,
selectedItemColor: Colors.blueGrey, // 選択されているアイテムの色を青色に設定
unselectedItemColor: Colors.grey,
),
);
}
Future<void> _loadFilterState() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
setState(() {
_isFiltered = prefs.getBool('isFiltered') ?? false;
});
}
Future<void> _loadOffensiveFilterState() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
setState(() {
_isOffensiveFiltered = prefs.getBool('isOffensiveFiltered') ?? false;
});
}
}
如果有人知道原因,请帮助我。
由于我认为您正在 IOS 设备上测试应用程序,因此错误可能是由于以下几点造成的:
通常,生产中的灰屏是由于代码中的错误造成的(例如在调试中出现红色边框时),因此,如果您遇到任何未注意到的错误,我建议您查看调试控制台。
另一个近似可能是 IOS 中的图像存在一些权限问题,因为默认情况下在 ios 中调试时,它通常会激活多个权限才能轻松开发,但您必须将它们添加到 IOS info.plist 文件中