Flutter中Column组件命名冲突问题求助
问题描述
名称'Column'在库'package:flutter/src/widgets/basic.dart'和'package:googleapis/analytics/v3.dart'中都有定义。
- Flutter新手,开发读取Google Drive文件的应用,此前运行正常,使用Column组件时出现命名冲突,改用Row组件可正常运行。
- 检查googleapis包未找到名为Column的类,相关代码如下:
import 'dart:math'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; //import 'package:flutterdrive/googleDrive.dart'; import 'dart:async'; import 'dart:json' show json; import 'dart:io'; import 'package:firebase_core/firebase_core.dart'; import 'package:googleapis/analytics/v3.dart'; import "package:http/http.dart" as http; import 'package:google_sign_in/google_sign_in.dart'; import 'package:googleapis/drive/v3.dart' as drive; import 'package:firebase_auth/firebase_auth.dart'; //import 'package:firebase_auth/firebase_auth.dart'; import 'package:csv/csv.dart'; import 'dart:convert'; import 'package:path_provider/path_provider.dart'; import 'dart:core'; GoogleSignIn _googleSignIn = GoogleSignIn( scopes: <String>[ 'email', 'https://www.googleapis.com/auth/drive.readonly', ], ); void main() { runApp( MaterialApp( title: 'Google Sign In', debugShowCheckedModeBanner: false, home: SignInDemo(), ), ); } class SignInDemo extends StatefulWidget { @override State createState() => SignInDemoState(); } class AuthClient extends http.BaseClient { final http.Client _baseClient; final Map<String, String> _headers; AuthClient(this._baseClient, this._headers); @override Future<http.StreamedResponse> send(http.BaseRequest request) { request.headers.addAll(_headers); return _baseClient.send(request); } } class SignInDemoState extends State<SignInDemo> { GoogleSignInAccount? _currentUser; List<drive.File> _documents = []; List<String?> fileIDs = []; List<List<dynamic>> csvTables = []; @override void initState() { super.initState(); _googleSignIn.onCurrentUserChanged.listen((GoogleSignInAccount? account) { setState(() { _currentUser = account; }); if (_currentUser != null) { _getDocuments(); } }); _googleSignIn.signInSilently(); } void _getDocuments() async { print('executing'); final client = http.Client(); var header = await _currentUser?.authHeaders; var authClient = AuthClient(client, header!); var api = drive.DriveApi(authClient); String? url, id; var pageToken = null; _documents.clear(); do { var fileList = await api.files.list( q: "name contains 'DATA1.csv'", pageSize: 20, pageToken: pageToken, supportsAllDrives: true, spaces: "drive", $fields: "nextPageToken, files(id, name, mimeType, thumbnailLink)"); pageToken = fileList.nextPageToken; print('paju'); _documents.addAll(fileList.files!); print(_documents.length); for(var i in _documents){ print(i.id ?? ''); print(i.name ?? ''); } } while (pageToken != null); setState(() {}); } Future<void> _handleSignIn() async { try { await _googleSignIn.signIn(); } catch (error) { print(error); } } Future<void> _handleSignOut() => _googleSignIn.disconnect(); Widget _buildBody() { return Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: <Widget>[ ListTile( leading: GoogleUserCircleAvatar( identity: _currentUser!, ), title: Text(_currentUser!.displayName ?? ''), subtitle: Text(_currentUser!.email ?? ''), ), const Text("Signed in successfully."), ElevatedButton( child: const Text('Get documents'), onPressed: _getDocuments, ), ElevatedButton( child: const Text('SIGN Out'), onPressed: _handleSignOut, ) ], ); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('Google Sign In'), ), body: ConstrainedBox( constraints: const BoxConstraints.expand(), child: _buildBody(), )); } }
解决办法
问题出在你导入的package:googleapis/analytics/v3.dart库,这个库内部包含了一个用于Analytics数据的Column实体类,和Flutter Material库中的Column布局组件重名,导致命名冲突。
有两种简单的解决方式:
给Material库加别名区分
修改Material库的导入语句,添加别名:import 'package:flutter/material.dart' as material;之后使用Flutter的Column组件时,通过别名调用:
return material.Column( mainAxisAlignment: MainAxisAlignment.spaceAround, // ...其他参数 );移除无用的Analytics库导入
你的代码只用到了Google Drive API,完全不需要Analytics相关的功能,直接删除这行导入即可:// import 'package:googleapis/analytics/v3.dart';这种方式更简洁,也是优先推荐的方案。
内容的提问来源于stack exchange,提问作者Leonardo Contreras
相关产品推荐
相关产品推荐

