在 Flutter 中创建的移动应用程序屏幕变成灰色

问题描述 投票:0回答:1

首先解释一下,图片和源代码中之所以显示日语是因为我是日本开发者。

在模拟器中,图标显示如第一张图片所示,但是当我在实际设备上安装应用程序(通过 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 flutter widget
1个回答
0
投票

由于我认为您正在 IOS 设备上测试应用程序,因此错误可能是由于以下几点造成的:

  1. 通常,生产中的灰屏是由于代码中的错误造成的(例如在调试中出现红色边框时),因此,如果您遇到任何未注意到的错误,我建议您查看调试控制台。

  2. 另一个近似可能是 IOS 中的图像存在一些权限问题,因为默认情况下在 ios 中调试时,它通常会激活多个权限才能轻松开发,但您必须将它们添加到 IOS info.plist 文件中

© www.soinside.com 2019 - 2024. All rights reserved.