Flutter未定义名称报错及语法符号使用规则相关问题求助
Flutter代码报错问题解答
第一版代码错误原因
- 私有变量访问错误:
_biggerFont、_suggestions都是定义在_RandomWordsState类里的私有属性(下划线开头),你把_buildRow、_buildSuggestions方法写在了RandomWordsWidget类里,State类的私有属性父Widget类无法访问,自然报未定义错误。 - 无用变量告警:
MyApp里定义的wordPair没有被使用,_RandomWordsState的build方法里定义的wordPair也没有被后续逻辑调用,所以触发无用变量告警。 - 方法未调用告警:
_buildSuggestions仅完成了定义,没有在build方法中被调用,所以触发未引用告警。
第二版代码错误原因
全部为语法结构类错误,核心是括号不匹配、类定义顺序错误:
- 类定义嵌套错误:
_RandomWordsState类的结尾缺少闭合},导致后面的RandomWords类被识别为_RandomWordsState的内部类,MyApp中自然无法调用顶层的RandomWords类。 - 组件参数归属错误:
appBar和body是Scaffold的专属参数,你直接写到了MaterialApp的构造参数里,所以报参数不存在错误。 - 括号不匹配:
MyApp的build方法中,MaterialApp闭合的);后面多了多余的),同时缺少语句结束符;,直接触发语法错误。 - 状态变量位置错误:
_suggestions、_biggerFont是随State生命周期变化的属性,写在RandomWordsWidget类里不符合StatefulWidget的规范,需要移到State类中。
括号使用规则
):用于闭合单个(包裹的内容,比如方法参数列表void func(int a)、Widget构造参数Text('测试内容'),每写一个(就要对应一个)完成闭合。);:当(包裹的是一个表达式/语句时,闭合)后需要加语句结束符;,比如变量定义final text = Text('测试内容');、return语句return Scaffold();。}:用于闭合单个{包裹的代码块,比如类定义class A { ... }、方法体void build() { ... }、判断/循环逻辑块if(true) { ... },每写一个{就要对应一个}完成闭合。
小技巧:写代码时每打一个开括号,立刻补写对应的闭括号,再往中间填充内容,大部分编辑器也会高亮显示配对的括号,不匹配时会自动标红提示。
修正后可运行代码
import 'package:english_words/english_words.dart'; import 'package:flutter/material.dart'; void main() => runApp(const MyApp()); class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( title: 'Startup Name Generator', home: Scaffold( appBar: AppBar( title: const Text('Welcome to Flutter'), ), body: const Center( child: RandomWords(), ), ), ); } } class RandomWords extends StatefulWidget { const RandomWords({super.key}); @override _RandomWordsState createState() => _RandomWordsState(); } class _RandomWordsState extends State<RandomWords> { final _suggestions = <WordPair>[]; final _biggerFont = const TextStyle(fontSize: 50.0); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('Startup Name Generator'), ), body: _buildSuggestions(), ); } Widget _buildRow(WordPair pair) { return ListTile( title: Text( pair.asPascalCase, style: _biggerFont, ), ); } Widget _buildSuggestions() { return ListView.builder( padding: const EdgeInsets.all(16.0), itemBuilder: (context, i) { if (i.isOdd) return const Divider(); final index = i ~/ 2; if (index >= _suggestions.length) { _suggestions.addAll(generateWordPairs().take(10)); } return _buildRow(_suggestions[index]); }); } }
内容的提问来源于stack exchange,提问作者MMMMMM
相关产品推荐
相关产品推荐

